opensip-cli 0.1.8 → 0.1.9

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 (138) hide show
  1. package/dist/bootstrap/admit-tool-package.d.ts +51 -11
  2. package/dist/bootstrap/admit-tool-package.d.ts.map +1 -1
  3. package/dist/bootstrap/admit-tool-package.js +46 -12
  4. package/dist/bootstrap/admit-tool-package.js.map +1 -1
  5. package/dist/bootstrap/baseline-seams.js +1 -1
  6. package/dist/bootstrap/baseline-seams.js.map +1 -1
  7. package/dist/bootstrap/bind-external-dispatch.d.ts +36 -0
  8. package/dist/bootstrap/bind-external-dispatch.d.ts.map +1 -0
  9. package/dist/bootstrap/bind-external-dispatch.js +81 -0
  10. package/dist/bootstrap/bind-external-dispatch.js.map +1 -0
  11. package/dist/bootstrap/build-command-registration-input.d.ts +13 -2
  12. package/dist/bootstrap/build-command-registration-input.d.ts.map +1 -1
  13. package/dist/bootstrap/build-command-registration-input.js +29 -2
  14. package/dist/bootstrap/build-command-registration-input.js.map +1 -1
  15. package/dist/bootstrap/build-per-run-scope.d.ts.map +1 -1
  16. package/dist/bootstrap/build-per-run-scope.js +19 -2
  17. package/dist/bootstrap/build-per-run-scope.js.map +1 -1
  18. package/dist/bootstrap/config-and-capabilities.d.ts +21 -6
  19. package/dist/bootstrap/config-and-capabilities.d.ts.map +1 -1
  20. package/dist/bootstrap/config-and-capabilities.js +79 -23
  21. package/dist/bootstrap/config-and-capabilities.js.map +1 -1
  22. package/dist/bootstrap/dispatch-external-tool-command.d.ts +67 -0
  23. package/dist/bootstrap/dispatch-external-tool-command.d.ts.map +1 -0
  24. package/dist/bootstrap/dispatch-external-tool-command.js +79 -0
  25. package/dist/bootstrap/dispatch-external-tool-command.js.map +1 -0
  26. package/dist/bootstrap/dispatch-external-tool-hook.d.ts +47 -0
  27. package/dist/bootstrap/dispatch-external-tool-hook.d.ts.map +1 -0
  28. package/dist/bootstrap/dispatch-external-tool-hook.js +49 -0
  29. package/dist/bootstrap/dispatch-external-tool-hook.js.map +1 -0
  30. package/dist/bootstrap/dispatch-fork-core.d.ts +48 -0
  31. package/dist/bootstrap/dispatch-fork-core.d.ts.map +1 -0
  32. package/dist/bootstrap/dispatch-fork-core.js +214 -0
  33. package/dist/bootstrap/dispatch-fork-core.js.map +1 -0
  34. package/dist/bootstrap/dispatch-host-rpc-handler.d.ts +27 -0
  35. package/dist/bootstrap/dispatch-host-rpc-handler.d.ts.map +1 -0
  36. package/dist/bootstrap/dispatch-host-rpc-handler.js +175 -0
  37. package/dist/bootstrap/dispatch-host-rpc-handler.js.map +1 -0
  38. package/dist/bootstrap/dispatch-replay-result.d.ts +51 -0
  39. package/dist/bootstrap/dispatch-replay-result.d.ts.map +1 -0
  40. package/dist/bootstrap/dispatch-replay-result.js +76 -0
  41. package/dist/bootstrap/dispatch-replay-result.js.map +1 -0
  42. package/dist/bootstrap/execute-post-bailout-bootstrap.d.ts.map +1 -1
  43. package/dist/bootstrap/execute-post-bailout-bootstrap.js +3 -1
  44. package/dist/bootstrap/execute-post-bailout-bootstrap.js.map +1 -1
  45. package/dist/bootstrap/owning-tool-init.d.ts +8 -2
  46. package/dist/bootstrap/owning-tool-init.d.ts.map +1 -1
  47. package/dist/bootstrap/owning-tool-init.js +11 -1
  48. package/dist/bootstrap/owning-tool-init.js.map +1 -1
  49. package/dist/bootstrap/register-authored-tools.d.ts +49 -0
  50. package/dist/bootstrap/register-authored-tools.d.ts.map +1 -0
  51. package/dist/bootstrap/register-authored-tools.js +132 -0
  52. package/dist/bootstrap/register-authored-tools.js.map +1 -0
  53. package/dist/bootstrap/register-tools-discovery.d.ts +0 -32
  54. package/dist/bootstrap/register-tools-discovery.d.ts.map +1 -1
  55. package/dist/bootstrap/register-tools-discovery.js +36 -100
  56. package/dist/bootstrap/register-tools-discovery.js.map +1 -1
  57. package/dist/bootstrap/register-tools-mount.d.ts.map +1 -1
  58. package/dist/bootstrap/register-tools-mount.js +20 -44
  59. package/dist/bootstrap/register-tools-mount.js.map +1 -1
  60. package/dist/bootstrap/register-tools.d.ts +2 -1
  61. package/dist/bootstrap/register-tools.d.ts.map +1 -1
  62. package/dist/bootstrap/register-tools.js +2 -1
  63. package/dist/bootstrap/register-tools.js.map +1 -1
  64. package/dist/bootstrap/run-plane.d.ts +11 -0
  65. package/dist/bootstrap/run-plane.d.ts.map +1 -1
  66. package/dist/bootstrap/run-plane.js.map +1 -1
  67. package/dist/bootstrap/synthesize-external-tool.d.ts +45 -0
  68. package/dist/bootstrap/synthesize-external-tool.d.ts.map +1 -0
  69. package/dist/bootstrap/synthesize-external-tool.js +112 -0
  70. package/dist/bootstrap/synthesize-external-tool.js.map +1 -0
  71. package/dist/bootstrap/tool-command-dispatch-types.d.ts +280 -0
  72. package/dist/bootstrap/tool-command-dispatch-types.d.ts.map +1 -0
  73. package/dist/bootstrap/tool-command-dispatch-types.js +34 -0
  74. package/dist/bootstrap/tool-command-dispatch-types.js.map +1 -0
  75. package/dist/bootstrap/tool-command-worker-config-pass.d.ts +24 -0
  76. package/dist/bootstrap/tool-command-worker-config-pass.d.ts.map +1 -0
  77. package/dist/bootstrap/tool-command-worker-config-pass.js +52 -0
  78. package/dist/bootstrap/tool-command-worker-config-pass.js.map +1 -0
  79. package/dist/bootstrap/tool-command-worker-context.d.ts +55 -0
  80. package/dist/bootstrap/tool-command-worker-context.d.ts.map +1 -0
  81. package/dist/bootstrap/tool-command-worker-context.js +163 -0
  82. package/dist/bootstrap/tool-command-worker-context.js.map +1 -0
  83. package/dist/bootstrap/tool-command-worker-entry.d.ts +66 -0
  84. package/dist/bootstrap/tool-command-worker-entry.d.ts.map +1 -0
  85. package/dist/bootstrap/tool-command-worker-entry.js +298 -0
  86. package/dist/bootstrap/tool-command-worker-entry.js.map +1 -0
  87. package/dist/bootstrap/tool-command-worker-rpc.d.ts +53 -0
  88. package/dist/bootstrap/tool-command-worker-rpc.d.ts.map +1 -0
  89. package/dist/bootstrap/tool-command-worker-rpc.js +78 -0
  90. package/dist/bootstrap/tool-command-worker-rpc.js.map +1 -0
  91. package/dist/bootstrap/tool-provenance.d.ts +85 -0
  92. package/dist/bootstrap/tool-provenance.d.ts.map +1 -0
  93. package/dist/bootstrap/tool-provenance.js +101 -0
  94. package/dist/bootstrap/tool-provenance.js.map +1 -0
  95. package/dist/cli-context.d.ts +17 -0
  96. package/dist/cli-context.d.ts.map +1 -1
  97. package/dist/cli-context.js +62 -1
  98. package/dist/cli-context.js.map +1 -1
  99. package/dist/commands/completion.d.ts.map +1 -1
  100. package/dist/commands/completion.js +3 -0
  101. package/dist/commands/completion.js.map +1 -1
  102. package/dist/commands/host-command-specs.d.ts +13 -15
  103. package/dist/commands/host-command-specs.d.ts.map +1 -1
  104. package/dist/commands/host-command-specs.js +27 -27
  105. package/dist/commands/host-command-specs.js.map +1 -1
  106. package/dist/commands/host-subcommand-groups.d.ts.map +1 -1
  107. package/dist/commands/host-subcommand-groups.js +63 -5
  108. package/dist/commands/host-subcommand-groups.js.map +1 -1
  109. package/dist/commands/internal-command-visibility.d.ts +13 -4
  110. package/dist/commands/internal-command-visibility.d.ts.map +1 -1
  111. package/dist/commands/internal-command-visibility.js +14 -5
  112. package/dist/commands/internal-command-visibility.js.map +1 -1
  113. package/dist/commands/mount-command-spec.d.ts.map +1 -1
  114. package/dist/commands/mount-command-spec.js +31 -0
  115. package/dist/commands/mount-command-spec.js.map +1 -1
  116. package/dist/commands/session-show.d.ts.map +1 -1
  117. package/dist/commands/session-show.js +4 -1
  118. package/dist/commands/session-show.js.map +1 -1
  119. package/dist/commands/tools/data-purge.js +2 -2
  120. package/dist/commands/tools/data-purge.js.map +1 -1
  121. package/dist/commands/tools/validate.js +1 -1
  122. package/dist/env/host-env-specs.d.ts.map +1 -1
  123. package/dist/env/host-env-specs.js +6 -0
  124. package/dist/env/host-env-specs.js.map +1 -1
  125. package/dist/index.js +6 -1
  126. package/dist/index.js.map +1 -1
  127. package/dist/report-compose.d.ts.map +1 -1
  128. package/dist/report-compose.js +85 -19
  129. package/dist/report-compose.js.map +1 -1
  130. package/dist/session-replay-registry.d.ts +33 -6
  131. package/dist/session-replay-registry.d.ts.map +1 -1
  132. package/dist/session-replay-registry.js +43 -6
  133. package/dist/session-replay-registry.js.map +1 -1
  134. package/dist/telemetry/profiling.d.ts +30 -0
  135. package/dist/telemetry/profiling.d.ts.map +1 -1
  136. package/dist/telemetry/profiling.js +16 -1
  137. package/dist/telemetry/profiling.js.map +1 -1
  138. package/package.json +32 -32
@@ -26,7 +26,7 @@
26
26
  * config namespace (see `docs/public/10-concepts/03-modular-monolith.md`); at
27
27
  * run time they read the validated namespace off `scope.toolConfig`.
28
28
  */
29
- import { type CapabilityRegistry, type ResolvedToolConfig, type ToolPluginManifest, type ToolRegistry } from '@opensip-cli/core';
29
+ import { type CapabilityRegistry, type ResolvedToolConfig, type ToolPluginManifest, type ToolProvenance, type ToolRegistry } from '@opensip-cli/core';
30
30
  /**
31
31
  * Compose + strict-validate the config document, then resolve precedence.
32
32
  *
@@ -49,6 +49,7 @@ import { type CapabilityRegistry, type ResolvedToolConfig, type ToolPluginManife
49
49
  export declare function composeAndValidateToolConfig(args: {
50
50
  readonly tools: ToolRegistry;
51
51
  readonly manifests?: readonly ToolPluginManifest[];
52
+ readonly provenance?: readonly ToolProvenance[];
52
53
  readonly configPath: string | undefined;
53
54
  readonly env: Readonly<Record<string, string | undefined>>;
54
55
  }): {
@@ -58,19 +59,33 @@ export declare function composeAndValidateToolConfig(args: {
58
59
  /**
59
60
  * Construct + populate the per-run capability registry (§5.3, Phase 4).
60
61
  *
61
- * Registers every admitted manifest's declared capability domains (each with
62
- * a deferred placeholder registrar), then replaces each placeholder with the
63
- * owning tool's REAL registrar from `tool.capabilityRegistrars`. A registrar
64
- * for a domain the tool's manifest did not declare is skipped (the host only
65
- * wires registrars for declared domains).
62
+ * Step 1 registers every admitted manifest's declared capability domains (each
63
+ * with a deferred placeholder registrar) pure MANIFEST data: the manifest is
64
+ * serializable, the placeholder is a host-owned deferred stub (it throws if a
65
+ * domain is driven before a real registrar is installed); NO external runtime
66
+ * code runs here. Step 2 replaces each placeholder with the owning tool's REAL
67
+ * registrar from `tool.capabilityRegistrars`.
68
+ *
69
+ * ADR-0054 M4-F: step 2 is gated on {@link shouldRunHookInHost}. For an EXTERNAL
70
+ * tool in the HOST process the real registrar is NOT installed host-side (reading
71
+ * `tool.capabilityRegistrars` + invoking the registrar runs untrusted runtime
72
+ * code — the load-time hole the ADR rejects); the external domain keeps its
73
+ * deferred placeholder in the host registry. The real registrar is installed
74
+ * worker-side: the dispatch worker re-runs this SAME wiring with the host-skip
75
+ * INACTIVE, so the dispatched external tool's registrar IS installed there (the
76
+ * isolation boundary). Bundled tools install in-host exactly as before. A
77
+ * registrar whose domain id was not declared in any manifest is skipped
78
+ * (hasDomain false) — the host never invents a domain a tool didn't declare.
66
79
  *
67
80
  * @param tools The per-run tool registry (supplies each tool's real registrars).
68
81
  * @param manifests The admitted manifests (supply the declared domains).
82
+ * @param provenance The per-run provenance (drives the M4-F host/external gate).
69
83
  * @returns The populated registry, ready to attach to `scope.capabilities`.
70
84
  */
71
85
  export declare function wireCapabilityRegistry(args: {
72
86
  readonly tools: ToolRegistry;
73
87
  readonly manifests: readonly ToolPluginManifest[];
74
88
  readonly registry: CapabilityRegistry;
89
+ readonly provenance?: readonly ToolProvenance[];
75
90
  }): CapabilityRegistry;
76
91
  //# sourceMappingURL=config-and-capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-and-capabilities.d.ts","sourceRoot":"","sources":["../../src/bootstrap/config-and-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAYH,OAAO,EACL,KAAK,kBAAkB,EAKvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAElB,MAAM,mBAAmB,CAAC;AA4E3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAC5D,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAwDlF;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CACvC,GAAG,kBAAkB,CAuBrB"}
1
+ {"version":3,"file":"config-and-capabilities.d.ts","sourceRoot":"","sources":["../../src/bootstrap/config-and-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAaH,OAAO,EACL,KAAK,kBAAkB,EAKvB,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,mBAAmB,CAAC;AA0H3B;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAC5D,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CA8DlF;AA2CD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD,GAAG,kBAAkB,CAyBrB"}
@@ -26,26 +26,62 @@
26
26
  * config namespace (see `docs/public/10-concepts/03-modular-monolith.md`); at
27
27
  * run time they read the validated namespace off `scope.toolConfig`.
28
28
  */
29
- import { analyzeNamespaceClaims, composeConfigSchema, decorateToolConfigDeclarationsWithGateKeys, hostConfigDeclarations, resolveConfig, validateConfigDocument, } from '@opensip-cli/config';
29
+ import { analyzeNamespaceClaims, composeConfigSchema, decorateToolConfigDeclarationsWithGateKeys, hostConfigDeclarations, jsonSchemaObjectToZod, resolveConfig, validateConfigDocument, } from '@opensip-cli/config';
30
30
  import { ConfigurationError, logger, readYamlFileOrThrow, resolveToolHooks, registerCapabilityDomainsFromManifest, } from '@opensip-cli/core';
31
+ import { provenanceSourceFor, shouldRunHookInHost } from './tool-provenance.js';
31
32
  /** A plain-object guard that treats arrays and null as non-objects. */
32
33
  function isPlainObject(value) {
33
34
  return typeof value === 'object' && value !== null && !Array.isArray(value);
34
35
  }
35
36
  /**
36
- * Collect the contributed config declarations from the registered tools. A
37
- * tool's `config` slot is the kernel-side `ToolConfigContribution` carrier; it
38
- * is structurally a `ToolConfigDeclaration` (the schema is `unknown` at the
39
- * kernel boundary, a Zod schema at the config layer), so narrowing it here —
40
- * the composition root, which DOES import `@opensip-cli/config` — is sound.
37
+ * Find the manifest config descriptor for a tool, matching by stable id then by
38
+ * the manifest's human id. Returns `undefined` when no admitted manifest for the
39
+ * tool declares a `config` descriptor.
41
40
  */
42
- function collectDeclarations(tools) {
41
+ function manifestDescriptorFor(tool, manifests) {
42
+ const manifest = manifests.find((m) => m.stableId !== undefined && m.stableId === tool.metadata.id) ??
43
+ manifests.find((m) => m.id === tool.metadata.name);
44
+ return manifest?.config;
45
+ }
46
+ /**
47
+ * Collect the contributed config declarations from the registered tools —
48
+ * provenance-aware (ADR-0054 M4-E Config two-pass).
49
+ *
50
+ * - **Bundled** (trusted computing base) → fold the tool's runtime Zod
51
+ * `config` declaration host-side, exactly as before. A bundled tool's
52
+ * `config` slot is the kernel-side `ToolConfigContribution` carrier,
53
+ * structurally a `ToolConfigDeclaration` (schema `unknown` at the kernel
54
+ * boundary, a Zod schema at the config layer), so narrowing it here — the
55
+ * composition root, which DOES import `@opensip-cli/config` — is sound.
56
+ * - **External** (installed / project-local / user-global) → NEVER import the
57
+ * tool's Zod (executable code — the ADR-0054 load-time hole). Instead derive
58
+ * a COARSE declaration from the tool's serializable manifest descriptor
59
+ * ({@link ToolConfigManifestDescriptor}); the host validates the namespace's
60
+ * top-level shape as pure data. An external tool that ships NO descriptor
61
+ * contributes no declaration — its namespace (if present) passes through the
62
+ * document catchall (rule-2) and ALL of its validation defers to the worker
63
+ * deep pass.
64
+ */
65
+ function collectDeclarations(tools, provenance, manifests) {
43
66
  const declarations = [];
44
67
  for (const tool of tools.list()) {
45
- const config = resolveToolHooks(tool).config;
46
- if (config !== undefined) {
47
- declarations.push(config);
68
+ if (provenanceSourceFor(tool, provenance) === 'bundled') {
69
+ const config = resolveToolHooks(tool).config;
70
+ if (config !== undefined) {
71
+ declarations.push(config);
72
+ }
73
+ continue;
74
+ }
75
+ // External: coarse, manifest-descriptor-derived schema only — no Zod import.
76
+ const descriptor = manifestDescriptorFor(tool, manifests);
77
+ if (descriptor !== undefined) {
78
+ declarations.push({
79
+ namespace: descriptor.namespace,
80
+ schema: jsonSchemaObjectToZod(descriptor.schema),
81
+ });
48
82
  }
83
+ // No descriptor → defer entirely to the worker deep pass (catchall passes
84
+ // any present namespace block through; do NOT host-import its Zod to "help").
49
85
  }
50
86
  return declarations;
51
87
  }
@@ -109,8 +145,12 @@ function fileBlocksFor(declarations, validated) {
109
145
  * strict validation in ANY tool namespace.
110
146
  */
111
147
  export function composeAndValidateToolConfig(args) {
112
- const { tools, configPath, env, manifests = [] } = args;
113
- const toolDeclarations = decorateToolConfigDeclarationsWithGateKeys(collectDeclarations(tools));
148
+ const { tools, configPath, env, manifests = [], provenance = [] } = args;
149
+ // ADR-0054 M4-E: provenance-aware fold — bundled tools' Zod is composed
150
+ // host-side (trusted), external tools validate from their serializable
151
+ // manifest descriptor (coarse, NO Zod import); the deep Zod pass runs in the
152
+ // worker.
153
+ const toolDeclarations = decorateToolConfigDeclarationsWithGateKeys(collectDeclarations(tools, provenance, manifests));
114
154
  // A run with no tools that declare config (e.g. a project-agnostic context)
115
155
  // carries no toolConfig — tools fall back to their in-tool defaults. The host
116
156
  // document-level blocks (cli/dashboard/schemaVersion) only need composing when
@@ -193,27 +233,43 @@ function reportUnclaimedNamespaces(args) {
193
233
  /**
194
234
  * Construct + populate the per-run capability registry (§5.3, Phase 4).
195
235
  *
196
- * Registers every admitted manifest's declared capability domains (each with
197
- * a deferred placeholder registrar), then replaces each placeholder with the
198
- * owning tool's REAL registrar from `tool.capabilityRegistrars`. A registrar
199
- * for a domain the tool's manifest did not declare is skipped (the host only
200
- * wires registrars for declared domains).
236
+ * Step 1 registers every admitted manifest's declared capability domains (each
237
+ * with a deferred placeholder registrar) pure MANIFEST data: the manifest is
238
+ * serializable, the placeholder is a host-owned deferred stub (it throws if a
239
+ * domain is driven before a real registrar is installed); NO external runtime
240
+ * code runs here. Step 2 replaces each placeholder with the owning tool's REAL
241
+ * registrar from `tool.capabilityRegistrars`.
242
+ *
243
+ * ADR-0054 M4-F: step 2 is gated on {@link shouldRunHookInHost}. For an EXTERNAL
244
+ * tool in the HOST process the real registrar is NOT installed host-side (reading
245
+ * `tool.capabilityRegistrars` + invoking the registrar runs untrusted runtime
246
+ * code — the load-time hole the ADR rejects); the external domain keeps its
247
+ * deferred placeholder in the host registry. The real registrar is installed
248
+ * worker-side: the dispatch worker re-runs this SAME wiring with the host-skip
249
+ * INACTIVE, so the dispatched external tool's registrar IS installed there (the
250
+ * isolation boundary). Bundled tools install in-host exactly as before. A
251
+ * registrar whose domain id was not declared in any manifest is skipped
252
+ * (hasDomain false) — the host never invents a domain a tool didn't declare.
201
253
  *
202
254
  * @param tools The per-run tool registry (supplies each tool's real registrars).
203
255
  * @param manifests The admitted manifests (supply the declared domains).
256
+ * @param provenance The per-run provenance (drives the M4-F host/external gate).
204
257
  * @returns The populated registry, ready to attach to `scope.capabilities`.
205
258
  */
206
259
  export function wireCapabilityRegistry(args) {
207
- const { tools, manifests, registry } = args;
208
- // 1. Register every manifest-declared domain with a deferred placeholder.
260
+ const { tools, manifests, registry, provenance = [] } = args;
261
+ // 1. Register every manifest-declared domain with a deferred placeholder
262
+ // (manifest data only — no external runtime code runs).
209
263
  for (const manifest of manifests) {
210
264
  registerCapabilityDomainsFromManifest(manifest, registry);
211
265
  }
212
- // 2. Replace each placeholder with the owning tool's real registrar. A
213
- // registrar whose domain id was not declared in any manifest is skipped
214
- // (hasDomain false) — the host never invents a domain a tool didn't
215
- // declare.
266
+ // 2. Replace each placeholder with the owning tool's real registrar — IN-HOST
267
+ // only for tools whose hooks may run in the host (bundled, or — inside the
268
+ // dispatch worker — the dispatched external tool). External tools in the
269
+ // host keep the deferred placeholder; their registrar installs worker-side.
216
270
  for (const tool of tools.list()) {
271
+ if (!shouldRunHookInHost(tool, provenance))
272
+ continue;
217
273
  const registrars = resolveToolHooks(tool).capabilityRegistrars;
218
274
  if (registrars === undefined)
219
275
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"config-and-capabilities.js","sourceRoot":"","sources":["../../src/bootstrap/config-and-capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-and-capabilities.js","sourceRoot":"","sources":["../../src/bootstrap/config-and-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * dispatch-external-tool-command — the HOST supervisor for the out-of-process
3
+ * external tool COMMAND dispatch plane (ADR-0054, increments M4-C / M4-D / M4-E).
4
+ *
5
+ * For an EXTERNAL-provenance tool command (installed / project-local /
6
+ * user-global), the host forks the {@link executeToolCommandWorker} entry
7
+ * instead of importing + running the handler in-process. The worker imports the
8
+ * untrusted runtime and runs the handler; this supervisor:
9
+ *
10
+ * 1. marshals the minimal serializable {@link ToolCommandWorkerSpec} to a temp
11
+ * file and forks the worker entry via the shared {@link runWorkerSpec}
12
+ * fork/IPC core, which turns a child throw / `process.exit` / crash /
13
+ * premature-exit / fork-failure into a structured parent-side rejection,
14
+ * enforces the wall-clock timeout, serves the worker's host-RPC upcalls
15
+ * against the REAL host {@link ToolCliContext}, and inherits run correlation
16
+ * through the child env;
17
+ * 2. on success, replays the slim {@link ToolCommandResult} through the REAL
18
+ * host seams (`render` / `emitEnvelope` / `emitJson` / `emitRaw` /
19
+ * `emitError` / `setExitCode`) so the output contract stays byte-identical
20
+ * to the in-process path.
21
+ *
22
+ * Bundled first-party tools never reach here — they stay in-process (the trusted
23
+ * computing base). External tools have NO in-process fallback by trust tier
24
+ * (ADR-0054): a fork failure is a hard, structured error, not a silent in-host
25
+ * run.
26
+ */
27
+ import { type ToolProvenance } from '@opensip-cli/core';
28
+ import { type DispatchHostCtx } from './dispatch-replay-result.js';
29
+ export interface DispatchExternalToolCommandArgs {
30
+ /** The external tool's provenance (source must NOT be `'bundled'`). */
31
+ readonly provenance: ToolProvenance;
32
+ /** Which command (by `CommandSpec.name`) to run in the worker. */
33
+ readonly commandName: string;
34
+ /** Parsed opts for this invocation (serializable). */
35
+ readonly opts: Record<string, unknown>;
36
+ /** Trailing positionals (`_args`) for this invocation (serializable). */
37
+ readonly positionals: readonly unknown[];
38
+ /**
39
+ * The tool's RAW config namespace block for the WORKER deep pass (ADR-0054
40
+ * M4-E Config two-pass). Forwarded into the spec so the worker runs the tool's
41
+ * real Zod after load. `undefined` when there is no block to validate.
42
+ */
43
+ readonly config?: unknown;
44
+ /** The real host context the supervisor replays the worker result through. */
45
+ readonly ctx: DispatchHostCtx;
46
+ /** Override the wall-clock timeout (tests use a short one). */
47
+ readonly timeoutMs?: number;
48
+ /**
49
+ * Override the CLI entry script the supervisor forks (defaults to
50
+ * `process.argv[1]`). The worker runs as `node <cliScript> __tool-command-worker
51
+ * <specPath> --cwd <cwd>`, going through the full bootstrap so the dispatched
52
+ * tool's scope (config/registries/subscope) is worker-local (ADR-0054 M4-E).
53
+ * Tests point this at the built CLI dist entry.
54
+ */
55
+ readonly cliScript?: string;
56
+ }
57
+ /**
58
+ * Fork the worker, await its slim {@link ToolCommandResult}, and replay it
59
+ * through the host seams. A worker fault (throw / `process.exit` / crash /
60
+ * timeout / fork failure) becomes a structured {@link ToolError} — the host never
61
+ * crashes.
62
+ *
63
+ * @throws {SystemError} when the external command's provenance is `'bundled'`
64
+ * (a misuse — bundled tools run in-process), or when the worker fails.
65
+ */
66
+ export declare function dispatchExternalToolCommand(args: DispatchExternalToolCommandArgs): Promise<void>;
67
+ //# sourceMappingURL=dispatch-external-tool-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-external-tool-command.d.ts","sourceRoot":"","sources":["../../src/bootstrap/dispatch-external-tool-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAA6B,KAAK,cAAc,EAAmB,MAAM,mBAAmB,CAAC;AAOpG,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAIjF,MAAM,WAAW,+BAA+B;IAC9C,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,+BAA+B,GACpC,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * dispatch-external-tool-command — the HOST supervisor for the out-of-process
3
+ * external tool COMMAND dispatch plane (ADR-0054, increments M4-C / M4-D / M4-E).
4
+ *
5
+ * For an EXTERNAL-provenance tool command (installed / project-local /
6
+ * user-global), the host forks the {@link executeToolCommandWorker} entry
7
+ * instead of importing + running the handler in-process. The worker imports the
8
+ * untrusted runtime and runs the handler; this supervisor:
9
+ *
10
+ * 1. marshals the minimal serializable {@link ToolCommandWorkerSpec} to a temp
11
+ * file and forks the worker entry via the shared {@link runWorkerSpec}
12
+ * fork/IPC core, which turns a child throw / `process.exit` / crash /
13
+ * premature-exit / fork-failure into a structured parent-side rejection,
14
+ * enforces the wall-clock timeout, serves the worker's host-RPC upcalls
15
+ * against the REAL host {@link ToolCliContext}, and inherits run correlation
16
+ * through the child env;
17
+ * 2. on success, replays the slim {@link ToolCommandResult} through the REAL
18
+ * host seams (`render` / `emitEnvelope` / `emitJson` / `emitRaw` /
19
+ * `emitError` / `setExitCode`) so the output contract stays byte-identical
20
+ * to the in-process path.
21
+ *
22
+ * Bundled first-party tools never reach here — they stay in-process (the trusted
23
+ * computing base). External tools have NO in-process fallback by trust tier
24
+ * (ADR-0054): a fork failure is a hard, structured error, not a silent in-host
25
+ * run.
26
+ */
27
+ import { currentScope, SystemError } from '@opensip-cli/core';
28
+ import { DEFAULT_DISPATCH_TIMEOUT_MS, requirePackageDir, runWorkerSpec, } from './dispatch-fork-core.js';
29
+ import { replayResult } from './dispatch-replay-result.js';
30
+ /**
31
+ * Fork the worker, await its slim {@link ToolCommandResult}, and replay it
32
+ * through the host seams. A worker fault (throw / `process.exit` / crash /
33
+ * timeout / fork failure) becomes a structured {@link ToolError} — the host never
34
+ * crashes.
35
+ *
36
+ * @throws {SystemError} when the external command's provenance is `'bundled'`
37
+ * (a misuse — bundled tools run in-process), or when the worker fails.
38
+ */
39
+ export async function dispatchExternalToolCommand(args) {
40
+ if (args.provenance.source === 'bundled') {
41
+ throw new SystemError('dispatchExternalToolCommand called for a bundled tool; bundled tools run in-process.', { code: 'SYSTEM.DISPATCH.BUNDLED_MISUSE' });
42
+ }
43
+ // Lifecycle observability: the out-of-process dispatch is a major run phase, so
44
+ // emit a structured event onto the scope DiagnosticsBus (the same bus the
45
+ // in-process action emits `execute` events onto). A `--json` consumer reads
46
+ // `outcome.diagnostics.events` for context even without full OTEL.
47
+ const diagnostics = currentScope()?.diagnostics;
48
+ diagnostics?.event('execute', 'debug', `dispatching external tool '${args.provenance.id}' command '${args.commandName}' out-of-process`);
49
+ const result = await runCommandWorker(args);
50
+ diagnostics?.event('execute', 'debug', `external tool '${args.provenance.id}' command '${args.commandName}' worker resolved`);
51
+ await replayResult(result, args.ctx, {
52
+ commandName: args.commandName,
53
+ opts: { ...args.opts, _args: args.positionals },
54
+ positionals: args.positionals,
55
+ });
56
+ }
57
+ /** Marshal the command spec + run it through the shared fork/IPC core. */
58
+ function runCommandWorker(args) {
59
+ const spec = {
60
+ toolId: args.provenance.id,
61
+ toolPackageDir: requirePackageDir(args.provenance),
62
+ source: args.provenance.source,
63
+ commandName: args.commandName,
64
+ opts: args.opts,
65
+ positionals: args.positionals,
66
+ // ADR-0054 M4-E: forward the coarse-validated config block so the worker can
67
+ // run the tool's real Zod deep pass after load. Omitted when no block exists.
68
+ ...(args.config === undefined ? {} : { config: args.config }),
69
+ };
70
+ const cwd = typeof args.opts.cwd === 'string' ? args.opts.cwd : process.cwd();
71
+ return runWorkerSpec({
72
+ spec,
73
+ ctx: args.ctx,
74
+ cwd,
75
+ ...(args.cliScript === undefined ? {} : { cliScript: args.cliScript }),
76
+ timeoutMs: args.timeoutMs ?? DEFAULT_DISPATCH_TIMEOUT_MS,
77
+ });
78
+ }
79
+ //# sourceMappingURL=dispatch-external-tool-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-external-tool-command.js","sourceRoot":"","sources":["../../src/bootstrap/dispatch-external-tool-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAwC,MAAM,mBAAmB,CAAC;AAEpG,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAwB,MAAM,6BAA6B,CAAC;AAiCjF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAqC;IAErC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,IAAI,WAAW,CACnB,sFAAsF,EACtF,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAC3C,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,0EAA0E;IAC1E,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,WAAW,GAAG,YAAY,EAAE,EAAE,WAAW,CAAC;IAChD,WAAW,EAAE,KAAK,CAChB,SAAS,EACT,OAAO,EACP,8BAA8B,IAAI,CAAC,UAAU,CAAC,EAAE,cAAc,IAAI,CAAC,WAAW,kBAAkB,CACjG,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,EAAE,KAAK,CAChB,SAAS,EACT,OAAO,EACP,kBAAkB,IAAI,CAAC,UAAU,CAAC,EAAE,cAAc,IAAI,CAAC,WAAW,mBAAmB,CACtF,CAAC;IACF,MAAM,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE;QAC/C,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,IAAqC;IAC7D,MAAM,IAAI,GAA0B;QAClC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;QAC1B,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAwC;QAChE,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,6EAA6E;QAC7E,8EAA8E;QAC9E,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC9D,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9E,OAAO,aAAa,CAAC;QACnB,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG;QACH,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,2BAA2B;KACzD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * dispatch-external-tool-hook — the HOST supervisor for running an EXTERNAL
3
+ * tool's LIFECYCLE HOOK out-of-process (ADR-0054 M4-F).
4
+ *
5
+ * After M4-F the host never executes an external-provenance tool's lifecycle
6
+ * hooks in-process. Two host-command hooks still need the tool's runtime to
7
+ * produce data: `collectReportData` (the `report` command + report auto-open) and
8
+ * `sessionReplay` (`sessions show`). For an external tool the host forks the SAME
9
+ * `__tool-command-worker` subcommand the command dispatch uses — but in HOOK mode
10
+ * (the spec sets `hook` instead of `commandName`). The worker imports the
11
+ * untrusted runtime, runs the named hook against its own re-bootstrapped scope,
12
+ * and returns the hook's plain-data result in {@link ToolCommandResult.hookResult}.
13
+ *
14
+ * The host gets the data WITHOUT executing the external runtime in the kernel
15
+ * process. A fork failure / throw / timeout is a structured {@link ToolError} —
16
+ * the host never crashes and never falls back to in-host execution.
17
+ */
18
+ import { type ToolProvenance } from '@opensip-cli/core';
19
+ import { type DispatchHostCtx } from './dispatch-replay-result.js';
20
+ import type { ToolCommandWorkerSpec } from './tool-command-dispatch-types.js';
21
+ export interface DispatchExternalToolHookArgs {
22
+ /** The external tool's provenance (source must NOT be `'bundled'`). */
23
+ readonly provenance: ToolProvenance;
24
+ /** Which lifecycle hook to run in the worker. */
25
+ readonly hook: NonNullable<ToolCommandWorkerSpec['hook']>;
26
+ /** The serializable argument the hook needs (e.g. the stored session row). */
27
+ readonly hookArg?: unknown;
28
+ /** The project cwd the worker bootstraps against (steers discovery + project). */
29
+ readonly cwd: string;
30
+ /** The real host context the supervisor serves host-RPC upcalls through. */
31
+ readonly ctx: DispatchHostCtx;
32
+ /** Override the wall-clock timeout (tests use a short one). */
33
+ readonly timeoutMs?: number;
34
+ /** Override the CLI entry script the supervisor forks (defaults to argv[1]). */
35
+ readonly cliScript?: string;
36
+ }
37
+ /**
38
+ * Run one external tool lifecycle hook in a forked worker and return its
39
+ * plain-data result. A worker fault becomes a structured {@link ToolError} — the
40
+ * host never crashes; external runtime never falls back to in-host execution.
41
+ *
42
+ * @returns The hook's result (`hookResult`) — a `Record<string, unknown>` for
43
+ * `collectReportData`, a `ToolSessionReplay` for `sessionReplay`, or `undefined`
44
+ * when the worker tool declared no such hook.
45
+ */
46
+ export declare function dispatchExternalToolHook(args: DispatchExternalToolHookArgs): Promise<unknown>;
47
+ //# sourceMappingURL=dispatch-external-tool-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-external-tool-hook.d.ts","sourceRoot":"","sources":["../../src/bootstrap/dispatch-external-tool-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,mBAAmB,CAAC;AAOzE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE9E,MAAM,WAAW,4BAA4B;IAC3C,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,4BAA4B,GACjC,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * dispatch-external-tool-hook — the HOST supervisor for running an EXTERNAL
3
+ * tool's LIFECYCLE HOOK out-of-process (ADR-0054 M4-F).
4
+ *
5
+ * After M4-F the host never executes an external-provenance tool's lifecycle
6
+ * hooks in-process. Two host-command hooks still need the tool's runtime to
7
+ * produce data: `collectReportData` (the `report` command + report auto-open) and
8
+ * `sessionReplay` (`sessions show`). For an external tool the host forks the SAME
9
+ * `__tool-command-worker` subcommand the command dispatch uses — but in HOOK mode
10
+ * (the spec sets `hook` instead of `commandName`). The worker imports the
11
+ * untrusted runtime, runs the named hook against its own re-bootstrapped scope,
12
+ * and returns the hook's plain-data result in {@link ToolCommandResult.hookResult}.
13
+ *
14
+ * The host gets the data WITHOUT executing the external runtime in the kernel
15
+ * process. A fork failure / throw / timeout is a structured {@link ToolError} —
16
+ * the host never crashes and never falls back to in-host execution.
17
+ */
18
+ import { DEFAULT_DISPATCH_TIMEOUT_MS, requirePackageDir, runWorkerSpec, } from './dispatch-fork-core.js';
19
+ /**
20
+ * Run one external tool lifecycle hook in a forked worker and return its
21
+ * plain-data result. A worker fault becomes a structured {@link ToolError} — the
22
+ * host never crashes; external runtime never falls back to in-host execution.
23
+ *
24
+ * @returns The hook's result (`hookResult`) — a `Record<string, unknown>` for
25
+ * `collectReportData`, a `ToolSessionReplay` for `sessionReplay`, or `undefined`
26
+ * when the worker tool declared no such hook.
27
+ */
28
+ export async function dispatchExternalToolHook(args) {
29
+ const spec = {
30
+ toolId: args.provenance.id,
31
+ toolPackageDir: requirePackageDir(args.provenance),
32
+ source: args.provenance.source,
33
+ hook: args.hook,
34
+ // The worker resolves the project cwd from the spec opts (symmetric to the
35
+ // command path). Hook mode carries no Commander opts/positionals.
36
+ opts: { cwd: args.cwd },
37
+ positionals: [],
38
+ ...(args.hookArg === undefined ? {} : { hookArg: args.hookArg }),
39
+ };
40
+ const result = await runWorkerSpec({
41
+ spec,
42
+ ctx: args.ctx,
43
+ cwd: args.cwd,
44
+ ...(args.cliScript === undefined ? {} : { cliScript: args.cliScript }),
45
+ timeoutMs: args.timeoutMs ?? DEFAULT_DISPATCH_TIMEOUT_MS,
46
+ });
47
+ return result.hookResult;
48
+ }
49
+ //# sourceMappingURL=dispatch-external-tool-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-external-tool-hook.js","sourceRoot":"","sources":["../../src/bootstrap/dispatch-external-tool-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EACL,2BAA2B,EAC3B,iBAAiB,EACjB,aAAa,GACd,MAAM,yBAAyB,CAAC;AAsBjC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAkC;IAElC,MAAM,IAAI,GAA0B;QAClC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE;QAC1B,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAwC;QAChE,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,2EAA2E;QAC3E,kEAAkE;QAClE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,WAAW,EAAE,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;KACjE,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,2BAA2B;KACzD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * dispatch-fork-core — the shared fork + IPC settle + host-RPC supervisor for the
3
+ * ADR-0054 out-of-process external-tool worker (increments M4-C / M4-D / M4-F).
4
+ *
5
+ * Both supervisors fork the SAME internal `__tool-command-worker` subcommand and
6
+ * settle on the SAME `ToolCommandResult` shape:
7
+ * - `dispatch-external-tool-command.ts` runs an external tool's COMMAND;
8
+ * - `dispatch-external-tool-hook.ts` (M4-F) runs an external tool's LIFECYCLE
9
+ * HOOK (`collectReportData` / `sessionReplay`).
10
+ *
11
+ * They differ only in the {@link ToolCommandWorkerSpec} they marshal (a
12
+ * `commandName` vs a `hook`) and how they replay the result. This module owns the
13
+ * common machinery so neither duplicates it: marshal the spec to a temp file,
14
+ * fork the CLI binary as the worker subcommand (full bootstrap re-runs
15
+ * worker-local), enforce a wall-clock timeout, serve mid-run host-RPC upcalls
16
+ * against the REAL host `ToolCliContext`, and resolve the worker's
17
+ * {@link ToolCommandResult} (or reject with a structured {@link ToolError}).
18
+ *
19
+ * The host remains the ONLY process that performs the privileged effect; a worker
20
+ * fault (throw / `process.exit` / crash / timeout / fork failure) becomes a
21
+ * structured parent-side {@link ToolError} — the host never crashes and external
22
+ * runtime NEVER falls back to in-host execution (ADR-0054 trust tier).
23
+ */
24
+ import { type ToolError, type ToolProvenance } from '@opensip-cli/core';
25
+ import { type DispatchHostCtx } from './dispatch-replay-result.js';
26
+ import type { ToolCommandResult, ToolCommandWorkerSpec } from './tool-command-dispatch-types.js';
27
+ /** Default supervisor wall-clock timeout for one forked worker run (ms). */
28
+ export declare const DEFAULT_DISPATCH_TIMEOUT_MS = 120000;
29
+ /** The internal worker subcommand the supervisor forks the CLI binary into. */
30
+ export declare const WORKER_SUBCOMMAND = "__tool-command-worker";
31
+ /** Resolve the package dir for an external tool, or fail with a structured error. */
32
+ export declare function requirePackageDir(provenance: ToolProvenance): string;
33
+ /**
34
+ * Marshal a worker spec to a temp file, fork the worker, enforce the timeout, and
35
+ * resolve the worker's {@link ToolCommandResult}. The temp dir is always cleaned
36
+ * up. `cliScript` defaults to the running CLI entry; tests point it at the dist
37
+ * entry. `cwd` defaults to the spec's `opts.cwd` (or `process.cwd()`).
38
+ */
39
+ export declare function runWorkerSpec(args: {
40
+ readonly spec: ToolCommandWorkerSpec;
41
+ readonly ctx: DispatchHostCtx;
42
+ readonly cwd: string;
43
+ readonly cliScript?: string;
44
+ readonly timeoutMs?: number;
45
+ }): Promise<ToolCommandResult>;
46
+ /** Build a structured supervisor-side dispatch error, logged with its failure class. */
47
+ export declare function dispatchError(spec: ToolCommandWorkerSpec, message: string, failureClass: string): ToolError;
48
+ //# sourceMappingURL=dispatch-fork-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-fork-core.d.ts","sourceRoot":"","sources":["../../src/bootstrap/dispatch-fork-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,KAAK,EAGV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,kCAAkC,CAAC;AAE1C,4EAA4E;AAC5E,eAAO,MAAM,2BAA2B,SAAU,CAAC;AAEnD,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,0BAA0B,CAAC;AAQzD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CASpE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAa7B;AAmJD,wFAAwF;AACxF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,SAAS,CAoBX"}