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.
Files changed (229) hide show
  1. package/codex-adapter/dist/codec/index.d.ts +6 -0
  2. package/codex-adapter/dist/codec/index.js +5 -0
  3. package/codex-adapter/dist/codec/input-decoder.d.ts +13 -0
  4. package/codex-adapter/dist/codec/input-decoder.js +103 -0
  5. package/codex-adapter/dist/codec/output-encoder.d.ts +32 -0
  6. package/codex-adapter/dist/codec/output-encoder.js +51 -0
  7. package/codex-adapter/dist/host-adapter.d.ts +30 -0
  8. package/codex-adapter/dist/host-adapter.js +28 -0
  9. package/codex-adapter/dist/index.d.ts +25 -0
  10. package/codex-adapter/dist/index.js +19 -0
  11. package/codex-adapter/dist/ingestion/admission.d.ts +54 -0
  12. package/codex-adapter/dist/ingestion/admission.js +137 -0
  13. package/codex-adapter/dist/ingestion/catch-up.d.ts +41 -0
  14. package/codex-adapter/dist/ingestion/catch-up.js +94 -0
  15. package/codex-adapter/dist/ingestion/codex-home.d.ts +19 -0
  16. package/codex-adapter/dist/ingestion/codex-home.js +43 -0
  17. package/codex-adapter/dist/ingestion/codex-version.d.ts +30 -0
  18. package/codex-adapter/dist/ingestion/codex-version.js +53 -0
  19. package/codex-adapter/dist/ingestion/ingestion-fields.d.ts +17 -0
  20. package/codex-adapter/dist/ingestion/ingestion-fields.js +28 -0
  21. package/codex-adapter/dist/ingestion/ingestion.d.ts +71 -0
  22. package/codex-adapter/dist/ingestion/ingestion.js +248 -0
  23. package/codex-adapter/dist/ingestion/transcript-decoder.d.ts +72 -0
  24. package/codex-adapter/dist/ingestion/transcript-decoder.js +485 -0
  25. package/codex-adapter/dist/ingestion/transcript-locate.d.ts +13 -0
  26. package/codex-adapter/dist/ingestion/transcript-locate.js +75 -0
  27. package/codex-adapter/dist/ingestion/transcript-path.d.ts +25 -0
  28. package/codex-adapter/dist/ingestion/transcript-path.js +87 -0
  29. package/codex-adapter/dist/pd-hook.d.ts +9 -0
  30. package/codex-adapter/dist/pd-hook.js +159 -0
  31. package/codex-adapter/dist/tool-semantics.d.ts +20 -0
  32. package/codex-adapter/dist/tool-semantics.js +27 -0
  33. package/codex-adapter/dist/worker/workspace-worker.d.ts +59 -0
  34. package/codex-adapter/dist/worker/workspace-worker.js +270 -0
  35. package/codex-adapter/package.json +52 -0
  36. package/console/dist/server/routes/update.js +187 -19
  37. package/console/dist/server/update/mutation-controller.d.ts +18 -0
  38. package/console/dist/server/update/mutation-controller.js +29 -0
  39. package/console/dist/server/utils/installed-layout.d.ts +1 -0
  40. package/console/dist/server/utils/installed-layout.js +2 -0
  41. package/console/package.json +1 -0
  42. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +15 -0
  43. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  44. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts +2 -0
  45. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts.map +1 -0
  46. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js +71 -0
  47. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js.map +1 -0
  48. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts +2 -0
  49. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts.map +1 -0
  50. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js +219 -0
  51. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js.map +1 -0
  52. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -1
  53. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js +2 -3
  54. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -1
  55. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +12 -1
  56. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
  57. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +15 -2
  58. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
  59. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts +50 -0
  60. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts.map +1 -0
  61. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js +93 -0
  62. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js.map +1 -0
  63. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  64. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +5 -0
  65. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  66. package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +152 -0
  67. package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -1
  68. package/core/dist/runtime-v2/internalization/owner-review.d.ts +7 -1
  69. package/core/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -1
  70. package/core/dist/runtime-v2/internalization/owner-review.js +22 -3
  71. package/core/dist/runtime-v2/internalization/owner-review.js.map +1 -1
  72. package/core/package.json +3 -2
  73. package/dist/installer.d.ts +32 -0
  74. package/dist/installer.d.ts.map +1 -1
  75. package/dist/installer.js +198 -2
  76. package/dist/installer.js.map +1 -1
  77. package/dist/installers/codex-host-installer.d.ts.map +1 -1
  78. package/dist/installers/codex-host-installer.js +5 -3
  79. package/dist/installers/codex-host-installer.js.map +1 -1
  80. package/dist/update/release-manager-authority.d.ts +69 -0
  81. package/dist/update/release-manager-authority.d.ts.map +1 -0
  82. package/dist/update/release-manager-authority.js +125 -0
  83. package/dist/update/release-manager-authority.js.map +1 -0
  84. package/dist/utils/workspace-divergence.d.ts +36 -0
  85. package/dist/utils/workspace-divergence.d.ts.map +1 -0
  86. package/dist/utils/workspace-divergence.js +87 -0
  87. package/dist/utils/workspace-divergence.js.map +1 -0
  88. package/install-layout/dist/index.d.ts +5 -0
  89. package/install-layout/dist/index.js +1 -0
  90. package/install-layout/package.json +1 -1
  91. package/package.json +4 -2
  92. package/plugin/dist/bundle.js +870 -734
  93. package/plugin/dist/governance-audit.js +381 -247
  94. package/plugin/dist/openclaw-sdk.d.ts +3 -0
  95. package/plugin/dist/rulehost-evidence.js +420 -286
  96. package/plugin/dist/service/subagent-workflow/types.d.ts +2 -2
  97. package/plugin/dist/utils/retry.d.ts +1 -1
  98. package/plugin/dist/utils/workspace-resolver.d.ts +35 -4
  99. package/plugin/openclaw.plugin.json +1 -1
  100. package/plugin/package.json +1 -1
  101. package/release-manager/dist/i18n.d.ts +6 -0
  102. package/release-manager/dist/i18n.d.ts.map +1 -0
  103. package/release-manager/dist/i18n.js +234 -0
  104. package/release-manager/dist/i18n.js.map +1 -0
  105. package/release-manager/dist/index.d.ts +7 -0
  106. package/release-manager/dist/index.d.ts.map +1 -0
  107. package/release-manager/dist/index.js +474 -0
  108. package/release-manager/dist/index.js.map +1 -0
  109. package/release-manager/dist/installer.d.ts +217 -0
  110. package/release-manager/dist/installer.d.ts.map +1 -0
  111. package/release-manager/dist/installer.js +2451 -0
  112. package/release-manager/dist/installer.js.map +1 -0
  113. package/release-manager/dist/installers/codex-host-installer.d.ts +29 -0
  114. package/release-manager/dist/installers/codex-host-installer.d.ts.map +1 -0
  115. package/release-manager/dist/installers/codex-host-installer.js +496 -0
  116. package/release-manager/dist/installers/codex-host-installer.js.map +1 -0
  117. package/release-manager/dist/installers/index.d.ts +40 -0
  118. package/release-manager/dist/installers/index.d.ts.map +1 -0
  119. package/release-manager/dist/installers/index.js +35 -0
  120. package/release-manager/dist/installers/index.js.map +1 -0
  121. package/release-manager/dist/installers/openclaw-host-installer.d.ts +18 -0
  122. package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +1 -0
  123. package/release-manager/dist/installers/openclaw-host-installer.js +414 -0
  124. package/release-manager/dist/installers/openclaw-host-installer.js.map +1 -0
  125. package/release-manager/dist/mvp-config.d.ts +197 -0
  126. package/release-manager/dist/mvp-config.d.ts.map +1 -0
  127. package/release-manager/dist/mvp-config.js +509 -0
  128. package/release-manager/dist/mvp-config.js.map +1 -0
  129. package/release-manager/dist/prompts.d.ts +30 -0
  130. package/release-manager/dist/prompts.d.ts.map +1 -0
  131. package/release-manager/dist/prompts.js +231 -0
  132. package/release-manager/dist/prompts.js.map +1 -0
  133. package/release-manager/dist/skill-language.d.ts +32 -0
  134. package/release-manager/dist/skill-language.d.ts.map +1 -0
  135. package/release-manager/dist/skill-language.js +107 -0
  136. package/release-manager/dist/skill-language.js.map +1 -0
  137. package/release-manager/dist/uninstaller.d.ts +55 -0
  138. package/release-manager/dist/uninstaller.d.ts.map +1 -0
  139. package/release-manager/dist/uninstaller.js +409 -0
  140. package/release-manager/dist/uninstaller.js.map +1 -0
  141. package/release-manager/dist/update/atomic-file.d.ts +35 -0
  142. package/release-manager/dist/update/atomic-file.d.ts.map +1 -0
  143. package/release-manager/dist/update/atomic-file.js +120 -0
  144. package/release-manager/dist/update/atomic-file.js.map +1 -0
  145. package/release-manager/dist/update/bootstrap-protocol.d.ts +55 -0
  146. package/release-manager/dist/update/bootstrap-protocol.d.ts.map +1 -0
  147. package/release-manager/dist/update/bootstrap-protocol.js +132 -0
  148. package/release-manager/dist/update/bootstrap-protocol.js.map +1 -0
  149. package/release-manager/dist/update/channel-metadata.d.ts +28 -0
  150. package/release-manager/dist/update/channel-metadata.d.ts.map +1 -0
  151. package/release-manager/dist/update/channel-metadata.js +90 -0
  152. package/release-manager/dist/update/channel-metadata.js.map +1 -0
  153. package/release-manager/dist/update/channel-promotion.d.ts +39 -0
  154. package/release-manager/dist/update/channel-promotion.d.ts.map +1 -0
  155. package/release-manager/dist/update/channel-promotion.js +55 -0
  156. package/release-manager/dist/update/channel-promotion.js.map +1 -0
  157. package/release-manager/dist/update/data-compatibility.d.ts +35 -0
  158. package/release-manager/dist/update/data-compatibility.d.ts.map +1 -0
  159. package/release-manager/dist/update/data-compatibility.js +45 -0
  160. package/release-manager/dist/update/data-compatibility.js.map +1 -0
  161. package/release-manager/dist/update/install-layout.d.ts +59 -0
  162. package/release-manager/dist/update/install-layout.d.ts.map +1 -0
  163. package/release-manager/dist/update/install-layout.js +127 -0
  164. package/release-manager/dist/update/install-layout.js.map +1 -0
  165. package/release-manager/dist/update/legacy-migration.d.ts +56 -0
  166. package/release-manager/dist/update/legacy-migration.d.ts.map +1 -0
  167. package/release-manager/dist/update/legacy-migration.js +254 -0
  168. package/release-manager/dist/update/legacy-migration.js.map +1 -0
  169. package/release-manager/dist/update/product-identity.d.ts +50 -0
  170. package/release-manager/dist/update/product-identity.d.ts.map +1 -0
  171. package/release-manager/dist/update/product-identity.js +63 -0
  172. package/release-manager/dist/update/product-identity.js.map +1 -0
  173. package/release-manager/dist/update/release-asset-manifest.d.ts +31 -0
  174. package/release-manager/dist/update/release-asset-manifest.d.ts.map +1 -0
  175. package/release-manager/dist/update/release-asset-manifest.js +161 -0
  176. package/release-manager/dist/update/release-asset-manifest.js.map +1 -0
  177. package/release-manager/dist/update/release-identity.d.ts +33 -0
  178. package/release-manager/dist/update/release-identity.d.ts.map +1 -0
  179. package/release-manager/dist/update/release-identity.js +108 -0
  180. package/release-manager/dist/update/release-identity.js.map +1 -0
  181. package/release-manager/dist/update/release-manager-authority.d.ts +69 -0
  182. package/release-manager/dist/update/release-manager-authority.d.ts.map +1 -0
  183. package/release-manager/dist/update/release-manager-authority.js +125 -0
  184. package/release-manager/dist/update/release-manager-authority.js.map +1 -0
  185. package/release-manager/dist/update/release-manager.d.ts +96 -0
  186. package/release-manager/dist/update/release-manager.d.ts.map +1 -0
  187. package/release-manager/dist/update/release-manager.js +253 -0
  188. package/release-manager/dist/update/release-manager.js.map +1 -0
  189. package/release-manager/dist/update/release-metadata.d.ts +57 -0
  190. package/release-manager/dist/update/release-metadata.d.ts.map +1 -0
  191. package/release-manager/dist/update/release-metadata.js +200 -0
  192. package/release-manager/dist/update/release-metadata.js.map +1 -0
  193. package/release-manager/dist/update/release-policy.d.ts +51 -0
  194. package/release-manager/dist/update/release-policy.d.ts.map +1 -0
  195. package/release-manager/dist/update/release-policy.js +103 -0
  196. package/release-manager/dist/update/release-policy.js.map +1 -0
  197. package/release-manager/dist/update/rollback-policy.d.ts +56 -0
  198. package/release-manager/dist/update/rollback-policy.d.ts.map +1 -0
  199. package/release-manager/dist/update/rollback-policy.js +61 -0
  200. package/release-manager/dist/update/rollback-policy.js.map +1 -0
  201. package/release-manager/dist/update/transaction-journal.d.ts +131 -0
  202. package/release-manager/dist/update/transaction-journal.d.ts.map +1 -0
  203. package/release-manager/dist/update/transaction-journal.js +346 -0
  204. package/release-manager/dist/update/transaction-journal.js.map +1 -0
  205. package/release-manager/dist/update/trust-metadata.d.ts +55 -0
  206. package/release-manager/dist/update/trust-metadata.d.ts.map +1 -0
  207. package/release-manager/dist/update/trust-metadata.js +170 -0
  208. package/release-manager/dist/update/trust-metadata.js.map +1 -0
  209. package/release-manager/dist/update/update-history.d.ts +46 -0
  210. package/release-manager/dist/update/update-history.d.ts.map +1 -0
  211. package/release-manager/dist/update/update-history.js +123 -0
  212. package/release-manager/dist/update/update-history.js.map +1 -0
  213. package/release-manager/dist/utils/config-file-io.d.ts +26 -0
  214. package/release-manager/dist/utils/config-file-io.d.ts.map +1 -0
  215. package/release-manager/dist/utils/config-file-io.js +128 -0
  216. package/release-manager/dist/utils/config-file-io.js.map +1 -0
  217. package/release-manager/dist/utils/env.d.ts +60 -0
  218. package/release-manager/dist/utils/env.d.ts.map +1 -0
  219. package/release-manager/dist/utils/env.js +308 -0
  220. package/release-manager/dist/utils/env.js.map +1 -0
  221. package/release-manager/dist/utils/logger.d.ts +15 -0
  222. package/release-manager/dist/utils/logger.d.ts.map +1 -0
  223. package/release-manager/dist/utils/logger.js +30 -0
  224. package/release-manager/dist/utils/logger.js.map +1 -0
  225. package/release-manager/dist/utils/workspace-divergence.d.ts +36 -0
  226. package/release-manager/dist/utils/workspace-divergence.d.ts.map +1 -0
  227. package/release-manager/dist/utils/workspace-divergence.js +87 -0
  228. package/release-manager/dist/utils/workspace-divergence.js.map +1 -0
  229. 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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"}