@adhdev/daemon-core 0.9.82-rc.2 → 0.9.82-rc.200

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 (244) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +3 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/chat/source-machine.d.ts +166 -0
  4. package/dist/chat/source-resolver.d.ts +104 -0
  5. package/dist/chat/subscription-updates.d.ts +1 -0
  6. package/dist/cli-adapter-types.d.ts +23 -2
  7. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  8. package/dist/cli-adapters/cli-state-engine.d.ts +178 -0
  9. package/dist/cli-adapters/provider-cli-adapter.d.ts +106 -63
  10. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
  11. package/dist/cli-adapters/provider-cli-shared.d.ts +29 -0
  12. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  13. package/dist/commands/cli-manager.d.ts +2 -1
  14. package/dist/commands/handler.d.ts +110 -0
  15. package/dist/commands/mesh-coordinator.d.ts +85 -1
  16. package/dist/commands/router.d.ts +29 -1
  17. package/dist/config/chat-history.d.ts +9 -0
  18. package/dist/config/config.d.ts +5 -0
  19. package/dist/config/mesh-config.d.ts +72 -1
  20. package/dist/git/git-commands.d.ts +8 -1
  21. package/dist/git/git-status.d.ts +5 -0
  22. package/dist/git/git-types.d.ts +12 -0
  23. package/dist/index.d.ts +39 -10
  24. package/dist/index.js +29425 -12026
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +25700 -8378
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/installer.d.ts +1 -4
  29. package/dist/ipc/local-ipc-server.d.ts +91 -0
  30. package/dist/launch.d.ts +1 -1
  31. package/dist/logging/async-batch-writer.d.ts +10 -0
  32. package/dist/mesh/contracts.d.ts +164 -0
  33. package/dist/mesh/coordinator-prompt.d.ts +30 -0
  34. package/dist/mesh/coordinator-registry.d.ts +59 -0
  35. package/dist/mesh/mesh-active-work.d.ts +90 -0
  36. package/dist/mesh/mesh-delivery-policy.d.ts +126 -0
  37. package/dist/mesh/mesh-events.d.ts +167 -6
  38. package/dist/mesh/mesh-fast-forward.d.ts +41 -0
  39. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  40. package/dist/mesh/mesh-ledger.d.ts +58 -1
  41. package/dist/mesh/mesh-refine-status.d.ts +26 -0
  42. package/dist/mesh/mesh-runtime-store.d.ts +149 -0
  43. package/dist/mesh/mesh-work-queue.d.ts +55 -6
  44. package/dist/mesh/preview-freshness.d.ts +18 -0
  45. package/dist/mesh/refine-config.d.ts +193 -0
  46. package/dist/mesh/worktree-bootstrap-config.d.ts +113 -0
  47. package/dist/providers/approval-utils.d.ts +13 -0
  48. package/dist/providers/chat-message-normalization.d.ts +1 -0
  49. package/dist/providers/cli-provider-instance.d.ts +39 -3
  50. package/dist/providers/contracts.d.ts +130 -6
  51. package/dist/providers/external-sources.d.ts +71 -0
  52. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  53. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  54. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  55. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  56. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  57. package/dist/providers/native-history/index.d.ts +13 -0
  58. package/dist/providers/provider-instance-manager.d.ts +12 -0
  59. package/dist/providers/provider-instance.d.ts +13 -1
  60. package/dist/providers/provider-loader.d.ts +26 -4
  61. package/dist/providers/provider-trust.d.ts +31 -0
  62. package/dist/providers/read-chat-contract.d.ts +29 -0
  63. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  64. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -0
  65. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  66. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  67. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  68. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  69. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  70. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  71. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  72. package/dist/providers/sdk/v1/index.d.ts +30 -0
  73. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  74. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  75. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  76. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  77. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  78. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  79. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  80. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  81. package/dist/providers/spec/adapter.d.ts +60 -0
  82. package/dist/providers/spec/cli-adapter.d.ts +98 -0
  83. package/dist/providers/spec/driver.d.ts +190 -0
  84. package/dist/providers/spec/evaluator.d.ts +55 -0
  85. package/dist/providers/spec/loader.d.ts +14 -0
  86. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  87. package/dist/providers/spec/route.d.ts +4 -0
  88. package/dist/providers/spec/schema.gen.d.ts +599 -0
  89. package/dist/providers/spec/types.d.ts +282 -0
  90. package/dist/providers/transcript-v2.d.ts +176 -0
  91. package/dist/providers/types/interactive-prompt.d.ts +48 -0
  92. package/dist/repo-mesh-types.d.ts +230 -1
  93. package/dist/sessions/registry.d.ts +3 -0
  94. package/dist/shared-types-extra.d.ts +1 -1
  95. package/dist/shared-types.d.ts +42 -1
  96. package/dist/status/normalize.d.ts +1 -1
  97. package/dist/status/normalize.js +1 -0
  98. package/dist/status/normalize.js.map +1 -1
  99. package/dist/status/normalize.mjs +1 -0
  100. package/dist/status/normalize.mjs.map +1 -1
  101. package/dist/status/reporter.d.ts +2 -0
  102. package/dist/status/snapshot.d.ts +1 -0
  103. package/dist/types.d.ts +5 -0
  104. package/package.json +7 -2
  105. package/src/agent-stream/poller.ts +2 -3
  106. package/src/boot/daemon-lifecycle.ts +22 -10
  107. package/src/boot/process-hardening.ts +89 -0
  108. package/src/chat/source-machine.ts +534 -0
  109. package/src/chat/source-resolver.ts +0 -0
  110. package/src/chat/subscription-updates.ts +20 -1
  111. package/src/cli-adapter-types.d.ts +1 -0
  112. package/src/cli-adapter-types.ts +22 -2
  113. package/src/cli-adapters/cli-script-runner.ts +421 -0
  114. package/src/cli-adapters/cli-state-engine.ts +1138 -0
  115. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  116. package/src/cli-adapters/provider-cli-adapter.ts +670 -1137
  117. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  118. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  119. package/src/cli-adapters/provider-cli-runtime.ts +3 -1
  120. package/src/cli-adapters/provider-cli-shared.d.ts +2 -0
  121. package/src/cli-adapters/provider-cli-shared.ts +59 -11
  122. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  123. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +17 -1
  124. package/src/cli-adapters/terminal-backends/xterm-backend.ts +8 -1
  125. package/src/commands/chat-commands.ts +1787 -60
  126. package/src/commands/cli-manager.ts +283 -14
  127. package/src/commands/handler.ts +809 -2
  128. package/src/commands/mesh-coordinator.ts +331 -122
  129. package/src/commands/router.ts +3915 -546
  130. package/src/config/chat-history.ts +95 -24
  131. package/src/config/config.ts +12 -0
  132. package/src/config/mesh-config.ts +280 -2
  133. package/src/config/recent-activity.ts +8 -2
  134. package/src/daemon/dev-cli-debug.ts +10 -1
  135. package/src/detection/ide-detector.ts +26 -16
  136. package/src/git/git-commands.ts +38 -8
  137. package/src/git/git-status.ts +132 -12
  138. package/src/git/git-summary.ts +3 -0
  139. package/src/git/git-types.ts +13 -0
  140. package/src/git/git-worktree.ts +8 -1
  141. package/src/index.ts +127 -9
  142. package/src/installer.d.ts +1 -1
  143. package/src/installer.ts +8 -6
  144. package/src/ipc/local-ipc-server.ts +278 -0
  145. package/src/launch.d.ts +1 -1
  146. package/src/launch.ts +37 -28
  147. package/src/logging/async-batch-writer.ts +55 -0
  148. package/src/logging/logger.ts +2 -1
  149. package/src/mesh/contracts.ts +329 -0
  150. package/src/mesh/coordinator-prompt.ts +204 -30
  151. package/src/mesh/coordinator-registry.ts +121 -0
  152. package/src/mesh/mesh-active-work.ts +437 -0
  153. package/src/mesh/mesh-delivery-policy.ts +298 -0
  154. package/src/mesh/mesh-events.ts +1352 -109
  155. package/src/mesh/mesh-fast-forward.ts +438 -0
  156. package/src/mesh/mesh-host-ownership.ts +73 -0
  157. package/src/mesh/mesh-ledger.ts +457 -104
  158. package/src/mesh/mesh-refine-status.ts +144 -0
  159. package/src/mesh/mesh-runtime-store.ts +769 -0
  160. package/src/mesh/mesh-work-queue.ts +267 -159
  161. package/src/mesh/preview-freshness.ts +118 -0
  162. package/src/mesh/refine-config.ts +366 -0
  163. package/src/mesh/worktree-bootstrap-config.ts +247 -0
  164. package/src/providers/approval-utils.d.ts +4 -0
  165. package/src/providers/approval-utils.ts +47 -5
  166. package/src/providers/chat-message-normalization.ts +7 -12
  167. package/src/providers/cli-provider-instance.ts +806 -64
  168. package/src/providers/contracts.d.ts +55 -0
  169. package/src/providers/contracts.ts +141 -6
  170. package/src/providers/external-sources.ts +218 -0
  171. package/src/providers/ide-provider-instance.ts +19 -5
  172. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  173. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  174. package/src/providers/native-history/codex-cli-transcript.ts +419 -0
  175. package/src/providers/native-history/dispatcher.ts +340 -0
  176. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  177. package/src/providers/native-history/index.ts +30 -0
  178. package/src/providers/provider-instance-manager.ts +30 -0
  179. package/src/providers/provider-instance.ts +10 -1
  180. package/src/providers/provider-loader.ts +582 -50
  181. package/src/providers/provider-schema.ts +87 -14
  182. package/src/providers/provider-trust.ts +114 -0
  183. package/src/providers/read-chat-contract.ts +76 -16
  184. package/src/providers/sdk/README.md +49 -0
  185. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  186. package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
  187. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  188. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  189. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  190. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  191. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  192. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  193. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  194. package/src/providers/sdk/v1/index.ts +152 -0
  195. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  196. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  197. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  198. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  199. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  200. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  201. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  202. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  203. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  204. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  205. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  206. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  207. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  208. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  209. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  210. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  211. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  212. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  213. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  214. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  215. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  216. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  217. package/src/providers/sdk/v1/validators/index.ts +19 -0
  218. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  219. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  220. package/src/providers/spec/adapter.ts +176 -0
  221. package/src/providers/spec/cli-adapter.ts +538 -0
  222. package/src/providers/spec/driver.ts +725 -0
  223. package/src/providers/spec/evaluator.ts +373 -0
  224. package/src/providers/spec/loader.ts +130 -0
  225. package/src/providers/spec/native-history-executor.ts +939 -0
  226. package/src/providers/spec/route.ts +51 -0
  227. package/src/providers/spec/schema.gen.ts +559 -0
  228. package/src/providers/spec/schema.json +237 -0
  229. package/src/providers/spec/types.ts +301 -0
  230. package/src/providers/transcript-v2.ts +567 -0
  231. package/src/providers/types/interactive-prompt.ts +425 -0
  232. package/src/providers/version-archive.ts +38 -20
  233. package/src/repo-mesh-types.ts +250 -1
  234. package/src/sessions/registry.ts +3 -0
  235. package/src/shared-types-extra.ts +1 -1
  236. package/src/shared-types.ts +45 -1
  237. package/src/status/builders.ts +24 -6
  238. package/src/status/normalize.ts +2 -0
  239. package/src/status/reporter.ts +15 -0
  240. package/src/status/snapshot.ts +84 -25
  241. package/src/system/host-memory.ts +29 -12
  242. package/src/types.ts +5 -0
  243. package/dist/mesh/mesh-sync.d.ts +0 -53
  244. package/src/mesh/mesh-sync.ts +0 -111
@@ -37,6 +37,9 @@ import type { PtyTransportFactory } from '../cli-adapters/pty-transport.js';
37
37
  import type { IdeProviderInstance } from '../providers/ide-provider-instance.js';
38
38
  import { createDefaultGitCommandServices } from '../git/git-commands.js';
39
39
  import { setupMeshEventForwarding } from '../mesh/mesh-events.js';
40
+ import { loadMeshCoordinatorRegistry } from '../mesh/coordinator-registry.js';
41
+ import { applyProcessHardening } from './process-hardening.js';
42
+ import { installProviderProcessShim } from '../providers/sdk/v1/sandbox/require-whitelist.js';
40
43
 
41
44
  // ─── Init Config ───
42
45
 
@@ -60,6 +63,7 @@ export interface DaemonInitConfig {
60
63
 
61
64
  /** Router transport-specific callbacks */
62
65
  onStatusChange?: () => void;
66
+ onMeshStateChange?: (meshId: string) => void;
63
67
  onPostChatCommand?: () => void;
64
68
  sessionHostControl?: SessionHostControlPlane | null;
65
69
  getCdpLogFn?: (ideType: string) => (msg: string) => void;
@@ -86,6 +90,8 @@ export interface DaemonInitConfig {
86
90
 
87
91
  /** Relays a command to a remote mesh node daemon */
88
92
  dispatchMeshCommand?: (daemonId: string, command: string, args: Record<string, unknown>) => Promise<any>;
93
+ /** Returns selected-coordinator mesh peer telemetry for a target daemon when available. */
94
+ getMeshPeerConnectionStatus?: (daemonId: string) => Record<string, unknown> | null;
89
95
  }
90
96
 
91
97
  // ─── Result ───
@@ -127,8 +133,16 @@ export interface DaemonDevSupportOptions {
127
133
  * 8. Start instance ticking
128
134
  */
129
135
  export async function initDaemonComponents(config: DaemonInitConfig): Promise<DaemonComponents> {
136
+ // 0. Process-level hardening (must run before any provider script is loaded).
137
+ // Freezes built-in prototypes (Object/Array/Function/String/Number/Boolean/Promise)
138
+ // and shadows process.exit/kill/abort/binding/dlopen so provider-script callers
139
+ // throw instead of killing the daemon. See ./process-hardening.ts for details.
140
+ applyProcessHardening();
141
+ installProviderProcessShim();
142
+
130
143
  // 1. Global log interceptor
131
144
  installGlobalInterceptor();
145
+ loadMeshCoordinatorRegistry();
132
146
 
133
147
  // 2. ProviderLoader (provider source mode from config.json)
134
148
  const appConfig = loadConfig();
@@ -140,16 +154,11 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
140
154
  userDir: appConfig.providerDir,
141
155
  });
142
156
 
143
- // If no upstream providers exist, fetch them first (blocking — critical for new users)
144
- if (!disableUpstream && !providerLoader.hasUpstream()) {
145
- LOG.info('Provider', 'No upstream providers found downloading from GitHub...');
146
- try {
147
- await providerLoader.fetchLatest();
148
- } catch (e: any) {
149
- LOG.warn('Provider', `⚠ Failed to fetch providers: ${e?.message}`);
150
- }
151
- }
152
-
157
+ // Boot-time auto-sync is intentionally disabled. The user picks which
158
+ // providers to install via the dashboard onboarding / Providers tab; the
159
+ // daemon ships empty and only contains what the user explicitly installs.
160
+ // Manual sync is still available via the install / check_provider_updates
161
+ // commands (and the REST endpoint at /api/v1/providers/updates).
153
162
  providerLoader.loadAll();
154
163
  providerLoader.registerToDetector();
155
164
 
@@ -302,10 +311,13 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
302
311
  },
303
312
  onIdeConnected: () => poller?.start(),
304
313
  onStatusChange: config.onStatusChange,
314
+ onMeshStateChange: config.onMeshStateChange,
305
315
  onPostChatCommand: config.onPostChatCommand,
306
316
  sessionHostControl: config.sessionHostControl,
307
317
  statusInstanceId: config.statusInstanceId,
308
318
  statusVersion: config.statusVersion,
319
+ getMeshPeerConnectionStatus: config.getMeshPeerConnectionStatus,
320
+ dispatchMeshCommand: config.dispatchMeshCommand,
309
321
  getCdpLogFn: config.getCdpLogFn || ((ideType: string) => LOG.forComponent(`CDP:${ideType}`).asLogFn()),
310
322
  });
311
323
 
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Process-level hardening — boot-time mitigations against provider scripts.
3
+ *
4
+ * Provider scripts run in-process (see providers/sdk/v1/sandbox/README-design.ts).
5
+ * The require() whitelist (sandbox/require-whitelist.ts) blocks the obvious
6
+ * attack surfaces (no `child_process.exec`, no `fs.writeFile`, no `net`, etc.)
7
+ * but a malicious or buggy script can still:
8
+ *
9
+ * 1. Pollute Object.prototype to influence the daemon's downstream consumers
10
+ * (e.g. `Object.prototype.toString = () => '...'` makes every untagged
11
+ * object stringify to that value across the whole process).
12
+ * 2. Mutate Array/Function/String prototypes for similar effect.
13
+ * 3. Call `process.exit()` / `process.kill()` to kill the daemon.
14
+ *
15
+ * Sandbox isolation (isolated-vm) is the proper fix but has a real perf cost
16
+ * and a real marshalling-complexity cost. As a cheaper layer we just freeze
17
+ * the built-in prototypes at boot, which is irreversible and catches every
18
+ * prototype-pollution variant for the lifetime of the process.
19
+ *
20
+ * `applyProcessHardening()` is idempotent — calling it twice is a no-op the
21
+ * second time. The function intentionally swallows any "cannot redefine
22
+ * property" errors that would arise if some upstream code already froze
23
+ * the same prototype: the post-condition (prototype is frozen) is satisfied
24
+ * either way.
25
+ *
26
+ * Trade-offs:
27
+ * - Read-only access to prototype methods (`Object.prototype.hasOwnProperty.call`,
28
+ * `Array.prototype.slice.call`, etc.) is unaffected — only writes throw.
29
+ * - Some older npm libraries patch Array.prototype or Function.prototype at
30
+ * import time. If a daemon-core dep does this, the import will throw. The
31
+ * daemon-core vitest suite is the canonical regression check for this.
32
+ * - We deliberately do NOT freeze RegExp.prototype, Error.prototype, Map/Set
33
+ * prototypes, or Date.prototype because at least one of those tends to be
34
+ * mutated by mainstream test/runtime libs and the value of freezing them
35
+ * is low (no useful prototype-pollution attack surface).
36
+ */
37
+
38
+ let _hardened = false;
39
+
40
+ /** Prototypes that get frozen at boot. */
41
+ const HARDENED_PROTOS: Array<{ name: string; proto: object }> = [
42
+ { name: 'Object', proto: Object.prototype },
43
+ { name: 'Array', proto: Array.prototype },
44
+ { name: 'Function', proto: Function.prototype },
45
+ { name: 'String', proto: String.prototype },
46
+ { name: 'Number', proto: Number.prototype },
47
+ { name: 'Boolean', proto: Boolean.prototype },
48
+ { name: 'Promise', proto: Promise.prototype },
49
+ ];
50
+
51
+ /**
52
+ * Freeze the canonical built-in prototypes so provider scripts (and anything
53
+ * else running in this process) cannot mutate them. Idempotent.
54
+ *
55
+ * Returns the list of prototype names that were newly frozen — primarily for
56
+ * tests / observability. Already-frozen prototypes are not re-reported.
57
+ */
58
+ export function applyProcessHardening(): string[] {
59
+ if (_hardened) return [];
60
+ _hardened = true;
61
+
62
+ const newlyFrozen: string[] = [];
63
+ for (const entry of HARDENED_PROTOS) {
64
+ if (Object.isFrozen(entry.proto)) continue;
65
+ try {
66
+ Object.freeze(entry.proto);
67
+ newlyFrozen.push(entry.name);
68
+ } catch {
69
+ // Some host/runtime combinations refuse to freeze a built-in
70
+ // prototype (e.g. it has a non-configurable accessor). We treat
71
+ // this as best-effort — log nothing here (logger not guaranteed
72
+ // to be initialized this early) and move on. Subsequent reads
73
+ // of `Object.isFrozen(proto)` will reveal the gap.
74
+ }
75
+ }
76
+ return newlyFrozen;
77
+ }
78
+
79
+ /** For tests only — clears the internal "already hardened" flag. The
80
+ * prototypes themselves cannot be un-frozen, so this is mostly useful for
81
+ * testing the idempotency guard. */
82
+ export function _resetProcessHardeningForTest(): void {
83
+ _hardened = false;
84
+ }
85
+
86
+ /** For tests only — peek at the hardened state. */
87
+ export function _isProcessHardened(): boolean {
88
+ return _hardened;
89
+ }