@agimon-ai/po 0.0.0-alpha.2 → 0.0.0-alpha.21
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 +14 -11
- package/dist/antigravity.mjs +1 -2
- package/dist/baseCommand.mjs +1 -2
- package/dist/bin/cli.cjs +37 -14
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +34 -14
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/{doomRunner.cjs → poRunner.cjs} +5 -5
- package/dist/bin/poRunner.cjs.map +1 -0
- package/dist/bin/{doomRunner.d.mts → poRunner.d.mts} +2 -2
- package/dist/bin/poRunner.d.mts.map +1 -0
- package/dist/bin/{doomRunner.mjs → poRunner.mjs} +5 -5
- package/dist/bin/poRunner.mjs.map +1 -0
- package/dist/builders/cli/extensionAssembler/index.cjs +14 -12
- package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.d.mts +2 -1
- package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.mjs +14 -12
- package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
- package/dist/catalog/index.json +68 -51
- package/dist/cliApp.mjs +1 -2
- package/dist/codex.mjs +1 -2
- package/dist/compatibilityCommand.mjs +1 -2
- package/dist/compatibilityContext.mjs +1 -2
- package/dist/compatibilityOptions.mjs +1 -2
- package/dist/config.cjs +57 -12
- package/dist/config.d.mts +3 -3
- package/dist/config.mjs +3 -3
- package/dist/doctorCommand.mjs +1 -2
- package/dist/emitMcpCommand.mjs +1 -2
- package/dist/explainCommand.mjs +1 -2
- package/dist/extensions/server.cjs +11 -7
- 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 +12 -8
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/harnessContext.mjs +1 -2
- package/dist/harnessState.cjs +66 -11
- package/dist/harnessState.d.mts +2 -2
- package/dist/harnessState.mjs +1 -2
- package/dist/index.cjs +60 -15
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -3
- package/dist/initCommand.mjs +1 -2
- package/dist/matrixOptions.mjs +1 -2
- package/dist/options.mjs +1 -2
- package/dist/process.mjs +1 -2
- package/dist/projectTrust.cjs +2 -2
- package/dist/projectTrust.d.mts +2 -2
- package/dist/projectTrust.mjs +1 -2
- package/dist/repository.cjs +1 -1
- package/dist/repository.d.mts +2 -2
- package/dist/repository.mjs +1 -2
- package/dist/router.mjs +1 -2
- package/dist/shared.mjs +1 -2
- package/dist/src/bin/agentDirectory.cjs +18 -12
- package/dist/src/bin/agentDirectory.cjs.map +1 -1
- package/dist/src/bin/agentDirectory.mjs +15 -12
- package/dist/src/bin/agentDirectory.mjs.map +1 -1
- package/dist/src/builders/apiContractExport/index.cjs +6 -6
- package/dist/src/builders/apiContractExport/index.cjs.map +1 -1
- package/dist/src/builders/apiContractExport/index.mjs +9 -9
- package/dist/src/builders/apiContractExport/index.mjs.map +1 -1
- package/dist/src/builders/cli/entryResolution.cjs +3 -3
- package/dist/src/builders/cli/entryResolution.cjs.map +1 -1
- package/dist/src/builders/cli/entryResolution.mjs +3 -3
- package/dist/src/builders/cli/entryResolution.mjs.map +1 -1
- package/dist/src/builders/cli/harnessContext.cjs +5 -5
- package/dist/src/builders/cli/harnessContext.cjs.map +1 -1
- package/dist/src/builders/cli/harnessContext.mjs +7 -7
- package/dist/src/builders/cli/harnessContext.mjs.map +1 -1
- package/dist/src/builders/hooks/index.cjs +1 -1
- package/dist/src/builders/hooks/index.cjs.map +1 -1
- package/dist/src/builders/hooks/index.mjs +2 -2
- package/dist/src/builders/hooks/index.mjs.map +1 -1
- package/dist/src/builders/server/backgroundSync.cjs +13 -1
- package/dist/src/builders/server/backgroundSync.cjs.map +1 -1
- package/dist/src/builders/server/backgroundSync.mjs +13 -1
- package/dist/src/builders/server/backgroundSync.mjs.map +1 -1
- package/dist/src/builders/server/bundlerService.cjs +151 -0
- package/dist/src/builders/server/bundlerService.cjs.map +1 -0
- package/dist/src/builders/server/bundlerService.mjs +151 -0
- package/dist/src/builders/server/bundlerService.mjs.map +1 -0
- package/dist/src/builders/server/computerUseBinding.cjs +2 -2
- package/dist/src/builders/server/computerUseBinding.cjs.map +1 -1
- package/dist/src/builders/server/computerUseBinding.mjs +3 -3
- package/dist/src/builders/server/computerUseBinding.mjs.map +1 -1
- package/dist/src/builders/server/defaultWorkspace.cjs +1 -1
- package/dist/src/builders/server/defaultWorkspace.cjs.map +1 -1
- package/dist/src/builders/server/defaultWorkspace.mjs +2 -2
- package/dist/src/builders/server/defaultWorkspace.mjs.map +1 -1
- package/dist/src/builders/server/idleRestart.cjs +3 -3
- package/dist/src/builders/server/idleRestart.cjs.map +1 -1
- package/dist/src/builders/server/idleRestart.mjs +3 -3
- package/dist/src/builders/server/idleRestart.mjs.map +1 -1
- package/dist/src/builders/server/index.cjs +6 -6
- package/dist/src/builders/server/index.cjs.map +1 -1
- package/dist/src/builders/server/index.mjs +6 -6
- package/dist/src/builders/server/index.mjs.map +1 -1
- package/dist/src/builders/server/logSink.cjs +3 -3
- package/dist/src/builders/server/logSink.cjs.map +1 -1
- package/dist/src/builders/server/logSink.mjs +2 -2
- package/dist/src/builders/server/logSink.mjs.map +1 -1
- package/dist/src/builders/server/mcpBundle.cjs.map +1 -1
- package/dist/src/builders/server/mcpBundle.d.mts +2 -2
- package/dist/src/builders/server/mcpBundle.mjs.map +1 -1
- package/dist/src/builders/server/packageUrl.cjs +25 -18
- package/dist/src/builders/server/packageUrl.cjs.map +1 -1
- package/dist/src/builders/server/packageUrl.mjs +25 -18
- package/dist/src/builders/server/packageUrl.mjs.map +1 -1
- package/dist/src/builders/server/runtime.cjs +157 -168
- package/dist/src/builders/server/runtime.cjs.map +1 -1
- package/dist/src/builders/server/runtime.mjs +161 -171
- package/dist/src/builders/server/runtime.mjs.map +1 -1
- package/dist/src/builders/server/selectionStatus.cjs +3 -3
- package/dist/src/builders/server/selectionStatus.cjs.map +1 -1
- package/dist/src/builders/server/selectionStatus.mjs +3 -3
- package/dist/src/builders/server/selectionStatus.mjs.map +1 -1
- package/dist/src/builders/server/sessionArguments.cjs.map +1 -1
- package/dist/src/builders/server/sessionArguments.mjs.map +1 -1
- package/dist/src/builders/server/watcherService.cjs +65 -0
- package/dist/src/builders/server/watcherService.cjs.map +1 -0
- package/dist/src/builders/server/watcherService.mjs +61 -0
- package/dist/src/builders/server/watcherService.mjs.map +1 -0
- package/dist/src/builders/server/webTemplateDecision.cjs +1 -1
- package/dist/src/builders/server/webTemplateDecision.cjs.map +1 -1
- package/dist/src/builders/server/webTemplateDecision.mjs +2 -2
- package/dist/src/builders/server/webTemplateDecision.mjs.map +1 -1
- package/dist/src/builders/web/bundle.cjs.map +1 -1
- package/dist/src/builders/web/bundle.d.mts +4 -3
- package/dist/src/builders/web/bundle.mjs.map +1 -1
- package/dist/src/builders/web/bundleAssetPolicy.d.mts +1 -0
- package/dist/src/builders/web/index.cjs +1 -1
- package/dist/src/builders/web/index.cjs.map +1 -1
- package/dist/src/builders/web/index.d.mts +1 -0
- package/dist/src/builders/web/index.mjs +1 -1
- package/dist/src/builders/web/index.mjs.map +1 -1
- package/dist/src/builders/web/webPluginGenerate.cjs +4 -15
- package/dist/src/builders/web/webPluginGenerate.cjs.map +1 -1
- package/dist/src/builders/web/webPluginGenerate.d.mts +5 -9
- package/dist/src/builders/web/webPluginGenerate.d.mts.map +1 -1
- package/dist/src/builders/web/webPluginGenerate.mjs +4 -15
- package/dist/src/builders/web/webPluginGenerate.mjs.map +1 -1
- package/dist/src/builders/web/webPluginVite.d.mts +1 -0
- package/dist/src/cli/cliApp.cjs +1 -1
- package/dist/src/cli/cliApp.cjs.map +1 -1
- package/dist/src/cli/cliApp.mjs +1 -1
- package/dist/src/cli/cliApp.mjs.map +1 -1
- package/dist/src/cli/commands/compat/index.cjs +1 -1
- package/dist/src/cli/commands/compat/index.cjs.map +1 -1
- package/dist/src/cli/commands/compat/index.mjs +1 -1
- package/dist/src/cli/commands/compat/index.mjs.map +1 -1
- package/dist/src/cli/commands/doctor/index.cjs +2 -2
- package/dist/src/cli/commands/doctor/index.cjs.map +1 -1
- package/dist/src/cli/commands/doctor/index.d.mts +1 -0
- package/dist/src/cli/commands/doctor/index.d.mts.map +1 -1
- package/dist/src/cli/commands/doctor/index.mjs +4 -4
- package/dist/src/cli/commands/doctor/index.mjs.map +1 -1
- package/dist/src/cli/commands/explain/index.cjs +3 -1
- package/dist/src/cli/commands/explain/index.cjs.map +1 -1
- package/dist/src/cli/commands/explain/index.d.mts.map +1 -1
- package/dist/src/cli/commands/explain/index.mjs +4 -2
- package/dist/src/cli/commands/explain/index.mjs.map +1 -1
- package/dist/src/cli/commands/init/index.cjs +2 -2
- package/dist/src/cli/commands/init/index.cjs.map +1 -1
- package/dist/src/cli/commands/init/index.mjs +3 -3
- package/dist/src/cli/commands/init/index.mjs.map +1 -1
- package/dist/src/cli/commands/init/presenter.cjs +1 -1
- package/dist/src/cli/commands/init/presenter.cjs.map +1 -1
- package/dist/src/cli/commands/init/presenter.mjs +2 -2
- package/dist/src/cli/commands/init/presenter.mjs.map +1 -1
- package/dist/src/cli/commands/sync/index.cjs +4 -4
- package/dist/src/cli/commands/sync/index.cjs.map +1 -1
- package/dist/src/cli/commands/sync/index.d.mts +1 -0
- package/dist/src/cli/commands/sync/index.mjs +7 -7
- package/dist/src/cli/commands/sync/index.mjs.map +1 -1
- package/dist/src/cli/commands/sync/presenter.cjs +1 -1
- package/dist/src/cli/commands/sync/presenter.cjs.map +1 -1
- package/dist/src/cli/commands/sync/presenter.d.mts +1 -1
- package/dist/src/cli/commands/sync/presenter.mjs +1 -1
- package/dist/src/cli/commands/sync/presenter.mjs.map +1 -1
- package/dist/src/cli/commands/web/index.cjs +2 -1
- package/dist/src/cli/commands/web/index.cjs.map +1 -1
- package/dist/src/cli/commands/web/index.mjs +2 -1
- package/dist/src/cli/commands/web/index.mjs.map +1 -1
- package/dist/src/cli/harnessOptions.cjs +1 -1
- package/dist/src/cli/harnessOptions.cjs.map +1 -1
- package/dist/src/cli/harnessOptions.mjs +2 -2
- package/dist/src/cli/harnessOptions.mjs.map +1 -1
- package/dist/src/cli/help.cjs +2 -0
- package/dist/src/cli/help.cjs.map +1 -1
- package/dist/src/cli/help.mjs +2 -0
- package/dist/src/cli/help.mjs.map +1 -1
- package/dist/src/cli/matrixOptions.cjs +1 -1
- package/dist/src/cli/matrixOptions.cjs.map +1 -1
- package/dist/src/cli/matrixOptions.d.mts +1 -1
- package/dist/src/cli/matrixOptions.mjs +1 -1
- package/dist/src/cli/matrixOptions.mjs.map +1 -1
- package/dist/src/cli/server/run.cjs +1 -1
- package/dist/src/cli/server/run.cjs.map +1 -1
- package/dist/src/cli/server/run.mjs +2 -2
- package/dist/src/cli/server/run.mjs.map +1 -1
- package/dist/src/composition/harnessState/index.cjs +66 -11
- package/dist/src/composition/harnessState/index.cjs.map +1 -1
- package/dist/src/composition/harnessState/index.d.mts +3 -3
- package/dist/src/composition/harnessState/index.mjs +2 -2
- package/dist/src/composition/harnessState/index.mjs.map +1 -1
- package/dist/src/composition/layerPackageInstaller/index.cjs +5 -4
- package/dist/src/composition/layerPackageInstaller/index.cjs.map +1 -1
- package/dist/src/composition/layerPackageInstaller/index.mjs +6 -5
- package/dist/src/composition/layerPackageInstaller/index.mjs.map +1 -1
- package/dist/src/composition/poHomeMigration/index.cjs +1 -1
- package/dist/src/composition/poHomeMigration/index.cjs.map +1 -1
- package/dist/src/composition/poHomeMigration/index.mjs +1 -1
- package/dist/src/composition/poHomeMigration/index.mjs.map +1 -1
- package/dist/src/composition/projectTrust/index.cjs +6 -6
- package/dist/src/composition/projectTrust/index.cjs.map +1 -1
- package/dist/src/composition/projectTrust/index.d.mts +7 -7
- package/dist/src/composition/projectTrust/index.d.mts.map +1 -1
- package/dist/src/composition/projectTrust/index.mjs +6 -6
- package/dist/src/composition/projectTrust/index.mjs.map +1 -1
- package/dist/src/composition/repository/index.cjs +8 -8
- package/dist/src/composition/repository/index.cjs.map +1 -1
- package/dist/src/composition/repository/index.d.mts +5 -5
- package/dist/src/composition/repository/index.d.mts.map +1 -1
- package/dist/src/composition/repository/index.mjs +10 -10
- package/dist/src/composition/repository/index.mjs.map +1 -1
- package/dist/src/composition/syncService/index.cjs +29 -9
- package/dist/src/composition/syncService/index.cjs.map +1 -1
- package/dist/src/composition/syncService/index.d.mts.map +1 -1
- package/dist/src/composition/syncService/index.mjs +31 -11
- package/dist/src/composition/syncService/index.mjs.map +1 -1
- package/dist/src/composition/syncService/localBuilds.cjs +7 -2
- package/dist/src/composition/syncService/localBuilds.cjs.map +1 -1
- package/dist/src/composition/syncService/localBuilds.mjs +7 -2
- package/dist/src/composition/syncService/localBuilds.mjs.map +1 -1
- package/dist/src/extensions/setupDiagnostics.cjs +3 -3
- package/dist/src/extensions/setupDiagnostics.cjs.map +1 -1
- package/dist/src/extensions/setupDiagnostics.mjs +3 -3
- package/dist/src/extensions/setupDiagnostics.mjs.map +1 -1
- package/dist/utils.mjs +1 -2
- package/docs/server/api-export.md +3 -3
- package/docs/server/api.md +23 -22
- package/docs/server/getting-started.md +7 -7
- package/docs/server/index.md +4 -4
- package/docs/server/ipc.md +7 -11
- package/docs/server/lifecycle.md +17 -17
- package/docs/server/security.md +8 -8
- package/package.json +42 -45
- package/src/prompts/po-author-extension/SKILL.md +1 -1
- package/src/prompts/po-author-extension/references/extension-contract.md +4 -4
- package/dist/bin/doomRunner.cjs.map +0 -1
- package/dist/bin/doomRunner.d.mts.map +0 -1
- package/dist/bin/doomRunner.mjs.map +0 -1
package/dist/matrixOptions.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { ADD_DIRECTORY_OPTION, DEFAULT_DOMAIN, DEFAULT_MAJOR_MODE, DOMAINS_OPTION, DOMAIN_OPTION, MAJOR_MODE_OPTION, PO_ADDITIONAL_DIRECTORIES_ENV, PO_DOMAINS_ENV, PO_MAJOR_MODE_ENV, PO_PRESET_ENV, PO_PROFILE_ENV, PROFILE_OPTION, REMOVED_LAYERS_OPTION, REMOVED_LAYER_OPTION, REMOVED_PO_LAYER_ENV, REMOVED_TARGET_OPTION, assertNoRetiredEnvironment, matchesOption, parseCsv, parseMajorMode, parseProfileValue, parseRequiredCsv, readOption, resolveAdditionalDirectories, resolveInheritedMajorMode, resolveInheritedProfile };
|
|
1
|
+
export { ADD_DIRECTORY_OPTION, DEFAULT_DOMAIN, DEFAULT_MAJOR_MODE, DOMAINS_OPTION, DOMAIN_OPTION, MAJOR_MODE_OPTION, PO_ADDITIONAL_DIRECTORIES_ENV, PO_DOMAINS_ENV, PO_MAJOR_MODE_ENV, PO_PRESET_ENV, PO_PROFILE_ENV, PROFILE_OPTION, REMOVED_LAYERS_OPTION, REMOVED_LAYER_OPTION, REMOVED_PO_LAYER_ENV, REMOVED_TARGET_OPTION, assertNoRetiredEnvironment, matchesOption, parseCsv, parseMajorMode, parseProfileValue, parseRequiredCsv, readOption, resolveAdditionalDirectories, resolveInheritedMajorMode, resolveInheritedProfile } from "./src/cli/matrixOptions.mjs";
|
package/dist/options.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { parseHarnessArgs };
|
|
1
|
+
export { parseHarnessArgs } from "./src/cli/options.mjs";
|
package/dist/process.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit };
|
|
1
|
+
export { acquireDirectoryLock, forwardSignals, isFileSystemError, lockOwnerIsRunning, pathInside, runCaptured, runChecked, runInteractive, signalExitCode, waitForExit } from "./src/cli/commands/compat/providers/process.mjs";
|
package/dist/projectTrust.cjs
CHANGED
|
@@ -2,5 +2,5 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_index = require("./src/composition/projectTrust/index.cjs");
|
|
3
3
|
exports.applyProjectTrust = require_index.applyProjectTrust;
|
|
4
4
|
exports.hasProjectTrustOption = require_index.hasProjectTrustOption;
|
|
5
|
-
exports.
|
|
6
|
-
exports.
|
|
5
|
+
exports.loadPoConfig = require_index.loadPoConfig;
|
|
6
|
+
exports.loadPoConfigLenient = require_index.loadPoConfigLenient;
|
package/dist/projectTrust.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { PoConfig, ProjectTrust, applyProjectTrust, hasProjectTrustOption, loadPoConfig, loadPoConfigLenient } from "./src/composition/projectTrust/index.mjs";
|
|
2
|
+
export { PoConfig, type ProjectTrust, applyProjectTrust, hasProjectTrustOption, loadPoConfig, loadPoConfigLenient };
|
package/dist/projectTrust.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { applyProjectTrust, hasProjectTrustOption, loadDoomConfig, loadDoomConfigLenient };
|
|
1
|
+
export { applyProjectTrust, hasProjectTrustOption, loadPoConfig, loadPoConfigLenient } from "./src/composition/projectTrust/index.mjs";
|
package/dist/repository.cjs
CHANGED
|
@@ -2,4 +2,4 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_index = require("./src/composition/repository/index.cjs");
|
|
3
3
|
exports.findRepositoryRoot = require_index.findRepositoryRoot;
|
|
4
4
|
exports.isRepositoryRoot = require_index.isRepositoryRoot;
|
|
5
|
-
exports.
|
|
5
|
+
exports.resolvePoConfigurationRoot = require_index.resolvePoConfigurationRoot;
|
package/dist/repository.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { findRepositoryRoot, isRepositoryRoot,
|
|
2
|
-
export { findRepositoryRoot, isRepositoryRoot,
|
|
1
|
+
import { findRepositoryRoot, isRepositoryRoot, resolvePoConfigurationRoot } from "./src/composition/repository/index.mjs";
|
|
2
|
+
export { findRepositoryRoot, isRepositoryRoot, resolvePoConfigurationRoot };
|
package/dist/repository.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { findRepositoryRoot, isRepositoryRoot, resolveDoomConfigurationRoot };
|
|
1
|
+
export { findRepositoryRoot, isRepositoryRoot, resolvePoConfigurationRoot } from "./src/composition/repository/index.mjs";
|
package/dist/router.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { KNOWN_COMMANDS, informationalRequest, routeCommand, wantsHelp };
|
|
1
|
+
export { KNOWN_COMMANDS, informationalRequest, routeCommand, wantsHelp } from "./src/cli/router.mjs";
|
package/dist/shared.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { ADD_DIRECTORY_OPTION, AGIFLOW_PROXY_SERVER_NAME, ANTIGRAVITY_MCP_PROXY_PACKAGE, CORE_PLUGIN_NAME, MCP_CONFIG_OPTION, MCP_PRESTART_OPTION, MCP_PROXY_PACKAGE, MCP_PROXY_VERSION, MCP_SERVERS_KEY, NPX_COMMAND, PLUGINS_DIRECTORY, PLUGIN_MANIFEST_FILENAME, SKILLS_DIRECTORY, SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs, mcpProxyArguments };
|
|
1
|
+
export { ADD_DIRECTORY_OPTION, AGIFLOW_PROXY_SERVER_NAME, ANTIGRAVITY_MCP_PROXY_PACKAGE, CORE_PLUGIN_NAME, MCP_CONFIG_OPTION, MCP_PRESTART_OPTION, MCP_PROXY_PACKAGE, MCP_PROXY_VERSION, MCP_SERVERS_KEY, NPX_COMMAND, PLUGINS_DIRECTORY, PLUGIN_MANIFEST_FILENAME, SKILLS_DIRECTORY, SKIP_PERMISSIONS_OPTION, additionalDirectoryArgs, mcpProxyArguments } from "./src/cli/commands/compat/providers/shared.mjs";
|
|
@@ -1,27 +1,33 @@
|
|
|
1
1
|
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
const require_index = require("../composition/poHomeMigration/index.cjs");
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
3
5
|
let node_path = require("node:path");
|
|
4
6
|
node_path = require_runtime.__toESM(node_path, 1);
|
|
5
7
|
let node_os = require("node:os");
|
|
6
8
|
node_os = require_runtime.__toESM(node_os, 1);
|
|
9
|
+
let _agimon_ai_po_config_harnessState = require("@agimon-ai/po-config/harnessState");
|
|
10
|
+
let _agimon_ai_po_config_harnessStore = require("@agimon-ai/po-config/harnessStore");
|
|
11
|
+
let _agimon_ai_po_core_piSettings = require("@agimon-ai/po-core/piSettings");
|
|
12
|
+
let node_url = require("node:url");
|
|
13
|
+
let _agimon_ai_po_core_testMode = require("@agimon-ai/po-core/testMode");
|
|
14
|
+
let _agimon_ai_po_config_init = require("@agimon-ai/po-config/init");
|
|
7
15
|
//#region src/bin/agentDirectory.ts
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*
|
|
12
|
-
* Every Po executable imports this first. It assigns unconditionally, so a
|
|
13
|
-
* PI_CODING_AGENT_DIR exported for plain Pi cannot pull Po back into `~/.pi`;
|
|
14
|
-
* PO_HOME is the supported way to move Po, agent directory included. Pi reads
|
|
15
|
-
* the variable on every call, and the server freezes its environment after
|
|
16
|
-
* this runs, so both sides agree. It also runs the one-time copy of `~/.pi/.po`.
|
|
17
|
-
*/
|
|
18
|
-
const poHome = (0, require("@agimon-ai/po-core/piSettings").poHomeDirectory)();
|
|
16
|
+
/** Pins Pi's agent directory before configuration or runtime imports read it. */
|
|
17
|
+
const testRoot = (0, _agimon_ai_po_core_testMode.initializeTestMode)(require("url").pathToFileURL(__filename).href);
|
|
18
|
+
const poHome = (0, _agimon_ai_po_core_piSettings.poHomeDirectory)();
|
|
19
19
|
process.env.PI_CODING_AGENT_DIR = node_path.default.join(poHome, "agent");
|
|
20
|
-
|
|
20
|
+
if (testRoot && process.env.PO_TEST_RESET_HARNESS === "1") {
|
|
21
|
+
delete process.env.PO_TEST_RESET_HARNESS;
|
|
22
|
+
for (const key of [_agimon_ai_po_config_harnessStore.HARNESS_STATE_POINTER, ...Object.values(_agimon_ai_po_config_harnessState.HARNESS_STATE_KEYS)]) delete process.env[key];
|
|
23
|
+
}
|
|
24
|
+
if (testRoot && (0, node_url.fileURLToPath)(require("url").pathToFileURL(__filename).href).startsWith(node_fs.default.realpathSync(testRoot) + node_path.default.sep)) (0, _agimon_ai_po_config_init.initializeGlobalPoConfig)(process.env.HOME ?? node_os.default.homedir());
|
|
25
|
+
if (!testRoot) try {
|
|
21
26
|
require_index.migratePoHome(process.env.HOME ?? node_os.default.homedir(), poHome);
|
|
22
27
|
} catch (error) {
|
|
23
28
|
process.stderr.write(`[po] Could not move ~/.pi/.po into ${poHome}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
24
29
|
}
|
|
25
30
|
//#endregion
|
|
31
|
+
exports.testRoot = testRoot;
|
|
26
32
|
|
|
27
33
|
//# sourceMappingURL=agentDirectory.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentDirectory.cjs","names":["poHomeDirectory","path","os"],"sources":["../../../src/bin/agentDirectory.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"agentDirectory.cjs","names":["initializeTestMode","poHomeDirectory","path","HARNESS_STATE_POINTER","HARNESS_STATE_KEYS","fileURLToPath","fs","os"],"sources":["../../../src/bin/agentDirectory.ts"],"sourcesContent":["/** Pins Pi's agent directory before configuration or runtime imports read it. */\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { HARNESS_STATE_POINTER } from '@agimon-ai/po-config/harnessStore';\nimport { initializeGlobalPoConfig } from '@agimon-ai/po-config/init';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport { initializeTestMode } from '@agimon-ai/po-core/testMode';\n\nimport { migratePoHome } from '../composition/poHomeMigration';\n\nexport const testRoot = initializeTestMode(import.meta.url);\nconst poHome = poHomeDirectory();\nprocess.env.PI_CODING_AGENT_DIR = path.join(poHome, 'agent');\n\nif (testRoot && process.env.PO_TEST_RESET_HARNESS === '1') {\n // Direct web children may inherit stable state across an explicit test boundary.\n delete process.env.PO_TEST_RESET_HARNESS;\n for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete process.env[key];\n}\n// The repository has no .po/modes.yaml, so the test home needs the seed files `po init` writes.\n// Only the checkout's own CLI seeds them; an installed launcher would write its older template.\nif (testRoot && fileURLToPath(import.meta.url).startsWith(fs.realpathSync(testRoot) + path.sep)) {\n initializeGlobalPoConfig(process.env.HOME ?? os.homedir());\n}\nif (!testRoot) {\n try {\n migratePoHome(process.env.HOME ?? os.homedir(), poHome);\n } catch (error) {\n process.stderr.write(\n `[po] Could not move ~/.pi/.po into ${poHome}: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAcA,MAAa,YAAA,GAAWA,4BAAAA,mBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAAkC;AAC1D,MAAM,UAAA,GAASC,8BAAAA,gBAAAA,CAAgB;AAC/B,QAAQ,IAAI,sBAAsBC,UAAAA,QAAK,KAAK,QAAQ,OAAO;AAE3D,IAAI,YAAY,QAAQ,IAAI,0BAA0B,KAAK;CAEzD,OAAO,QAAQ,IAAI;CACnB,KAAK,MAAM,OAAO,CAACC,kCAAAA,uBAAuB,GAAG,OAAO,OAAOC,kCAAAA,kBAAkB,CAAC,GAAG,OAAO,QAAQ,IAAI;AACtG;AAGA,IAAI,aAAA,GAAYC,SAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B,CAAC,CAAC,WAAWC,QAAAA,QAAG,aAAa,QAAQ,IAAIJ,UAAAA,QAAK,GAAG,GAC5F,CAAA,GAAA,0BAAA,yBAAA,CAAyB,QAAQ,IAAI,QAAQK,QAAAA,QAAG,QAAQ,CAAC;AAE3D,IAAI,CAAC,UACH,IAAI;CACF,cAAA,cAAc,QAAQ,IAAI,QAAQA,QAAAA,QAAG,QAAQ,GAAG,MAAM;AACxD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sCAAsC,OAAO,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;AACF"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
import { migratePoHome } from "../composition/poHomeMigration/index.mjs";
|
|
2
|
+
import fs from "node:fs";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import os from "node:os";
|
|
5
|
+
import { HARNESS_STATE_KEYS } from "@agimon-ai/po-config/harnessState";
|
|
6
|
+
import { HARNESS_STATE_POINTER } from "@agimon-ai/po-config/harnessStore";
|
|
4
7
|
import { poHomeDirectory } from "@agimon-ai/po-core/piSettings";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { initializeTestMode } from "@agimon-ai/po-core/testMode";
|
|
10
|
+
import { initializeGlobalPoConfig } from "@agimon-ai/po-config/init";
|
|
5
11
|
//#region src/bin/agentDirectory.ts
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
* reads it.
|
|
9
|
-
*
|
|
10
|
-
* Every Po executable imports this first. It assigns unconditionally, so a
|
|
11
|
-
* PI_CODING_AGENT_DIR exported for plain Pi cannot pull Po back into `~/.pi`;
|
|
12
|
-
* PO_HOME is the supported way to move Po, agent directory included. Pi reads
|
|
13
|
-
* the variable on every call, and the server freezes its environment after
|
|
14
|
-
* this runs, so both sides agree. It also runs the one-time copy of `~/.pi/.po`.
|
|
15
|
-
*/
|
|
12
|
+
/** Pins Pi's agent directory before configuration or runtime imports read it. */
|
|
13
|
+
const testRoot = initializeTestMode(import.meta.url);
|
|
16
14
|
const poHome = poHomeDirectory();
|
|
17
15
|
process.env.PI_CODING_AGENT_DIR = path.join(poHome, "agent");
|
|
18
|
-
|
|
16
|
+
if (testRoot && process.env.PO_TEST_RESET_HARNESS === "1") {
|
|
17
|
+
delete process.env.PO_TEST_RESET_HARNESS;
|
|
18
|
+
for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete process.env[key];
|
|
19
|
+
}
|
|
20
|
+
if (testRoot && fileURLToPath(import.meta.url).startsWith(fs.realpathSync(testRoot) + path.sep)) initializeGlobalPoConfig(process.env.HOME ?? os.homedir());
|
|
21
|
+
if (!testRoot) try {
|
|
19
22
|
migratePoHome(process.env.HOME ?? os.homedir(), poHome);
|
|
20
23
|
} catch (error) {
|
|
21
24
|
process.stderr.write(`[po] Could not move ~/.pi/.po into ${poHome}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
22
25
|
}
|
|
23
26
|
//#endregion
|
|
24
|
-
export {};
|
|
27
|
+
export { testRoot };
|
|
25
28
|
|
|
26
29
|
//# sourceMappingURL=agentDirectory.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentDirectory.mjs","names":[],"sources":["../../../src/bin/agentDirectory.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"agentDirectory.mjs","names":[],"sources":["../../../src/bin/agentDirectory.ts"],"sourcesContent":["/** Pins Pi's agent directory before configuration or runtime imports read it. */\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { HARNESS_STATE_KEYS } from '@agimon-ai/po-config/harnessState';\nimport { HARNESS_STATE_POINTER } from '@agimon-ai/po-config/harnessStore';\nimport { initializeGlobalPoConfig } from '@agimon-ai/po-config/init';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport { initializeTestMode } from '@agimon-ai/po-core/testMode';\n\nimport { migratePoHome } from '../composition/poHomeMigration';\n\nexport const testRoot = initializeTestMode(import.meta.url);\nconst poHome = poHomeDirectory();\nprocess.env.PI_CODING_AGENT_DIR = path.join(poHome, 'agent');\n\nif (testRoot && process.env.PO_TEST_RESET_HARNESS === '1') {\n // Direct web children may inherit stable state across an explicit test boundary.\n delete process.env.PO_TEST_RESET_HARNESS;\n for (const key of [HARNESS_STATE_POINTER, ...Object.values(HARNESS_STATE_KEYS)]) delete process.env[key];\n}\n// The repository has no .po/modes.yaml, so the test home needs the seed files `po init` writes.\n// Only the checkout's own CLI seeds them; an installed launcher would write its older template.\nif (testRoot && fileURLToPath(import.meta.url).startsWith(fs.realpathSync(testRoot) + path.sep)) {\n initializeGlobalPoConfig(process.env.HOME ?? os.homedir());\n}\nif (!testRoot) {\n try {\n migratePoHome(process.env.HOME ?? os.homedir(), poHome);\n } catch (error) {\n process.stderr.write(\n `[po] Could not move ~/.pi/.po into ${poHome}: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,MAAa,WAAW,mBAAmB,YAAY,GAAG;AAC1D,MAAM,SAAS,gBAAgB;AAC/B,QAAQ,IAAI,sBAAsB,KAAK,KAAK,QAAQ,OAAO;AAE3D,IAAI,YAAY,QAAQ,IAAI,0BAA0B,KAAK;CAEzD,OAAO,QAAQ,IAAI;CACnB,KAAK,MAAM,OAAO,CAAC,uBAAuB,GAAG,OAAO,OAAO,kBAAkB,CAAC,GAAG,OAAO,QAAQ,IAAI;AACtG;AAGA,IAAI,YAAY,cAAc,YAAY,GAAG,CAAC,CAAC,WAAW,GAAG,aAAa,QAAQ,IAAI,KAAK,GAAG,GAC5F,yBAAyB,QAAQ,IAAI,QAAQ,GAAG,QAAQ,CAAC;AAE3D,IAAI,CAAC,UACH,IAAI;CACF,cAAc,QAAQ,IAAI,QAAQ,GAAG,QAAQ,GAAG,MAAM;AACxD,SAAS,OAAO;CACd,QAAQ,OAAO,MACb,sCAAsC,OAAO,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC1G;AACF"}
|
|
@@ -21,9 +21,9 @@ function problemOf(error) {
|
|
|
21
21
|
return ((error !== null && typeof error === "object" && "stderr" in error && typeof error.stderr === "string" ? error.stderr.trim() : "") || (error instanceof Error ? error.message : String(error))).slice(0, 1e3);
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
* Reads each server
|
|
24
|
+
* Reads each server package's built `poServer.contracts.dist` straight from its installed package.
|
|
25
25
|
*
|
|
26
|
-
* Contracts have their own entry so exporting never imports a server
|
|
26
|
+
* Contracts have their own entry so exporting never imports a server plugin, and each one is
|
|
27
27
|
* imported in a bounded child process so its module graph, timers and errors stay out of here.
|
|
28
28
|
* A package without a readable contract is recorded as a gap rather than failing the export.
|
|
29
29
|
*/
|
|
@@ -68,13 +68,13 @@ async function collectApiContracts(candidates) {
|
|
|
68
68
|
packages
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
/** Reads the installed packages of the global root and the workspace. Export never builds or
|
|
71
|
+
/** Reads the installed packages of the global root and the workspace. Export never builds or installs a package. */
|
|
72
72
|
async function exportApiContracts(options) {
|
|
73
73
|
const environment = options.environment ?? process.env;
|
|
74
|
-
const globalRoot = (0, _agimon_ai_po_config_config.
|
|
75
|
-
const workspaceRoot = require_index.
|
|
74
|
+
const globalRoot = (0, _agimon_ai_po_config_config.globalPoConfigDirectory)(options.homeDirectory);
|
|
75
|
+
const workspaceRoot = require_index.resolvePoConfigurationRoot(options.cwd, options.homeDirectory);
|
|
76
76
|
const read = async (root) => ({
|
|
77
|
-
compiled: await collectApiContracts(require_index$1.
|
|
77
|
+
compiled: await collectApiContracts(require_index$1.serverPackageCandidates(require_sessionComposition.rootCompositions({
|
|
78
78
|
root,
|
|
79
79
|
homeDirectory: options.homeDirectory,
|
|
80
80
|
environment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["promisify","execFile","fs","path","pathToFileURL","parseApiContract","crypto","parseCompiledContracts","globalDoomConfigDirectory","resolveDoomConfigurationRoot","serverFacetCandidates","rootCompositions","loadMajorModesConfig","resolveLayers","createApiDocuments","canonicalContractJson"],"sources":["../../../../src/builders/apiContractExport/index.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { promisify } from 'node:util';\n\nimport { globalDoomConfigDirectory } from '@agimon-ai/po-config/config';\nimport { loadMajorModesConfig, resolveLayers } from '@agimon-ai/po-config/majorModes';\nimport {\n canonicalContractJson,\n createApiDocuments,\n parseApiContract,\n parseCompiledContracts,\n type ApiContractSelection,\n type ApiDocuments,\n type DoomCompiledContracts,\n type DoomPackageContract,\n} from '@agimon-ai/po-core/apiContracts';\n\nimport { resolveDoomConfigurationRoot } from '../../composition/repository';\nimport { rootCompositions } from '../cli/sessionComposition';\nimport { serverFacetCandidates, type ServerFacetCandidate } from '../server';\n\nconst execute = promisify(execFile);\n/** Imports one built contract module and prints its default export as strict JSON. */\nconst CONTRACT_PRINTER =\n 'try { const m = await import(process.argv[1]); process.stdout.write(JSON.stringify(m.default, (_key, value) => { if (typeof value === \"function\" || typeof value === \"bigint\" || typeof value === \"undefined\" || (typeof value === \"number\" && !Number.isFinite(value))) throw new Error(\"Contract contains non-JSON data\"); return value; })); } catch (error) { process.stderr.write(error instanceof Error ? `${error.name}: ${error.message}` : String(error)); process.exitCode = 1; }';\n\nfunction problemOf(error: unknown): string {\n const stderr =\n error !== null && typeof error === 'object' && 'stderr' in error && typeof error.stderr === 'string'\n ? error.stderr.trim()\n : '';\n return (stderr || (error instanceof Error ? error.message : String(error))).slice(0, 1000);\n}\n\n/**\n * Reads each server facet's built `poServer.contracts.dist` straight from its installed package.\n *\n * Contracts have their own entry so exporting never imports a server facet, and each one is\n * imported in a bounded child process so its module graph, timers and errors stay out of here.\n * A package without a readable contract is recorded as a gap rather than failing the export.\n */\nasync function collectApiContracts(candidates: readonly ServerFacetCandidate[]): Promise<DoomCompiledContracts> {\n const packages: DoomPackageContract[] = [];\n for (const { declaration, owners } of candidates) {\n const root = declaration.packageDir;\n const manifest = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as {\n version?: string;\n poServer?: { contracts?: { entry?: string; dist?: string } };\n };\n const entry: DoomPackageContract = {\n packageName: declaration.packageName,\n packageVersion: manifest.version ?? 'unknown',\n scopes: declaration.scopes,\n owners: [...owners],\n };\n packages.push(entry);\n try {\n const contracts = manifest.poServer?.contracts;\n if (!contracts) throw new Error('No poServer.contracts declaration');\n for (const value of [contracts.entry, contracts.dist]) {\n if (typeof value !== 'string' || !value.startsWith('./') || value.includes('..') || /[\\\\%?#]/u.test(value))\n throw new Error('Contract entry and dist must be contained package-relative files');\n }\n const built = fs.realpathSync(path.join(root, contracts.dist!));\n const relative = path.relative(fs.realpathSync(root), built);\n if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Contract entry escapes package');\n const { stdout } = await execute(\n process.execPath,\n ['--input-type=module', '-e', CONTRACT_PRINTER, pathToFileURL(built).href],\n { timeout: 10_000, maxBuffer: 16 * 1024 * 1024 },\n );\n entry.contract = parseApiContract(JSON.parse(stdout));\n } catch (error) {\n entry.problem = problemOf(error);\n }\n }\n const fingerprint = crypto\n .createHash('sha256')\n .update(JSON.stringify(packages.map(({ packageName, packageVersion }) => [packageName, packageVersion])))\n .digest('hex');\n return parseCompiledContracts({ version: 1, generation: 'live', fingerprint, packages });\n}\n\n/** Reads the installed packages of the global root and the workspace. Export never builds or activates a facet. */\nexport async function exportApiContracts(options: {\n cwd: string;\n homeDirectory: string;\n outputDirectory: string;\n majorMode?: string;\n environment?: NodeJS.ProcessEnv;\n}): Promise<ApiDocuments['manifest']> {\n const environment = options.environment ?? process.env;\n const globalRoot = globalDoomConfigDirectory(options.homeDirectory);\n const workspaceRoot = resolveDoomConfigurationRoot(options.cwd, options.homeDirectory);\n const read = async (root: string) => ({\n compiled: await collectApiContracts(\n serverFacetCandidates(rootCompositions({ root, homeDirectory: options.homeDirectory, environment })),\n ),\n config: loadMajorModesConfig(root, options.homeDirectory, environment),\n });\n const global = await read(globalRoot);\n const workspace = globalRoot === workspaceRoot ? global : await read(workspaceRoot);\n const sessionMode = options.majorMode ?? workspace.config.defaultMajorMode;\n const selection = (\n source: typeof global,\n scope: ApiContractSelection['scope'],\n majorMode: string,\n ): ApiContractSelection => ({\n scope,\n majorMode,\n activeLayers: resolveLayers(source.config, majorMode),\n compiled: source.compiled,\n });\n // A typo must not silently export an empty session surface.\n if (!Object.hasOwn(workspace.config.majorMode, sessionMode)) throw new Error(`Unknown major mode '${sessionMode}'`);\n const documents = createApiDocuments([\n selection(global, 'global', global.config.defaultMajorMode),\n selection(workspace, 'workspace', workspace.config.defaultMajorMode),\n selection(workspace, 'session', sessionMode),\n ]);\n const files = {\n 'openapi.json': canonicalContractJson(documents.openapi),\n 'asyncapi.json': canonicalContractJson(documents.asyncapi),\n };\n const manifest = {\n ...documents.manifest,\n artifacts: Object.fromEntries(\n Object.entries(files).map(([name, bytes]) => [\n name,\n {\n sha256: crypto.createHash('sha256').update(bytes).digest('hex'),\n },\n ]),\n ),\n };\n fs.mkdirSync(options.outputDirectory, { recursive: true });\n // Write the manifest last. Consumers verify both checksums before accepting the bundle.\n for (const [name, bytes] of Object.entries({ ...files, 'manifest.json': canonicalContractJson(manifest) })) {\n const target = path.join(options.outputDirectory, name);\n const temporary = `${target}.${crypto.randomUUID()}.tmp`;\n try {\n fs.writeFileSync(temporary, bytes, { flag: 'wx' });\n fs.renameSync(temporary, target);\n } finally {\n fs.rmSync(temporary, { force: true });\n }\n }\n return documents.manifest;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["promisify","execFile","fs","path","pathToFileURL","parseApiContract","crypto","parseCompiledContracts","globalPoConfigDirectory","resolvePoConfigurationRoot","serverPackageCandidates","rootCompositions","loadMajorModesConfig","resolveLayers","createApiDocuments","canonicalContractJson"],"sources":["../../../../src/builders/apiContractExport/index.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { promisify } from 'node:util';\n\nimport { globalPoConfigDirectory } from '@agimon-ai/po-config/config';\nimport { loadMajorModesConfig, resolveLayers } from '@agimon-ai/po-config/majorModes';\nimport {\n canonicalContractJson,\n createApiDocuments,\n parseApiContract,\n parseCompiledContracts,\n type ApiContractSelection,\n type ApiDocuments,\n type PoCompiledContracts,\n type PoPackageContract,\n} from '@agimon-ai/po-core/apiContracts';\n\nimport { resolvePoConfigurationRoot } from '../../composition/repository';\nimport { rootCompositions } from '../cli/sessionComposition';\nimport { serverPackageCandidates, type ServerPackageCandidate } from '../server';\n\nconst execute = promisify(execFile);\n/** Imports one built contract module and prints its default export as strict JSON. */\nconst CONTRACT_PRINTER =\n 'try { const m = await import(process.argv[1]); process.stdout.write(JSON.stringify(m.default, (_key, value) => { if (typeof value === \"function\" || typeof value === \"bigint\" || typeof value === \"undefined\" || (typeof value === \"number\" && !Number.isFinite(value))) throw new Error(\"Contract contains non-JSON data\"); return value; })); } catch (error) { process.stderr.write(error instanceof Error ? `${error.name}: ${error.message}` : String(error)); process.exitCode = 1; }';\n\nfunction problemOf(error: unknown): string {\n const stderr =\n error !== null && typeof error === 'object' && 'stderr' in error && typeof error.stderr === 'string'\n ? error.stderr.trim()\n : '';\n return (stderr || (error instanceof Error ? error.message : String(error))).slice(0, 1000);\n}\n\n/**\n * Reads each server package's built `poServer.contracts.dist` straight from its installed package.\n *\n * Contracts have their own entry so exporting never imports a server plugin, and each one is\n * imported in a bounded child process so its module graph, timers and errors stay out of here.\n * A package without a readable contract is recorded as a gap rather than failing the export.\n */\nasync function collectApiContracts(candidates: readonly ServerPackageCandidate[]): Promise<PoCompiledContracts> {\n const packages: PoPackageContract[] = [];\n for (const { declaration, owners } of candidates) {\n const root = declaration.packageDir;\n const manifest = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as {\n version?: string;\n poServer?: { contracts?: { entry?: string; dist?: string } };\n };\n const entry: PoPackageContract = {\n packageName: declaration.packageName,\n packageVersion: manifest.version ?? 'unknown',\n scopes: declaration.scopes,\n owners: [...owners],\n };\n packages.push(entry);\n try {\n const contracts = manifest.poServer?.contracts;\n if (!contracts) throw new Error('No poServer.contracts declaration');\n for (const value of [contracts.entry, contracts.dist]) {\n if (typeof value !== 'string' || !value.startsWith('./') || value.includes('..') || /[\\\\%?#]/u.test(value))\n throw new Error('Contract entry and dist must be contained package-relative files');\n }\n const built = fs.realpathSync(path.join(root, contracts.dist!));\n const relative = path.relative(fs.realpathSync(root), built);\n if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Contract entry escapes package');\n const { stdout } = await execute(\n process.execPath,\n ['--input-type=module', '-e', CONTRACT_PRINTER, pathToFileURL(built).href],\n { timeout: 10_000, maxBuffer: 16 * 1024 * 1024 },\n );\n entry.contract = parseApiContract(JSON.parse(stdout));\n } catch (error) {\n entry.problem = problemOf(error);\n }\n }\n const fingerprint = crypto\n .createHash('sha256')\n .update(JSON.stringify(packages.map(({ packageName, packageVersion }) => [packageName, packageVersion])))\n .digest('hex');\n return parseCompiledContracts({ version: 1, generation: 'live', fingerprint, packages });\n}\n\n/** Reads the installed packages of the global root and the workspace. Export never builds or installs a package. */\nexport async function exportApiContracts(options: {\n cwd: string;\n homeDirectory: string;\n outputDirectory: string;\n majorMode?: string;\n environment?: NodeJS.ProcessEnv;\n}): Promise<ApiDocuments['manifest']> {\n const environment = options.environment ?? process.env;\n const globalRoot = globalPoConfigDirectory(options.homeDirectory);\n const workspaceRoot = resolvePoConfigurationRoot(options.cwd, options.homeDirectory);\n const read = async (root: string) => ({\n compiled: await collectApiContracts(\n serverPackageCandidates(rootCompositions({ root, homeDirectory: options.homeDirectory, environment })),\n ),\n config: loadMajorModesConfig(root, options.homeDirectory, environment),\n });\n const global = await read(globalRoot);\n const workspace = globalRoot === workspaceRoot ? global : await read(workspaceRoot);\n const sessionMode = options.majorMode ?? workspace.config.defaultMajorMode;\n const selection = (\n source: typeof global,\n scope: ApiContractSelection['scope'],\n majorMode: string,\n ): ApiContractSelection => ({\n scope,\n majorMode,\n activeLayers: resolveLayers(source.config, majorMode),\n compiled: source.compiled,\n });\n // A typo must not silently export an empty session surface.\n if (!Object.hasOwn(workspace.config.majorMode, sessionMode)) throw new Error(`Unknown major mode '${sessionMode}'`);\n const documents = createApiDocuments([\n selection(global, 'global', global.config.defaultMajorMode),\n selection(workspace, 'workspace', workspace.config.defaultMajorMode),\n selection(workspace, 'session', sessionMode),\n ]);\n const files = {\n 'openapi.json': canonicalContractJson(documents.openapi),\n 'asyncapi.json': canonicalContractJson(documents.asyncapi),\n };\n const manifest = {\n ...documents.manifest,\n artifacts: Object.fromEntries(\n Object.entries(files).map(([name, bytes]) => [\n name,\n {\n sha256: crypto.createHash('sha256').update(bytes).digest('hex'),\n },\n ]),\n ),\n };\n fs.mkdirSync(options.outputDirectory, { recursive: true });\n // Write the manifest last. Consumers verify both checksums before accepting the bundle.\n for (const [name, bytes] of Object.entries({ ...files, 'manifest.json': canonicalContractJson(manifest) })) {\n const target = path.join(options.outputDirectory, name);\n const temporary = `${target}.${crypto.randomUUID()}.tmp`;\n try {\n fs.writeFileSync(temporary, bytes, { flag: 'wx' });\n fs.renameSync(temporary, target);\n } finally {\n fs.rmSync(temporary, { force: true });\n }\n }\n return documents.manifest;\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolvePoConfigurationRoot } from "../../composition/repository/index.mjs";
|
|
2
2
|
import { rootCompositions } from "../cli/sessionComposition.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { serverPackageCandidates } from "../server/index.mjs";
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { execFile } from "node:child_process";
|
|
7
7
|
import { canonicalContractJson, createApiDocuments, parseApiContract, parseCompiledContracts } from "@agimon-ai/po-core/apiContracts";
|
|
8
|
-
import {
|
|
8
|
+
import { globalPoConfigDirectory } from "@agimon-ai/po-config/config";
|
|
9
9
|
import { loadMajorModesConfig, resolveLayers } from "@agimon-ai/po-config/majorModes";
|
|
10
10
|
import { pathToFileURL } from "node:url";
|
|
11
11
|
import crypto from "node:crypto";
|
|
@@ -18,9 +18,9 @@ function problemOf(error) {
|
|
|
18
18
|
return ((error !== null && typeof error === "object" && "stderr" in error && typeof error.stderr === "string" ? error.stderr.trim() : "") || (error instanceof Error ? error.message : String(error))).slice(0, 1e3);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Reads each server
|
|
21
|
+
* Reads each server package's built `poServer.contracts.dist` straight from its installed package.
|
|
22
22
|
*
|
|
23
|
-
* Contracts have their own entry so exporting never imports a server
|
|
23
|
+
* Contracts have their own entry so exporting never imports a server plugin, and each one is
|
|
24
24
|
* imported in a bounded child process so its module graph, timers and errors stay out of here.
|
|
25
25
|
* A package without a readable contract is recorded as a gap rather than failing the export.
|
|
26
26
|
*/
|
|
@@ -65,13 +65,13 @@ async function collectApiContracts(candidates) {
|
|
|
65
65
|
packages
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
/** Reads the installed packages of the global root and the workspace. Export never builds or
|
|
68
|
+
/** Reads the installed packages of the global root and the workspace. Export never builds or installs a package. */
|
|
69
69
|
async function exportApiContracts(options) {
|
|
70
70
|
const environment = options.environment ?? process.env;
|
|
71
|
-
const globalRoot =
|
|
72
|
-
const workspaceRoot =
|
|
71
|
+
const globalRoot = globalPoConfigDirectory(options.homeDirectory);
|
|
72
|
+
const workspaceRoot = resolvePoConfigurationRoot(options.cwd, options.homeDirectory);
|
|
73
73
|
const read = async (root) => ({
|
|
74
|
-
compiled: await collectApiContracts(
|
|
74
|
+
compiled: await collectApiContracts(serverPackageCandidates(rootCompositions({
|
|
75
75
|
root,
|
|
76
76
|
homeDirectory: options.homeDirectory,
|
|
77
77
|
environment
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/builders/apiContractExport/index.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { promisify } from 'node:util';\n\nimport {
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/builders/apiContractExport/index.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { promisify } from 'node:util';\n\nimport { globalPoConfigDirectory } from '@agimon-ai/po-config/config';\nimport { loadMajorModesConfig, resolveLayers } from '@agimon-ai/po-config/majorModes';\nimport {\n canonicalContractJson,\n createApiDocuments,\n parseApiContract,\n parseCompiledContracts,\n type ApiContractSelection,\n type ApiDocuments,\n type PoCompiledContracts,\n type PoPackageContract,\n} from '@agimon-ai/po-core/apiContracts';\n\nimport { resolvePoConfigurationRoot } from '../../composition/repository';\nimport { rootCompositions } from '../cli/sessionComposition';\nimport { serverPackageCandidates, type ServerPackageCandidate } from '../server';\n\nconst execute = promisify(execFile);\n/** Imports one built contract module and prints its default export as strict JSON. */\nconst CONTRACT_PRINTER =\n 'try { const m = await import(process.argv[1]); process.stdout.write(JSON.stringify(m.default, (_key, value) => { if (typeof value === \"function\" || typeof value === \"bigint\" || typeof value === \"undefined\" || (typeof value === \"number\" && !Number.isFinite(value))) throw new Error(\"Contract contains non-JSON data\"); return value; })); } catch (error) { process.stderr.write(error instanceof Error ? `${error.name}: ${error.message}` : String(error)); process.exitCode = 1; }';\n\nfunction problemOf(error: unknown): string {\n const stderr =\n error !== null && typeof error === 'object' && 'stderr' in error && typeof error.stderr === 'string'\n ? error.stderr.trim()\n : '';\n return (stderr || (error instanceof Error ? error.message : String(error))).slice(0, 1000);\n}\n\n/**\n * Reads each server package's built `poServer.contracts.dist` straight from its installed package.\n *\n * Contracts have their own entry so exporting never imports a server plugin, and each one is\n * imported in a bounded child process so its module graph, timers and errors stay out of here.\n * A package without a readable contract is recorded as a gap rather than failing the export.\n */\nasync function collectApiContracts(candidates: readonly ServerPackageCandidate[]): Promise<PoCompiledContracts> {\n const packages: PoPackageContract[] = [];\n for (const { declaration, owners } of candidates) {\n const root = declaration.packageDir;\n const manifest = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as {\n version?: string;\n poServer?: { contracts?: { entry?: string; dist?: string } };\n };\n const entry: PoPackageContract = {\n packageName: declaration.packageName,\n packageVersion: manifest.version ?? 'unknown',\n scopes: declaration.scopes,\n owners: [...owners],\n };\n packages.push(entry);\n try {\n const contracts = manifest.poServer?.contracts;\n if (!contracts) throw new Error('No poServer.contracts declaration');\n for (const value of [contracts.entry, contracts.dist]) {\n if (typeof value !== 'string' || !value.startsWith('./') || value.includes('..') || /[\\\\%?#]/u.test(value))\n throw new Error('Contract entry and dist must be contained package-relative files');\n }\n const built = fs.realpathSync(path.join(root, contracts.dist!));\n const relative = path.relative(fs.realpathSync(root), built);\n if (relative.startsWith('..') || path.isAbsolute(relative)) throw new Error('Contract entry escapes package');\n const { stdout } = await execute(\n process.execPath,\n ['--input-type=module', '-e', CONTRACT_PRINTER, pathToFileURL(built).href],\n { timeout: 10_000, maxBuffer: 16 * 1024 * 1024 },\n );\n entry.contract = parseApiContract(JSON.parse(stdout));\n } catch (error) {\n entry.problem = problemOf(error);\n }\n }\n const fingerprint = crypto\n .createHash('sha256')\n .update(JSON.stringify(packages.map(({ packageName, packageVersion }) => [packageName, packageVersion])))\n .digest('hex');\n return parseCompiledContracts({ version: 1, generation: 'live', fingerprint, packages });\n}\n\n/** Reads the installed packages of the global root and the workspace. Export never builds or installs a package. */\nexport async function exportApiContracts(options: {\n cwd: string;\n homeDirectory: string;\n outputDirectory: string;\n majorMode?: string;\n environment?: NodeJS.ProcessEnv;\n}): Promise<ApiDocuments['manifest']> {\n const environment = options.environment ?? process.env;\n const globalRoot = globalPoConfigDirectory(options.homeDirectory);\n const workspaceRoot = resolvePoConfigurationRoot(options.cwd, options.homeDirectory);\n const read = async (root: string) => ({\n compiled: await collectApiContracts(\n serverPackageCandidates(rootCompositions({ root, homeDirectory: options.homeDirectory, environment })),\n ),\n config: loadMajorModesConfig(root, options.homeDirectory, environment),\n });\n const global = await read(globalRoot);\n const workspace = globalRoot === workspaceRoot ? global : await read(workspaceRoot);\n const sessionMode = options.majorMode ?? workspace.config.defaultMajorMode;\n const selection = (\n source: typeof global,\n scope: ApiContractSelection['scope'],\n majorMode: string,\n ): ApiContractSelection => ({\n scope,\n majorMode,\n activeLayers: resolveLayers(source.config, majorMode),\n compiled: source.compiled,\n });\n // A typo must not silently export an empty session surface.\n if (!Object.hasOwn(workspace.config.majorMode, sessionMode)) throw new Error(`Unknown major mode '${sessionMode}'`);\n const documents = createApiDocuments([\n selection(global, 'global', global.config.defaultMajorMode),\n selection(workspace, 'workspace', workspace.config.defaultMajorMode),\n selection(workspace, 'session', sessionMode),\n ]);\n const files = {\n 'openapi.json': canonicalContractJson(documents.openapi),\n 'asyncapi.json': canonicalContractJson(documents.asyncapi),\n };\n const manifest = {\n ...documents.manifest,\n artifacts: Object.fromEntries(\n Object.entries(files).map(([name, bytes]) => [\n name,\n {\n sha256: crypto.createHash('sha256').update(bytes).digest('hex'),\n },\n ]),\n ),\n };\n fs.mkdirSync(options.outputDirectory, { recursive: true });\n // Write the manifest last. Consumers verify both checksums before accepting the bundle.\n for (const [name, bytes] of Object.entries({ ...files, 'manifest.json': canonicalContractJson(manifest) })) {\n const target = path.join(options.outputDirectory, name);\n const temporary = `${target}.${crypto.randomUUID()}.tmp`;\n try {\n fs.writeFileSync(temporary, bytes, { flag: 'wx' });\n fs.renameSync(temporary, target);\n } finally {\n fs.rmSync(temporary, { force: true });\n }\n }\n return documents.manifest;\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ node_fs = require_runtime.__toESM(node_fs, 1);
|
|
|
4
4
|
let node_path = require("node:path");
|
|
5
5
|
node_path = require_runtime.__toESM(node_path, 1);
|
|
6
6
|
let node_url = require("node:url");
|
|
7
|
-
let
|
|
7
|
+
let _agimon_ai_po_core_poPackage = require("@agimon-ai/po-core/poPackage");
|
|
8
8
|
//#region src/builders/cli/entryResolution.ts
|
|
9
9
|
/** Directory of this module; the desktop bundle rewrites it to its staged package root. */
|
|
10
10
|
function moduleDirectory() {
|
|
@@ -14,9 +14,9 @@ function moduleDirectory() {
|
|
|
14
14
|
function poPackageRoot() {
|
|
15
15
|
const start = moduleDirectory();
|
|
16
16
|
let directory = node_path.default.resolve(start);
|
|
17
|
-
while ((0,
|
|
17
|
+
while ((0, _agimon_ai_po_core_poPackage.manifestName)(directory) !== _agimon_ai_po_core_poPackage.PO_PACKAGE_NAME) {
|
|
18
18
|
const parent = node_path.default.dirname(directory);
|
|
19
|
-
if (parent === directory) throw new Error(`Could not locate installed ${
|
|
19
|
+
if (parent === directory) throw new Error(`Could not locate installed ${_agimon_ai_po_core_poPackage.PO_PACKAGE_NAME} package from ${start}`);
|
|
20
20
|
directory = parent;
|
|
21
21
|
}
|
|
22
22
|
return directory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entryResolution.cjs","names":["path","fileURLToPath","manifestName","
|
|
1
|
+
{"version":3,"file":"entryResolution.cjs","names":["path","fileURLToPath","manifestName","PO_PACKAGE_NAME","fs"],"sources":["../../../../src/builders/cli/entryResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { PO_PACKAGE_NAME, manifestName } from '@agimon-ai/po-core/poPackage';\n\n/** Directory of this module; the desktop bundle rewrites it to its staged package root. */\nfunction moduleDirectory(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/** Installed package root for the source or compiled module executing sync. */\nexport function poPackageRoot(): string {\n const start = moduleDirectory();\n let directory = path.resolve(start);\n while (manifestName(directory) !== PO_PACKAGE_NAME) {\n const parent = path.dirname(directory);\n if (parent === directory) {\n throw new Error(`Could not locate installed ${PO_PACKAGE_NAME} package from ${start}`);\n }\n directory = parent;\n }\n return directory;\n}\n\n/** Distribution entries must resolve relative to po, never a dependency's installation. */\nexport function ownEntry(name: string): string {\n let directory = moduleDirectory();\n while (!fs.existsSync(path.join(directory, 'package.json'))) {\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error('Cannot locate the Po distribution');\n directory = parent;\n }\n const source = import.meta.url.endsWith('.ts');\n return path.join(directory, source ? 'src' : 'dist', 'extensions', `${name}.${source ? 'ts' : 'mjs'}`);\n}\n"],"mappings":";;;;;;;;;AAOA,SAAS,kBAA0B;CACjC,OAAOA,UAAAA,QAAK,SAAA,GAAQC,SAAAA,cAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,IAA6B,CAAC;AACpD;;AAGA,SAAgB,gBAAwB;CACtC,MAAM,QAAQ,gBAAgB;CAC9B,IAAI,YAAYD,UAAAA,QAAK,QAAQ,KAAK;CAClC,QAAA,GAAOE,6BAAAA,aAAAA,CAAa,SAAS,MAAMC,6BAAAA,iBAAiB;EAClD,MAAM,SAASH,UAAAA,QAAK,QAAQ,SAAS;EACrC,IAAI,WAAW,WACb,MAAM,IAAI,MAAM,8BAA8BG,6BAAAA,gBAAgB,gBAAgB,OAAO;EAEvF,YAAY;CACd;CACA,OAAO;AACT;;AAGA,SAAgB,SAAS,MAAsB;CAC7C,IAAI,YAAY,gBAAgB;CAChC,OAAO,CAACC,QAAAA,QAAG,WAAWJ,UAAAA,QAAK,KAAK,WAAW,cAAc,CAAC,GAAG;EAC3D,MAAM,SAASA,UAAAA,QAAK,QAAQ,SAAS;EACrC,IAAI,WAAW,WAAW,MAAM,IAAI,MAAM,mCAAmC;EAC7E,YAAY;CACd;CACA,MAAM,SAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,KAAyB,SAAS,KAAK;CAC7C,OAAOA,UAAAA,QAAK,KAAK,WAAW,SAAS,QAAQ,QAAQ,cAAc,GAAG,KAAK,GAAG,SAAS,OAAO,OAAO;AACvG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import {
|
|
4
|
+
import { PO_PACKAGE_NAME, manifestName } from "@agimon-ai/po-core/poPackage";
|
|
5
5
|
//#region src/builders/cli/entryResolution.ts
|
|
6
6
|
/** Directory of this module; the desktop bundle rewrites it to its staged package root. */
|
|
7
7
|
function moduleDirectory() {
|
|
@@ -11,9 +11,9 @@ function moduleDirectory() {
|
|
|
11
11
|
function poPackageRoot() {
|
|
12
12
|
const start = moduleDirectory();
|
|
13
13
|
let directory = path.resolve(start);
|
|
14
|
-
while (manifestName(directory) !==
|
|
14
|
+
while (manifestName(directory) !== PO_PACKAGE_NAME) {
|
|
15
15
|
const parent = path.dirname(directory);
|
|
16
|
-
if (parent === directory) throw new Error(`Could not locate installed ${
|
|
16
|
+
if (parent === directory) throw new Error(`Could not locate installed ${PO_PACKAGE_NAME} package from ${start}`);
|
|
17
17
|
directory = parent;
|
|
18
18
|
}
|
|
19
19
|
return directory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entryResolution.mjs","names":[],"sources":["../../../../src/builders/cli/entryResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport {
|
|
1
|
+
{"version":3,"file":"entryResolution.mjs","names":[],"sources":["../../../../src/builders/cli/entryResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { PO_PACKAGE_NAME, manifestName } from '@agimon-ai/po-core/poPackage';\n\n/** Directory of this module; the desktop bundle rewrites it to its staged package root. */\nfunction moduleDirectory(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\n/** Installed package root for the source or compiled module executing sync. */\nexport function poPackageRoot(): string {\n const start = moduleDirectory();\n let directory = path.resolve(start);\n while (manifestName(directory) !== PO_PACKAGE_NAME) {\n const parent = path.dirname(directory);\n if (parent === directory) {\n throw new Error(`Could not locate installed ${PO_PACKAGE_NAME} package from ${start}`);\n }\n directory = parent;\n }\n return directory;\n}\n\n/** Distribution entries must resolve relative to po, never a dependency's installation. */\nexport function ownEntry(name: string): string {\n let directory = moduleDirectory();\n while (!fs.existsSync(path.join(directory, 'package.json'))) {\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error('Cannot locate the Po distribution');\n directory = parent;\n }\n const source = import.meta.url.endsWith('.ts');\n return path.join(directory, source ? 'src' : 'dist', 'extensions', `${name}.${source ? 'ts' : 'mjs'}`);\n}\n"],"mappings":";;;;;;AAOA,SAAS,kBAA0B;CACjC,OAAO,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AACpD;;AAGA,SAAgB,gBAAwB;CACtC,MAAM,QAAQ,gBAAgB;CAC9B,IAAI,YAAY,KAAK,QAAQ,KAAK;CAClC,OAAO,aAAa,SAAS,MAAM,iBAAiB;EAClD,MAAM,SAAS,KAAK,QAAQ,SAAS;EACrC,IAAI,WAAW,WACb,MAAM,IAAI,MAAM,8BAA8B,gBAAgB,gBAAgB,OAAO;EAEvF,YAAY;CACd;CACA,OAAO;AACT;;AAGA,SAAgB,SAAS,MAAsB;CAC7C,IAAI,YAAY,gBAAgB;CAChC,OAAO,CAAC,GAAG,WAAW,KAAK,KAAK,WAAW,cAAc,CAAC,GAAG;EAC3D,MAAM,SAAS,KAAK,QAAQ,SAAS;EACrC,IAAI,WAAW,WAAW,MAAM,IAAI,MAAM,mCAAmC;EAC7E,YAAY;CACd;CACA,MAAM,SAAS,YAAY,IAAI,SAAS,KAAK;CAC7C,OAAO,KAAK,KAAK,WAAW,SAAS,QAAQ,QAAQ,cAAc,GAAG,KAAK,GAAG,SAAS,OAAO,OAAO;AACvG"}
|
|
@@ -48,7 +48,7 @@ function resolveHarnessProfile(options) {
|
|
|
48
48
|
*/
|
|
49
49
|
async function buildHarnessContext(options, telemetry = (0, _agimon_ai_po_core_runtimeLogSinkTelemetry.createHarnessTelemetry)()) {
|
|
50
50
|
const configRoot = options.configRoot ?? options.repoRoot;
|
|
51
|
-
const configured = await telemetry.runInSpan(`
|
|
51
|
+
const configured = await telemetry.runInSpan(`po_pi.${RESOLVE_CONFIG_PHASE}`, { "harness.phase": RESOLVE_CONFIG_PHASE }, async () => {
|
|
52
52
|
const majorModesConfig = (0, _agimon_ai_po_config_majorModes.loadMajorModesConfig)(configRoot, options.homeDirectory, options.environment);
|
|
53
53
|
const selectedLayers = (0, _agimon_ai_po_config_majorModes.filterHookDisabledLayers)(majorModesConfig, (0, _agimon_ai_po_config_majorModes.resolveLayers)(majorModesConfig, options.majorMode), options.hooks);
|
|
54
54
|
const profile = resolveHarnessProfile(options);
|
|
@@ -73,7 +73,7 @@ async function buildHarnessContext(options, telemetry = (0, _agimon_ai_po_core_r
|
|
|
73
73
|
const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;
|
|
74
74
|
const personaDirectory = profile?.persona;
|
|
75
75
|
const personaRoot = profile?.personaRoot ?? configRoot;
|
|
76
|
-
const resources = await telemetry.runInSpan(`
|
|
76
|
+
const resources = await telemetry.runInSpan(`po_pi.${COLLECT_RESOURCES_PHASE}`, {
|
|
77
77
|
"harness.plugin.count": plugins.length,
|
|
78
78
|
"harness.agents": options.agents,
|
|
79
79
|
"harness.mcp": options.mcp
|
|
@@ -81,10 +81,10 @@ async function buildHarnessContext(options, telemetry = (0, _agimon_ai_po_core_r
|
|
|
81
81
|
agents: options.agents,
|
|
82
82
|
mcp: options.mcp,
|
|
83
83
|
temporaryDirectory: options.resourceDirectory,
|
|
84
|
-
skillCacheDirectory: options.resourceDirectory === void 0 ? node_path.default.join((0, _agimon_ai_po_config_config.
|
|
84
|
+
skillCacheDirectory: options.resourceDirectory === void 0 ? node_path.default.join((0, _agimon_ai_po_config_config.globalPoConfigDirectory)(options.homeDirectory ?? node_os.default.homedir()), "cache", "skills", node_crypto.default.createHash("sha256").update(node_path.default.resolve(options.repoRoot)).digest("hex").slice(0, 32)) : node_path.default.join(options.resourceDirectory, "cache", "skills"),
|
|
85
85
|
mcpAllowlist,
|
|
86
86
|
sharedSkills: configured.sharedSkills,
|
|
87
|
-
pluginDataRoot: node_path.default.join((0, _agimon_ai_po_config_config.
|
|
87
|
+
pluginDataRoot: node_path.default.join((0, _agimon_ai_po_config_config.globalPoConfigDirectory)(options.homeDirectory ?? node_os.default.homedir()), "plugin-data")
|
|
88
88
|
})).catch(async (error) => {
|
|
89
89
|
await telemetry.recordError(_agimon_ai_po_core_runtimeLogSinkTelemetry.HARNESS_EVENT.resourceCollectionFailed, error, {
|
|
90
90
|
"harness.phase": COLLECT_RESOURCES_PHASE,
|
|
@@ -95,7 +95,7 @@ async function buildHarnessContext(options, telemetry = (0, _agimon_ai_po_core_r
|
|
|
95
95
|
try {
|
|
96
96
|
const defaultThemePath = await (0, _agimon_ai_po_ui_theme.writeDefaultTheme)(resources.temporaryDirectory);
|
|
97
97
|
const environment = { ...options.environment ?? process.env };
|
|
98
|
-
delete environment[_agimon_ai_po_core_mcpSession.
|
|
98
|
+
delete environment[_agimon_ai_po_core_mcpSession.PO_MCP_SESSION_ENV_VAR];
|
|
99
99
|
const profileEnvironment = (0, _agimon_ai_po_config_profiles.applyProfileEnvironment)(environment, profile?.env ?? {});
|
|
100
100
|
configurePreset(options, environment);
|
|
101
101
|
environment.NX_DAEMON ??= "false";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessContext.cjs","names":["resolveProfile","createHarnessTelemetry","loadMajorModesConfig","filterHookDisabledLayers","resolveLayers","fs","layerHookGroups","materializePluginEntries","resolvePluginEntries","resolveMcpAllowlist","resolveSharedSkills","HARNESS_EVENT","collectResources","path","globalDoomConfigDirectory","os","crypto","writeDefaultTheme","DOOM_MCP_SESSION_ENV_VAR","applyProfileEnvironment","DEFAULT_THEME_NAME","buildPersonaPrompt"],"sources":["../../../../src/builders/cli/harnessContext.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalDoomConfigDirectory } from '@agimon-ai/po-config/config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/po-config/domains';\nimport type { DomainMcpAllowlist, PluginEntry } from '@agimon-ai/po-config/domains';\nimport {\n filterHookDisabledLayers,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n} from '@agimon-ai/po-config/majorModes';\nimport type { MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { applyProfileEnvironment, buildPersonaPrompt, resolveProfile } from '@agimon-ai/po-config/profiles';\nimport type { AgentProfile } from '@agimon-ai/po-config/profiles';\nimport { DOOM_MCP_SESSION_ENV_VAR } from '@agimon-ai/po-core/mcpSession';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\nimport { resolveMcpAllowlist } from '@agimon-ai/po-domain/mcp';\nimport { materializePluginEntries } from '@agimon-ai/po-domain/plugins';\nimport { collectResources, type HarnessResources } from '@agimon-ai/po-domain/resources';\nimport { DEFAULT_THEME_NAME, writeDefaultTheme } from '@agimon-ai/po-ui/theme';\n\nimport { createHarnessSession } from '../../composition/harnessState';\nimport type { HarnessOptions } from '../../composition/types/harness';\n\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported so a session server can apply the same rules before anything reads them.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.configRoot ?? options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // A worktree reads its workspace's configuration; resources still come from the checkout.\n const configRoot = options.configRoot ?? options.repoRoot;\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(configRoot, options.homeDirectory, options.environment);\n const selectedLayers = filterHookDisabledLayers(\n majorModesConfig,\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: await materializePluginEntries(\n resolvePluginEntries(configRoot, options.domains, options.pluginDirectories),\n ),\n mcpAllowlist: resolveMcpAllowlist(configRoot, options.domains),\n sharedSkills: resolveSharedSkills(configRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? configRoot;\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by a caller that stages into a directory it owns.\n temporaryDirectory: options.resourceDirectory,\n // Per repository, under the global home, so it outlives this process's resources.\n skillCacheDirectory:\n options.resourceDirectory === undefined\n ? path.join(\n globalDoomConfigDirectory(options.homeDirectory ?? os.homedir()),\n 'cache',\n 'skills',\n crypto.createHash('sha256').update(path.resolve(options.repoRoot)).digest('hex').slice(0, 32),\n )\n : path.join(options.resourceDirectory, 'cache', 'skills'),\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n pluginDataRoot: path.join(globalDoomConfigDirectory(options.homeDirectory ?? os.homedir()), 'plugin-data'),\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...(options.environment ?? process.env) };\n // The file-backed projection published through Cordis is authoritative.\n // Never let a legacy parent-process projection leak into this Doom session.\n delete environment[DOOM_MCP_SESSION_ENV_VAR];\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.PO_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileIdentity: profile?.identity,\n profileVoice: profile?.voice,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n mcpProjection: resources.mcpProjection,\n allowProtectedWrites: options.allowProtectedWrites,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"harnessContext.cjs","names":["resolveProfile","createHarnessTelemetry","loadMajorModesConfig","filterHookDisabledLayers","resolveLayers","fs","layerHookGroups","materializePluginEntries","resolvePluginEntries","resolveMcpAllowlist","resolveSharedSkills","HARNESS_EVENT","collectResources","path","globalPoConfigDirectory","os","crypto","writeDefaultTheme","PO_MCP_SESSION_ENV_VAR","applyProfileEnvironment","DEFAULT_THEME_NAME","buildPersonaPrompt"],"sources":["../../../../src/builders/cli/harnessContext.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { globalPoConfigDirectory } from '@agimon-ai/po-config/config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/po-config/domains';\nimport type { DomainMcpAllowlist, PluginEntry } from '@agimon-ai/po-config/domains';\nimport {\n filterHookDisabledLayers,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n} from '@agimon-ai/po-config/majorModes';\nimport type { MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport { applyProfileEnvironment, buildPersonaPrompt, resolveProfile } from '@agimon-ai/po-config/profiles';\nimport type { AgentProfile } from '@agimon-ai/po-config/profiles';\nimport { PO_MCP_SESSION_ENV_VAR } from '@agimon-ai/po-core/mcpSession';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '@agimon-ai/po-core/runtimeLogSinkTelemetry';\nimport { resolveMcpAllowlist } from '@agimon-ai/po-domain/mcp';\nimport { materializePluginEntries } from '@agimon-ai/po-domain/plugins';\nimport { collectResources, type HarnessResources } from '@agimon-ai/po-domain/resources';\nimport { DEFAULT_THEME_NAME, writeDefaultTheme } from '@agimon-ai/po-ui/theme';\n\nimport { createHarnessSession } from '../../composition/harnessState';\nimport type { HarnessOptions } from '../../composition/types/harness';\n\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported so a session server can apply the same rules before anything reads them.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.configRoot ?? options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // A worktree reads its workspace's configuration; resources still come from the checkout.\n const configRoot = options.configRoot ?? options.repoRoot;\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`po_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(configRoot, options.homeDirectory, options.environment);\n const selectedLayers = filterHookDisabledLayers(\n majorModesConfig,\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: await materializePluginEntries(\n resolvePluginEntries(configRoot, options.domains, options.pluginDirectories),\n ),\n mcpAllowlist: resolveMcpAllowlist(configRoot, options.domains),\n sharedSkills: resolveSharedSkills(configRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? configRoot;\n const resources = await telemetry\n .runInSpan(\n `po_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by a caller that stages into a directory it owns.\n temporaryDirectory: options.resourceDirectory,\n // Per repository, under the global home, so it outlives this process's resources.\n skillCacheDirectory:\n options.resourceDirectory === undefined\n ? path.join(\n globalPoConfigDirectory(options.homeDirectory ?? os.homedir()),\n 'cache',\n 'skills',\n crypto.createHash('sha256').update(path.resolve(options.repoRoot)).digest('hex').slice(0, 32),\n )\n : path.join(options.resourceDirectory, 'cache', 'skills'),\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n pluginDataRoot: path.join(globalPoConfigDirectory(options.homeDirectory ?? os.homedir()), 'plugin-data'),\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...(options.environment ?? process.env) };\n // The file-backed projection published through Cordis is authoritative.\n // Never let a legacy parent-process projection leak into this Po session.\n delete environment[PO_MCP_SESSION_ENV_VAR];\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.PO_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileIdentity: profile?.identity,\n profileVoice: profile?.voice,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n mcpProjection: resources.mcpProjection,\n allowProtectedWrites: options.allowProtectedWrites,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
|