create-principles-disciple 1.132.2 → 1.132.4
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/codex-adapter/dist/codec/index.d.ts +6 -0
- package/codex-adapter/dist/codec/index.js +5 -0
- package/codex-adapter/dist/codec/input-decoder.d.ts +13 -0
- package/codex-adapter/dist/codec/input-decoder.js +103 -0
- package/codex-adapter/dist/codec/output-encoder.d.ts +32 -0
- package/codex-adapter/dist/codec/output-encoder.js +51 -0
- package/codex-adapter/dist/host-adapter.d.ts +30 -0
- package/codex-adapter/dist/host-adapter.js +28 -0
- package/codex-adapter/dist/index.d.ts +25 -0
- package/codex-adapter/dist/index.js +19 -0
- package/codex-adapter/dist/ingestion/admission.d.ts +54 -0
- package/codex-adapter/dist/ingestion/admission.js +137 -0
- package/codex-adapter/dist/ingestion/catch-up.d.ts +41 -0
- package/codex-adapter/dist/ingestion/catch-up.js +94 -0
- package/codex-adapter/dist/ingestion/codex-home.d.ts +19 -0
- package/codex-adapter/dist/ingestion/codex-home.js +43 -0
- package/codex-adapter/dist/ingestion/codex-version.d.ts +30 -0
- package/codex-adapter/dist/ingestion/codex-version.js +53 -0
- package/codex-adapter/dist/ingestion/ingestion-fields.d.ts +17 -0
- package/codex-adapter/dist/ingestion/ingestion-fields.js +28 -0
- package/codex-adapter/dist/ingestion/ingestion.d.ts +71 -0
- package/codex-adapter/dist/ingestion/ingestion.js +248 -0
- package/codex-adapter/dist/ingestion/transcript-decoder.d.ts +72 -0
- package/codex-adapter/dist/ingestion/transcript-decoder.js +485 -0
- package/codex-adapter/dist/ingestion/transcript-locate.d.ts +13 -0
- package/codex-adapter/dist/ingestion/transcript-locate.js +75 -0
- package/codex-adapter/dist/ingestion/transcript-path.d.ts +25 -0
- package/codex-adapter/dist/ingestion/transcript-path.js +87 -0
- package/codex-adapter/dist/pd-hook.d.ts +9 -0
- package/codex-adapter/dist/pd-hook.js +159 -0
- package/codex-adapter/dist/tool-semantics.d.ts +20 -0
- package/codex-adapter/dist/tool-semantics.js +27 -0
- package/codex-adapter/dist/worker/workspace-worker.d.ts +59 -0
- package/codex-adapter/dist/worker/workspace-worker.js +270 -0
- package/codex-adapter/package.json +52 -0
- package/console/dist/server/routes/update.js +187 -19
- package/console/dist/server/update/mutation-controller.d.ts +18 -0
- package/console/dist/server/update/mutation-controller.js +29 -0
- package/console/dist/server/utils/installed-layout.d.ts +1 -0
- package/console/dist/server/utils/installed-layout.js +2 -0
- package/console/package.json +1 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +15 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts +2 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js +71 -0
- package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts +2 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js +219 -0
- package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js.map +1 -0
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js +2 -3
- package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +12 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +15 -2
- package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts +50 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts.map +1 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js +93 -0
- package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js.map +1 -0
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +5 -0
- package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +152 -0
- package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/owner-review.d.ts +7 -1
- package/core/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/owner-review.js +22 -3
- package/core/dist/runtime-v2/internalization/owner-review.js.map +1 -1
- package/core/package.json +3 -2
- package/dist/installer.d.ts +32 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +198 -2
- package/dist/installer.js.map +1 -1
- package/dist/installers/codex-host-installer.d.ts.map +1 -1
- package/dist/installers/codex-host-installer.js +5 -3
- package/dist/installers/codex-host-installer.js.map +1 -1
- package/dist/update/release-manager-authority.d.ts +69 -0
- package/dist/update/release-manager-authority.d.ts.map +1 -0
- package/dist/update/release-manager-authority.js +125 -0
- package/dist/update/release-manager-authority.js.map +1 -0
- package/dist/utils/workspace-divergence.d.ts +36 -0
- package/dist/utils/workspace-divergence.d.ts.map +1 -0
- package/dist/utils/workspace-divergence.js +87 -0
- package/dist/utils/workspace-divergence.js.map +1 -0
- package/install-layout/dist/index.d.ts +5 -0
- package/install-layout/dist/index.js +1 -0
- package/install-layout/package.json +1 -1
- package/package.json +4 -2
- package/plugin/dist/bundle.js +870 -734
- package/plugin/dist/governance-audit.js +381 -247
- package/plugin/dist/openclaw-sdk.d.ts +3 -0
- package/plugin/dist/rulehost-evidence.js +420 -286
- package/plugin/dist/service/subagent-workflow/types.d.ts +2 -2
- package/plugin/dist/utils/retry.d.ts +1 -1
- package/plugin/dist/utils/workspace-resolver.d.ts +35 -4
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/release-manager/dist/i18n.d.ts +6 -0
- package/release-manager/dist/i18n.d.ts.map +1 -0
- package/release-manager/dist/i18n.js +234 -0
- package/release-manager/dist/i18n.js.map +1 -0
- package/release-manager/dist/index.d.ts +7 -0
- package/release-manager/dist/index.d.ts.map +1 -0
- package/release-manager/dist/index.js +474 -0
- package/release-manager/dist/index.js.map +1 -0
- package/release-manager/dist/installer.d.ts +217 -0
- package/release-manager/dist/installer.d.ts.map +1 -0
- package/release-manager/dist/installer.js +2451 -0
- package/release-manager/dist/installer.js.map +1 -0
- package/release-manager/dist/installers/codex-host-installer.d.ts +29 -0
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +1 -0
- package/release-manager/dist/installers/codex-host-installer.js +496 -0
- package/release-manager/dist/installers/codex-host-installer.js.map +1 -0
- package/release-manager/dist/installers/index.d.ts +40 -0
- package/release-manager/dist/installers/index.d.ts.map +1 -0
- package/release-manager/dist/installers/index.js +35 -0
- package/release-manager/dist/installers/index.js.map +1 -0
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +18 -0
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +1 -0
- package/release-manager/dist/installers/openclaw-host-installer.js +414 -0
- package/release-manager/dist/installers/openclaw-host-installer.js.map +1 -0
- package/release-manager/dist/mvp-config.d.ts +197 -0
- package/release-manager/dist/mvp-config.d.ts.map +1 -0
- package/release-manager/dist/mvp-config.js +509 -0
- package/release-manager/dist/mvp-config.js.map +1 -0
- package/release-manager/dist/prompts.d.ts +30 -0
- package/release-manager/dist/prompts.d.ts.map +1 -0
- package/release-manager/dist/prompts.js +231 -0
- package/release-manager/dist/prompts.js.map +1 -0
- package/release-manager/dist/skill-language.d.ts +32 -0
- package/release-manager/dist/skill-language.d.ts.map +1 -0
- package/release-manager/dist/skill-language.js +107 -0
- package/release-manager/dist/skill-language.js.map +1 -0
- package/release-manager/dist/uninstaller.d.ts +55 -0
- package/release-manager/dist/uninstaller.d.ts.map +1 -0
- package/release-manager/dist/uninstaller.js +409 -0
- package/release-manager/dist/uninstaller.js.map +1 -0
- package/release-manager/dist/update/atomic-file.d.ts +35 -0
- package/release-manager/dist/update/atomic-file.d.ts.map +1 -0
- package/release-manager/dist/update/atomic-file.js +120 -0
- package/release-manager/dist/update/atomic-file.js.map +1 -0
- package/release-manager/dist/update/bootstrap-protocol.d.ts +55 -0
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +1 -0
- package/release-manager/dist/update/bootstrap-protocol.js +132 -0
- package/release-manager/dist/update/bootstrap-protocol.js.map +1 -0
- package/release-manager/dist/update/channel-metadata.d.ts +28 -0
- package/release-manager/dist/update/channel-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/channel-metadata.js +90 -0
- package/release-manager/dist/update/channel-metadata.js.map +1 -0
- package/release-manager/dist/update/channel-promotion.d.ts +39 -0
- package/release-manager/dist/update/channel-promotion.d.ts.map +1 -0
- package/release-manager/dist/update/channel-promotion.js +55 -0
- package/release-manager/dist/update/channel-promotion.js.map +1 -0
- package/release-manager/dist/update/data-compatibility.d.ts +35 -0
- package/release-manager/dist/update/data-compatibility.d.ts.map +1 -0
- package/release-manager/dist/update/data-compatibility.js +45 -0
- package/release-manager/dist/update/data-compatibility.js.map +1 -0
- package/release-manager/dist/update/install-layout.d.ts +59 -0
- package/release-manager/dist/update/install-layout.d.ts.map +1 -0
- package/release-manager/dist/update/install-layout.js +127 -0
- package/release-manager/dist/update/install-layout.js.map +1 -0
- package/release-manager/dist/update/legacy-migration.d.ts +56 -0
- package/release-manager/dist/update/legacy-migration.d.ts.map +1 -0
- package/release-manager/dist/update/legacy-migration.js +254 -0
- package/release-manager/dist/update/legacy-migration.js.map +1 -0
- package/release-manager/dist/update/product-identity.d.ts +50 -0
- package/release-manager/dist/update/product-identity.d.ts.map +1 -0
- package/release-manager/dist/update/product-identity.js +63 -0
- package/release-manager/dist/update/product-identity.js.map +1 -0
- package/release-manager/dist/update/release-asset-manifest.d.ts +31 -0
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +1 -0
- package/release-manager/dist/update/release-asset-manifest.js +161 -0
- package/release-manager/dist/update/release-asset-manifest.js.map +1 -0
- package/release-manager/dist/update/release-identity.d.ts +33 -0
- package/release-manager/dist/update/release-identity.d.ts.map +1 -0
- package/release-manager/dist/update/release-identity.js +108 -0
- package/release-manager/dist/update/release-identity.js.map +1 -0
- package/release-manager/dist/update/release-manager-authority.d.ts +69 -0
- package/release-manager/dist/update/release-manager-authority.d.ts.map +1 -0
- package/release-manager/dist/update/release-manager-authority.js +125 -0
- package/release-manager/dist/update/release-manager-authority.js.map +1 -0
- package/release-manager/dist/update/release-manager.d.ts +96 -0
- package/release-manager/dist/update/release-manager.d.ts.map +1 -0
- package/release-manager/dist/update/release-manager.js +253 -0
- package/release-manager/dist/update/release-manager.js.map +1 -0
- package/release-manager/dist/update/release-metadata.d.ts +57 -0
- package/release-manager/dist/update/release-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/release-metadata.js +200 -0
- package/release-manager/dist/update/release-metadata.js.map +1 -0
- package/release-manager/dist/update/release-policy.d.ts +51 -0
- package/release-manager/dist/update/release-policy.d.ts.map +1 -0
- package/release-manager/dist/update/release-policy.js +103 -0
- package/release-manager/dist/update/release-policy.js.map +1 -0
- package/release-manager/dist/update/rollback-policy.d.ts +56 -0
- package/release-manager/dist/update/rollback-policy.d.ts.map +1 -0
- package/release-manager/dist/update/rollback-policy.js +61 -0
- package/release-manager/dist/update/rollback-policy.js.map +1 -0
- package/release-manager/dist/update/transaction-journal.d.ts +131 -0
- package/release-manager/dist/update/transaction-journal.d.ts.map +1 -0
- package/release-manager/dist/update/transaction-journal.js +346 -0
- package/release-manager/dist/update/transaction-journal.js.map +1 -0
- package/release-manager/dist/update/trust-metadata.d.ts +55 -0
- package/release-manager/dist/update/trust-metadata.d.ts.map +1 -0
- package/release-manager/dist/update/trust-metadata.js +170 -0
- package/release-manager/dist/update/trust-metadata.js.map +1 -0
- package/release-manager/dist/update/update-history.d.ts +46 -0
- package/release-manager/dist/update/update-history.d.ts.map +1 -0
- package/release-manager/dist/update/update-history.js +123 -0
- package/release-manager/dist/update/update-history.js.map +1 -0
- package/release-manager/dist/utils/config-file-io.d.ts +26 -0
- package/release-manager/dist/utils/config-file-io.d.ts.map +1 -0
- package/release-manager/dist/utils/config-file-io.js +128 -0
- package/release-manager/dist/utils/config-file-io.js.map +1 -0
- package/release-manager/dist/utils/env.d.ts +60 -0
- package/release-manager/dist/utils/env.d.ts.map +1 -0
- package/release-manager/dist/utils/env.js +308 -0
- package/release-manager/dist/utils/env.js.map +1 -0
- package/release-manager/dist/utils/logger.d.ts +15 -0
- package/release-manager/dist/utils/logger.d.ts.map +1 -0
- package/release-manager/dist/utils/logger.js +30 -0
- package/release-manager/dist/utils/logger.js.map +1 -0
- package/release-manager/dist/utils/workspace-divergence.d.ts +36 -0
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +1 -0
- package/release-manager/dist/utils/workspace-divergence.js +87 -0
- package/release-manager/dist/utils/workspace-divergence.js.map +1 -0
- package/release-manager/package.json +79 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClawHostInstaller — implements HostInstaller for OpenClaw (ADR-0020 §2.3)
|
|
3
|
+
*
|
|
4
|
+
* Wraps the existing OpenClaw config write/cleanup logic that previously lived
|
|
5
|
+
* as private functions in installer.ts and uninstaller.ts. Extracted into a
|
|
6
|
+
* class so the CLI can route install/uninstall by --host (openclaw | codex).
|
|
7
|
+
*
|
|
8
|
+
* NO BEHAVIOR CHANGE: the logic is identical to the pre-refactor private
|
|
9
|
+
* functions updateOpenClawConfig() / cleanupOpenClawConfig(). The existing
|
|
10
|
+
* install() / uninstall() entry points delegate to this class.
|
|
11
|
+
*
|
|
12
|
+
* Runtime Contract Rules:
|
|
13
|
+
* - rc-1-treat-as-unknown: openclaw.json parsed as unknown, validated.
|
|
14
|
+
* - rc-2-no-as-bypass: uses Object.hasOwn + typeof guards, not `as`.
|
|
15
|
+
* - rc-3-fail-loud-missing: malformed openclaw.json throws.
|
|
16
|
+
* - rc-5-object-hasown-not-in: uses Object.hasOwn for untrusted keys.
|
|
17
|
+
* - rc-9-no-silent-fallback: every result includes reason + nextAction.
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import * as os from 'os';
|
|
22
|
+
import { validateOpenClawConfig } from '../mvp-config.js';
|
|
23
|
+
// PRI-343: Keep in sync with @principles/core CONVERSATION_ACCESS_CONFIG_KEY
|
|
24
|
+
const CONVERSATION_ACCESS_CONFIG_KEY = 'allowConversationAccess';
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Type guard: extracts `.code` from a thrown error without `as NodeJS.ErrnoException`.
|
|
30
|
+
* ESLint `no-undef` flags the `NodeJS` namespace; this helper avoids it.
|
|
31
|
+
*/
|
|
32
|
+
function getErrorCode(err) {
|
|
33
|
+
if (err !== null && typeof err === 'object' && Object.hasOwn(err, 'code')) {
|
|
34
|
+
const { code } = err;
|
|
35
|
+
return typeof code === 'string' ? code : undefined;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* PRI-343: Pure function — deep-merges allowConversationAccess: true into
|
|
41
|
+
* the openclaw.json config without mutating the input.
|
|
42
|
+
*
|
|
43
|
+
* Ensures plugins.entries['principles-disciple'].hooks.allowConversationAccess
|
|
44
|
+
* is set to true, creating intermediate objects if missing.
|
|
45
|
+
* Preserves all other fields.
|
|
46
|
+
*/
|
|
47
|
+
function ensureConversationAccess(config) {
|
|
48
|
+
const result = { ...config };
|
|
49
|
+
if (!isRecord(result.plugins))
|
|
50
|
+
return result;
|
|
51
|
+
const plugins = { ...result.plugins };
|
|
52
|
+
if (!isRecord(plugins.entries))
|
|
53
|
+
return result;
|
|
54
|
+
const entries = { ...plugins.entries };
|
|
55
|
+
const rawEntry = entries['principles-disciple'];
|
|
56
|
+
const entry = isRecord(rawEntry)
|
|
57
|
+
? { ...rawEntry }
|
|
58
|
+
: { enabled: true };
|
|
59
|
+
const rawHooks = entry.hooks;
|
|
60
|
+
const hooks = isRecord(rawHooks) ? { ...rawHooks } : {};
|
|
61
|
+
hooks[CONVERSATION_ACCESS_CONFIG_KEY] = true;
|
|
62
|
+
entry.hooks = hooks;
|
|
63
|
+
entries['principles-disciple'] = entry;
|
|
64
|
+
plugins.entries = entries;
|
|
65
|
+
result.plugins = plugins;
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
function getOpenClawDir() {
|
|
69
|
+
return path.join(os.homedir(), '.openclaw');
|
|
70
|
+
}
|
|
71
|
+
function getPluginExtDir() {
|
|
72
|
+
return path.join(getOpenClawDir(), 'extensions', 'principles-disciple');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* OpenClaw host installer — writes/merges ~/.openclaw/openclaw.json and
|
|
76
|
+
* ~/.openclaw/plugins/installs.json. Does NOT install bundled components
|
|
77
|
+
* (core/pd-cli/console) — that's the shared installer's job.
|
|
78
|
+
*/
|
|
79
|
+
export class OpenClawHostInstaller {
|
|
80
|
+
hostId = 'openclaw';
|
|
81
|
+
async install(_ctx) {
|
|
82
|
+
// OpenClaw install does not use workspaceDir from ctx — OpenClaw resolves
|
|
83
|
+
// workspace from its own gateway config. The parameter is required by
|
|
84
|
+
// the HostInstaller interface contract.
|
|
85
|
+
void _ctx;
|
|
86
|
+
const configDir = getOpenClawDir();
|
|
87
|
+
const configPath = path.join(configDir, 'openclaw.json');
|
|
88
|
+
// CodeQL TOCTOU fix: use try/catch read instead of existsSync+readFileSync.
|
|
89
|
+
// The OpenClaw gateway creates openclaw.json on first run; if it doesn't
|
|
90
|
+
// exist, PD's config is inert until the gateway starts. Not an error.
|
|
91
|
+
let rawConfig;
|
|
92
|
+
try {
|
|
93
|
+
rawConfig = readFileSync(configPath, 'utf-8');
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const code = getErrorCode(err);
|
|
97
|
+
if (code === 'ENOENT') {
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
hostId: this.hostId,
|
|
101
|
+
configPath,
|
|
102
|
+
configAction: 'skipped',
|
|
103
|
+
reason: 'openclaw.json does not exist yet — PD plugin entries will be registered when OpenClaw gateway first starts.',
|
|
104
|
+
nextAction: `Start OpenClaw gateway (openclaw gateway start), then verify: openclaw plugin list`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const config = JSON.parse(rawConfig);
|
|
111
|
+
const validation = validateOpenClawConfig(config);
|
|
112
|
+
if (!validation.valid) {
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
hostId: this.hostId,
|
|
116
|
+
configPath,
|
|
117
|
+
configAction: 'skipped',
|
|
118
|
+
reason: `Malformed openclaw.json: ${validation.error}.`,
|
|
119
|
+
nextAction: 'Fix ~/.openclaw/openclaw.json manually, then re-run: npx create-principles-disciple install --host openclaw',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (config === null || typeof config !== 'object' || Array.isArray(config)) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
hostId: this.hostId,
|
|
126
|
+
configPath,
|
|
127
|
+
configAction: 'skipped',
|
|
128
|
+
reason: 'openclaw.json parsed as non-object.',
|
|
129
|
+
nextAction: 'Fix ~/.openclaw/openclaw.json manually, then re-run installer.',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// rc-2: isRecord narrows config to Record<string, unknown> without `as` cast.
|
|
133
|
+
const configObj = isRecord(config) ? { ...config } : {};
|
|
134
|
+
// Ensure plugins.allow includes principles-disciple
|
|
135
|
+
if (!configObj.plugins)
|
|
136
|
+
configObj.plugins = {};
|
|
137
|
+
if (!isRecord(configObj.plugins)) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
hostId: this.hostId,
|
|
141
|
+
configPath,
|
|
142
|
+
configAction: 'skipped',
|
|
143
|
+
reason: 'openclaw.json plugins field is malformed (not an object).',
|
|
144
|
+
nextAction: 'Fix ~/.openclaw/openclaw.json plugins field manually, then re-run installer.',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const plugins = { ...configObj.plugins };
|
|
148
|
+
// plugins.allow: append ONLY when the user already has an allow list —
|
|
149
|
+
// never create one. Once plugins.allow is non-empty, OpenClaw silently
|
|
150
|
+
// disables every discovered non-bundled plugin that is NOT on the list,
|
|
151
|
+
// so creating allow=["principles-disciple"] on a machine that already
|
|
152
|
+
// auto-loads other plugins (e.g. feishu / tavily) would disable those
|
|
153
|
+
// plugins. An absent allow list keeps the previous auto-load behavior
|
|
154
|
+
// (OpenClaw logs an informational notice instead).
|
|
155
|
+
const allowWasAbsent = plugins.allow === undefined || plugins.allow === null;
|
|
156
|
+
if (!allowWasAbsent) {
|
|
157
|
+
if (!Array.isArray(plugins.allow)) {
|
|
158
|
+
return {
|
|
159
|
+
success: false,
|
|
160
|
+
hostId: this.hostId,
|
|
161
|
+
configPath,
|
|
162
|
+
configAction: 'skipped',
|
|
163
|
+
reason: 'openclaw.json plugins.allow is not an array.',
|
|
164
|
+
nextAction: 'Fix ~/.openclaw/openclaw.json plugins.allow manually, then re-run installer.',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const allow = plugins.allow.filter((a) => typeof a === 'string');
|
|
168
|
+
if (!allow.includes('principles-disciple')) {
|
|
169
|
+
allow.push('principles-disciple');
|
|
170
|
+
}
|
|
171
|
+
plugins.allow = allow;
|
|
172
|
+
}
|
|
173
|
+
if (!plugins.entries)
|
|
174
|
+
plugins.entries = {};
|
|
175
|
+
if (!isRecord(plugins.entries)) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
hostId: this.hostId,
|
|
179
|
+
configPath,
|
|
180
|
+
configAction: 'skipped',
|
|
181
|
+
reason: 'openclaw.json plugins.entries is malformed.',
|
|
182
|
+
nextAction: 'Fix ~/.openclaw/openclaw.json plugins.entries manually, then re-run installer.',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const entries = { ...plugins.entries };
|
|
186
|
+
const existingEntry = isRecord(entries['principles-disciple'])
|
|
187
|
+
? { ...entries['principles-disciple'] }
|
|
188
|
+
: {};
|
|
189
|
+
entries['principles-disciple'] = { ...existingEntry, enabled: true };
|
|
190
|
+
plugins.entries = entries;
|
|
191
|
+
configObj.plugins = plugins;
|
|
192
|
+
// PRI-343: deep-merge allowConversationAccess: true
|
|
193
|
+
const mergedConfigObj = ensureConversationAccess(configObj);
|
|
194
|
+
writeFileSync(configPath, JSON.stringify(mergedConfigObj, null, 2));
|
|
195
|
+
// Write install record to installs.json (the canonical store)
|
|
196
|
+
this.writeInstallRecord(configDir);
|
|
197
|
+
return {
|
|
198
|
+
success: true,
|
|
199
|
+
hostId: this.hostId,
|
|
200
|
+
configPath,
|
|
201
|
+
configAction: 'updated',
|
|
202
|
+
nextAction: allowWasAbsent
|
|
203
|
+
? 'Verify: openclaw plugin list. Note: plugins.allow was absent and was deliberately NOT created — a non-empty allow list silently disables every other discovered plugin not on it. To silence OpenClaw\u2019s allow-list notice, add ALL discovered plugin ids (see the gateway log) to plugins.allow yourself.'
|
|
204
|
+
: 'Verify: openclaw plugin list (should show principles-disciple as enabled)',
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
hostId: this.hostId,
|
|
212
|
+
configPath,
|
|
213
|
+
configAction: 'skipped',
|
|
214
|
+
reason: `Failed to update openclaw.json: ${reason}`,
|
|
215
|
+
nextAction: 'Check file permissions on ~/.openclaw/openclaw.json and re-run installer.',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Write install record to ~/.openclaw/plugins/installs.json.
|
|
221
|
+
* Non-fatal on failure — OpenClaw manages this file and will self-heal.
|
|
222
|
+
*/
|
|
223
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
224
|
+
writeInstallRecord(configDir) {
|
|
225
|
+
const installsDir = path.join(configDir, 'plugins');
|
|
226
|
+
const installsPath = path.join(installsDir, 'installs.json');
|
|
227
|
+
try {
|
|
228
|
+
// CodeQL TOCTOU fix: mkdirSync is idempotent (no pre-check needed);
|
|
229
|
+
// readFileSync uses try/catch instead of existsSync+read.
|
|
230
|
+
if (!existsSync(installsDir)) {
|
|
231
|
+
mkdirSync(installsDir, { recursive: true });
|
|
232
|
+
}
|
|
233
|
+
// rc-3/rc-9: Only initialize a fresh record on ENOENT (file doesn't exist).
|
|
234
|
+
// For any other read/parse failure (EACCES, EIO, malformed JSON), or when the
|
|
235
|
+
// parsed value is not a record, RETURN without writing — overwriting would
|
|
236
|
+
// destroy other plugins' installRecords. Non-fatal: OpenClaw self-heals.
|
|
237
|
+
let installs;
|
|
238
|
+
try {
|
|
239
|
+
const raw = readFileSync(installsPath, 'utf-8');
|
|
240
|
+
const parsed = JSON.parse(raw);
|
|
241
|
+
if (!isRecord(parsed)) {
|
|
242
|
+
// Parsed to a non-object (array/string/null) — preserve original file.
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
// rc-3/rc-9: if installRecords exists but is not a record (null/array/
|
|
246
|
+
// string), preserve the original file rather than overwriting it with
|
|
247
|
+
// an empty object. Missing installRecords is a compatible format and
|
|
248
|
+
// will be initialized to {} below (CodeRabbit #3762804744).
|
|
249
|
+
if (Object.hasOwn(parsed, 'installRecords') && !isRecord(parsed.installRecords)) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
installs = parsed;
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
const code = getErrorCode(err);
|
|
256
|
+
if (code === 'ENOENT') {
|
|
257
|
+
// File doesn't exist — initialize fresh record (first install).
|
|
258
|
+
installs = { version: 1, installRecords: {} };
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// EACCES / EIO / malformed JSON — preserve original file, do not overwrite.
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// rc-2: isRecord narrows installRecords without `as` cast (ERR-001 recurrence).
|
|
266
|
+
// Replaces the prior `typeof !== 'object'` check — isRecord also rejects arrays,
|
|
267
|
+
// which the old check silently allowed through.
|
|
268
|
+
const installRecords = isRecord(installs.installRecords)
|
|
269
|
+
? installs.installRecords
|
|
270
|
+
: {};
|
|
271
|
+
const extDir = getPluginExtDir();
|
|
272
|
+
const pkgPath = path.join(extDir, 'package.json');
|
|
273
|
+
let version = undefined;
|
|
274
|
+
try {
|
|
275
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
276
|
+
if (isRecord(pkg) && Object.hasOwn(pkg, 'version') && typeof pkg.version === 'string') {
|
|
277
|
+
({ version } = pkg);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch { /* ignore — ENOENT or malformed package.json */ }
|
|
281
|
+
installRecords['principles-disciple'] = {
|
|
282
|
+
source: 'path',
|
|
283
|
+
installPath: extDir,
|
|
284
|
+
...(version ? { version } : {}),
|
|
285
|
+
installedAt: new Date().toISOString(),
|
|
286
|
+
};
|
|
287
|
+
installs.installRecords = installRecords;
|
|
288
|
+
writeFileSync(installsPath, JSON.stringify(installs, null, 2));
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Non-fatal — installs.json is managed by OpenClaw and will self-heal
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async uninstall(_ctx) {
|
|
295
|
+
const configDir = getOpenClawDir();
|
|
296
|
+
const configPath = path.join(configDir, 'openclaw.json');
|
|
297
|
+
const removedPaths = [];
|
|
298
|
+
const preservedPaths = [];
|
|
299
|
+
// CodeQL TOCTOU fix: try/catch read instead of existsSync+readFileSync.
|
|
300
|
+
let raw;
|
|
301
|
+
try {
|
|
302
|
+
raw = readFileSync(configPath, 'utf-8');
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
const code = getErrorCode(err);
|
|
306
|
+
if (code === 'ENOENT') {
|
|
307
|
+
return {
|
|
308
|
+
success: true,
|
|
309
|
+
hostId: this.hostId,
|
|
310
|
+
removedPaths,
|
|
311
|
+
preservedPaths,
|
|
312
|
+
nextAction: 'openclaw.json not found — nothing to clean.',
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
throw err;
|
|
316
|
+
}
|
|
317
|
+
try {
|
|
318
|
+
const config = JSON.parse(raw);
|
|
319
|
+
if (config === null || typeof config !== 'object' || Array.isArray(config)) {
|
|
320
|
+
return {
|
|
321
|
+
success: false,
|
|
322
|
+
hostId: this.hostId,
|
|
323
|
+
removedPaths,
|
|
324
|
+
preservedPaths,
|
|
325
|
+
reason: 'openclaw.json is not an object',
|
|
326
|
+
nextAction: 'Inspect ~/.openclaw/openclaw.json manually; PD entries may still be present.',
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// rc-2: isRecord narrows without `as` cast.
|
|
330
|
+
const configObj = isRecord(config) ? config : {};
|
|
331
|
+
let modified = false;
|
|
332
|
+
if (isRecord(configObj.plugins)) {
|
|
333
|
+
const { plugins } = configObj;
|
|
334
|
+
// Remove from plugins.allow
|
|
335
|
+
if (Array.isArray(plugins.allow)) {
|
|
336
|
+
const before = plugins.allow.length;
|
|
337
|
+
const filtered = plugins.allow.filter((a) => typeof a === 'string' && a !== 'principles-disciple');
|
|
338
|
+
plugins.allow = filtered;
|
|
339
|
+
if (filtered.length !== before)
|
|
340
|
+
modified = true;
|
|
341
|
+
}
|
|
342
|
+
// Remove from plugins.entries
|
|
343
|
+
if (isRecord(plugins.entries)) {
|
|
344
|
+
const { entries } = plugins;
|
|
345
|
+
if (Object.hasOwn(entries, 'principles-disciple')) {
|
|
346
|
+
delete entries['principles-disciple'];
|
|
347
|
+
modified = true;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Remove from plugins.installs (legacy field)
|
|
351
|
+
if (isRecord(plugins.installs)) {
|
|
352
|
+
const { installs } = plugins;
|
|
353
|
+
if (Object.hasOwn(installs, 'principles-disciple')) {
|
|
354
|
+
delete installs['principles-disciple'];
|
|
355
|
+
modified = true;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (modified) {
|
|
360
|
+
writeFileSync(configPath, JSON.stringify(configObj, null, 2) + '\n');
|
|
361
|
+
removedPaths.push(configPath);
|
|
362
|
+
return {
|
|
363
|
+
success: true,
|
|
364
|
+
hostId: this.hostId,
|
|
365
|
+
removedPaths,
|
|
366
|
+
preservedPaths,
|
|
367
|
+
nextAction: 'openclaw.json cleaned — principles-disciple entries removed.',
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
success: true,
|
|
372
|
+
hostId: this.hostId,
|
|
373
|
+
removedPaths,
|
|
374
|
+
preservedPaths,
|
|
375
|
+
nextAction: 'openclaw.json had no principles-disciple entries — nothing to clean.',
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
380
|
+
return {
|
|
381
|
+
success: false,
|
|
382
|
+
hostId: this.hostId,
|
|
383
|
+
removedPaths,
|
|
384
|
+
preservedPaths,
|
|
385
|
+
reason,
|
|
386
|
+
nextAction: 'Inspect ~/.openclaw/openclaw.json manually; PD entries may still be present.',
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
391
|
+
detect() {
|
|
392
|
+
const configDir = getOpenClawDir();
|
|
393
|
+
// detect() is non-interactive; use English labels (stable, no i18n dep).
|
|
394
|
+
const paths = [
|
|
395
|
+
{
|
|
396
|
+
exists: existsSync(getPluginExtDir()),
|
|
397
|
+
path: getPluginExtDir(),
|
|
398
|
+
name: 'Plugin extension directory',
|
|
399
|
+
type: 'dir',
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
exists: existsSync(path.join(configDir, 'principles-disciple.json')),
|
|
403
|
+
path: path.join(configDir, 'principles-disciple.json'),
|
|
404
|
+
name: 'OpenClaw config file',
|
|
405
|
+
type: 'file',
|
|
406
|
+
},
|
|
407
|
+
];
|
|
408
|
+
return {
|
|
409
|
+
installed: paths.some((p) => p.exists),
|
|
410
|
+
paths,
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=openclaw-host-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-host-installer.js","sourceRoot":"","sources":["../../src/installers/openclaw-host-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
export declare const MVP_CHANNELS: readonly ['prompt', 'code_tool_hook', 'defer_archive'];
|
|
2
|
+
export type MvpChannel = (typeof MVP_CHANNELS)[number];
|
|
3
|
+
export declare const MVP_QUIET_FLAGS: readonly ['gfi'];
|
|
4
|
+
export declare const MVP_GONE_FLAGS: readonly ['nocturnal', 'idle_trigger'];
|
|
5
|
+
/**
|
|
6
|
+
* Product-level feedback defaults (PRI-543). The PD 控制台的"意见反馈"收集的是
|
|
7
|
+
* 使用者对 PD 产品的功能建议 / Bug,接收者是 PD 项目所有者,而非使用者自己。
|
|
8
|
+
* 因此 installer 生成的默认 config 预置:
|
|
9
|
+
* - `maintainer_email`:产品所有者的邮箱(兜底邮箱通道发到这里)。
|
|
10
|
+
* - `ingest_url` + `ingest_token`:主通道,让新装使用者开箱即可把反馈经 Cloudflare
|
|
11
|
+
* relay 落到所有者的 Linear,无需使用者自行配置。
|
|
12
|
+
*
|
|
13
|
+
* `ingest_token` 是随发布版分发的固定"产品公共令牌",按 spec §9.2 属反滥用边界
|
|
14
|
+
* (非安全边界),靠 relay 端 IP 限流兜底。改动此值必须同步更新 Cloudflare Pages
|
|
15
|
+
* secret `INGEST_TOKEN` 为同一值,并更新 `packages/website` 端 relay 的校验常量;
|
|
16
|
+
* 同时保持与 `tests/mvp-config.test.ts` 的断言一致(spec §10 双点同步)。
|
|
17
|
+
*/
|
|
18
|
+
export declare const PRODUCT_FEEDBACK_MAINTAINER_EMAIL = "csuzngjh@hotmail.com";
|
|
19
|
+
export declare const PRODUCT_FEEDBACK_INGEST_URL = "https://principles-website.pages.dev/api/feedback";
|
|
20
|
+
export declare const PRODUCT_FEEDBACK_INGEST_TOKEN = "pd_prod_pdxk4of3grc9vws2uz7te8iy";
|
|
21
|
+
export interface ComponentStatus {
|
|
22
|
+
plugin: 'verified' | 'failed' | 'skipped';
|
|
23
|
+
cli: 'verified' | 'verified_local_only' | 'failed' | 'skipped';
|
|
24
|
+
console: 'configured' | 'skipped';
|
|
25
|
+
consoleEntrypoint?: string;
|
|
26
|
+
cliLocalPath?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface VerificationResult {
|
|
29
|
+
features: 'passed' | 'failed' | 'skipped';
|
|
30
|
+
storyA: 'passed' | 'failed' | 'skipped';
|
|
31
|
+
storyASkipReason?: string;
|
|
32
|
+
manifestActivation?: 'verified' | 'missing_hook' | 'missing_setup_entry' | 'skipped';
|
|
33
|
+
}
|
|
34
|
+
export interface InstallSuccessOutput {
|
|
35
|
+
success: true;
|
|
36
|
+
workspace: string;
|
|
37
|
+
components: ComponentStatus;
|
|
38
|
+
enabledChannels: MvpChannel[];
|
|
39
|
+
verification: VerificationResult;
|
|
40
|
+
nextAction: string;
|
|
41
|
+
/** Task 8: when the installer auto-launches the console via `pd console open`,
|
|
42
|
+
* this holds the URL the browser was opened to (ends with /welcome). Undefined
|
|
43
|
+
* when auto-launch was not performed or failed. */
|
|
44
|
+
consoleUrl?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface InstallFailureOutput {
|
|
47
|
+
success: false;
|
|
48
|
+
reason: string;
|
|
49
|
+
nextAction: string;
|
|
50
|
+
components?: Partial<ComponentStatus>;
|
|
51
|
+
verification?: Partial<VerificationResult>;
|
|
52
|
+
}
|
|
53
|
+
export type InstallOutput = InstallSuccessOutput | InstallFailureOutput;
|
|
54
|
+
export declare function validateMvpChannels(channels: unknown): {
|
|
55
|
+
valid: MvpChannel[];
|
|
56
|
+
unknowns: string[];
|
|
57
|
+
};
|
|
58
|
+
export declare function parseChannelsOption(raw: unknown): {
|
|
59
|
+
channels: MvpChannel[];
|
|
60
|
+
unknowns: string[];
|
|
61
|
+
error?: string;
|
|
62
|
+
};
|
|
63
|
+
export declare function validateOpenClawConfig(config: unknown): {
|
|
64
|
+
valid: boolean;
|
|
65
|
+
error?: string;
|
|
66
|
+
};
|
|
67
|
+
export interface BuildOutputOptions {
|
|
68
|
+
workspace: string;
|
|
69
|
+
components: ComponentStatus;
|
|
70
|
+
channels: MvpChannel[];
|
|
71
|
+
verification: VerificationResult;
|
|
72
|
+
/** Task 8: URL the browser was opened to when the installer auto-launched the
|
|
73
|
+
* console. When provided and the install is complete, the success output's
|
|
74
|
+
* nextAction references this URL instead of the manual "pd console" instruction. */
|
|
75
|
+
consoleUrl?: string;
|
|
76
|
+
}
|
|
77
|
+
export declare function buildSuccessOutput(opts: BuildOutputOptions): InstallOutput;
|
|
78
|
+
export declare function buildFailureOutput(reason: string, nextAction: string): InstallFailureOutput;
|
|
79
|
+
export declare function isMvpChannel(value: string): value is MvpChannel;
|
|
80
|
+
export declare function getHomeDir(): string;
|
|
81
|
+
export declare function getOpenClawDir(): string;
|
|
82
|
+
/** Host-neutral PD installation root. Shared runtime must not live under a
|
|
83
|
+
* host's discovery directory (ADR-0020 / ERR-097). */
|
|
84
|
+
export declare function getPdDir(): string;
|
|
85
|
+
export declare function getPdRuntimeDir(): string;
|
|
86
|
+
export declare function getInstallManifestPath(): string;
|
|
87
|
+
export declare function getPdRuntimeBackupsDir(): string;
|
|
88
|
+
export declare function getPluginExtDir(): string;
|
|
89
|
+
/** Common plugin package used by pd-cli/console. OpenClaw gets an adapter copy
|
|
90
|
+
* under getPluginExtDir(); Codex-only installs use this host-neutral copy. */
|
|
91
|
+
export declare function getInstalledPluginDir(): string;
|
|
92
|
+
export declare function getInstalledLayoutPackageDir(): string;
|
|
93
|
+
/**
|
|
94
|
+
* PD 备份根目录(~/.openclaw/pd-backups)—— 必须位于 extensions/ 之外。
|
|
95
|
+
* OpenClaw 插件发现会扫描 extensions/ 下每个子目录;备份目录内含
|
|
96
|
+
* package.json(openclaw.extensions) + dist/bundle.js 时会被识别为第二个
|
|
97
|
+
* principles-disciple 插件,导致每次 gateway 启动都出现
|
|
98
|
+
* "duplicate plugin id detected" 告警。备份一律放这里,禁止放 extensions/ 内。
|
|
99
|
+
*/
|
|
100
|
+
export declare function getPdBackupsDir(): string;
|
|
101
|
+
export declare function getInstalledPdCliDir(): string;
|
|
102
|
+
export declare function getInstalledBinDir(): string;
|
|
103
|
+
export declare function getInstalledConsoleDir(): string;
|
|
104
|
+
export declare function isWindows(): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Fix-4 (P0-BUG-4): Optional runtime profile input collected by the installer
|
|
107
|
+
* prompt flow. When provided, the generated config.yaml's `pd.default` profile
|
|
108
|
+
* is pre-filled instead of left empty, so LLM-dependent features (diagnose,
|
|
109
|
+
* candidate intake, internalization) work on first run instead of failing
|
|
110
|
+
* silently (rc-9: no silent fallback).
|
|
111
|
+
*
|
|
112
|
+
* All fields optional — if undefined, the corresponding config field stays
|
|
113
|
+
* empty (backward compatible with the previous behavior).
|
|
114
|
+
*/
|
|
115
|
+
export interface RuntimeProfileInput {
|
|
116
|
+
provider?: string;
|
|
117
|
+
model?: string;
|
|
118
|
+
apiKeyEnv?: string;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* PRI-308: Generate .pd/config.yaml content.
|
|
122
|
+
*
|
|
123
|
+
* This replaces the old feature-flags.yaml generation.
|
|
124
|
+
* The config.yaml follows the PdConfig schema from principles-core
|
|
125
|
+
* (pd-config-types.ts), inlined to avoid a runtime dependency.
|
|
126
|
+
*
|
|
127
|
+
* Fix-4 (P0-BUG-4): `runtimeProfile` optional parameter — when provided,
|
|
128
|
+
* the `pd.default` profile is pre-filled with user-supplied values instead
|
|
129
|
+
* of being left empty. Empty profile causes LLM features to fail silently.
|
|
130
|
+
*
|
|
131
|
+
* PRI-543 (slice 5): `maintainerEmail` optional parameter — when provided,
|
|
132
|
+
* it pre-fills `feedback.maintainer_email` so the email fallback channel uses
|
|
133
|
+
* a real address instead of the loader's placeholder. Added so the config
|
|
134
|
+
* template and pd-config-store stay in sync (spec §10 double-sync).
|
|
135
|
+
*/
|
|
136
|
+
export declare function generateConfigYamlContent(runtimeProfile?: RuntimeProfileInput, maintainerEmail?: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* PRI-308: Get the path to .pd/config.yaml for a workspace.
|
|
139
|
+
*/
|
|
140
|
+
export declare function getConfigYamlPath(workspaceDir: string): string;
|
|
141
|
+
/**
|
|
142
|
+
* PRI-308: Full structural validation of .pd/config.yaml.
|
|
143
|
+
*
|
|
144
|
+
* Checks all required top-level sections (version, features, runtimeProfiles,
|
|
145
|
+
* internalAgents) exist and have correct types. This is a lightweight structural
|
|
146
|
+
* check — deep field validation is done by validatePdConfig() in principles-core.
|
|
147
|
+
*
|
|
148
|
+
* Used by the installer to decide whether an existing config.yaml is safe to
|
|
149
|
+
* preserve. A config missing runtimeProfiles/internalAgents would cause runtime
|
|
150
|
+
* failures, so it must be rejected.
|
|
151
|
+
*
|
|
152
|
+
* Throws on any structural problem with reason + nextAction.
|
|
153
|
+
*/
|
|
154
|
+
export declare function validateConfigYamlFull(workspaceDir: string): void;
|
|
155
|
+
/**
|
|
156
|
+
* PRI-645: structural validation of an existing config.yaml the installer is
|
|
157
|
+
* about to preserve (PRI-308 preserve contract).
|
|
158
|
+
*
|
|
159
|
+
* The PRI-523 migration that used to live here (adding `host.codex` /
|
|
160
|
+
* `abstraction_layer_v1` to existing configs) is retired: both entries were
|
|
161
|
+
* exactly registry defaults, and writing them re-created the default snapshot
|
|
162
|
+
* PRI-645 removes. Effective values never depended on those entries — the
|
|
163
|
+
* registry (DEFAULT_FEATURE_FLAGS) resolves both at read time — so retiring
|
|
164
|
+
* the write changes representation only, never behavior. Existing configs are
|
|
165
|
+
* now preserved verbatim: no normalization, no cleanup (source=system is an
|
|
166
|
+
* origin hint, not an auto-delete license — PRI-637).
|
|
167
|
+
*/
|
|
168
|
+
export declare class ExistingConfigVerifyInfraError extends Error {
|
|
169
|
+
constructor(message: string, options?: {
|
|
170
|
+
cause?: unknown;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
export declare function validateExistingConfigYamlForPreserve(workspaceDir: string): void;
|
|
174
|
+
/**
|
|
175
|
+
* PRI-308: Read the ENABLED MVP channels from .pd/config.yaml.
|
|
176
|
+
*
|
|
177
|
+
* PRI-645: computed with sparse/effective semantics, not raw presence —
|
|
178
|
+
* the MVP channels are registered core capabilities whose registry default
|
|
179
|
+
* is ON and which cannot be disabled by omission (PRI-435), so:
|
|
180
|
+
* entry absent → enabled (follows registry default)
|
|
181
|
+
* entry { enabled: true } → enabled
|
|
182
|
+
* entry { enabled: false } → disabled (explicit Owner override)
|
|
183
|
+
* A present-but-malformed entry still fails loud (rc-3).
|
|
184
|
+
*
|
|
185
|
+
* Fail-loud: throws on malformed or missing required fields.
|
|
186
|
+
* Returns empty array if file does not exist (first install).
|
|
187
|
+
*/
|
|
188
|
+
export declare function readEnabledChannelsFromConfigYaml(workspaceDir: string): string[];
|
|
189
|
+
/**
|
|
190
|
+
* 获取 npm global bin 目录路径
|
|
191
|
+
*/
|
|
192
|
+
export declare function getNpmGlobalBinDir(): string | null;
|
|
193
|
+
/**
|
|
194
|
+
* 获取所有可能的全局 pd shim 文件路径
|
|
195
|
+
*/
|
|
196
|
+
export declare function getGlobalShimPaths(): string[];
|
|
197
|
+
//# sourceMappingURL=mvp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mvp-config.d.ts","sourceRoot":"","sources":["../src/mvp-config.ts"],"names":[],"mappings":"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"}
|