@openscout/scout 0.2.69 → 0.2.72

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.
@@ -8,6 +8,7 @@ import { fileURLToPath } from "url";
8
8
 
9
9
  // packages/runtime/src/broker-api.ts
10
10
  import { request as httpRequest } from "http";
11
+ var DEFAULT_BROKER_JSON_REQUEST_TIMEOUT_MS = 30000;
11
12
  function normalizeBaseUrl(baseUrl) {
12
13
  const trimmed = baseUrl.trim();
13
14
  if (!trimmed) {
@@ -108,12 +109,19 @@ function requestBrokerOverUnixSocket(socketPath, baseUrl, path, options) {
108
109
  request.end();
109
110
  });
110
111
  }
112
+ function defaultBrokerRequestSignal(options) {
113
+ return options.signal ?? AbortSignal.timeout(DEFAULT_BROKER_JSON_REQUEST_TIMEOUT_MS);
114
+ }
111
115
  async function requestBrokerWire(baseUrl, path, options) {
116
+ const requestOptions = {
117
+ ...options,
118
+ signal: defaultBrokerRequestSignal(options)
119
+ };
112
120
  const socketPath = options.socketPath?.trim();
113
121
  if (socketPath) {
114
122
  try {
115
123
  return {
116
- response: await requestBrokerOverUnixSocket(socketPath, baseUrl, path, options),
124
+ response: await requestBrokerOverUnixSocket(socketPath, baseUrl, path, requestOptions),
117
125
  trace: {
118
126
  transport: "unix_socket",
119
127
  socketPath
@@ -124,7 +132,7 @@ async function requestBrokerWire(baseUrl, path, options) {
124
132
  throw error;
125
133
  }
126
134
  return {
127
- response: await requestBrokerOverHttp(baseUrl, path, options),
135
+ response: await requestBrokerOverHttp(baseUrl, path, requestOptions),
128
136
  trace: {
129
137
  transport: "http",
130
138
  socketPath,
@@ -134,7 +142,7 @@ async function requestBrokerWire(baseUrl, path, options) {
134
142
  }
135
143
  }
136
144
  return {
137
- response: await requestBrokerOverHttp(baseUrl, path, options),
145
+ response: await requestBrokerOverHttp(baseUrl, path, requestOptions),
138
146
  trace: {
139
147
  transport: "http"
140
148
  }
@@ -175,6 +183,8 @@ function resolveOpenScoutSupportPaths() {
175
183
  const logsDirectory = join(supportDirectory, "logs");
176
184
  const runtimeDirectory = join(supportDirectory, "runtime");
177
185
  const catalogDirectory = join(supportDirectory, "catalog");
186
+ const controlHome = process.env.OPENSCOUT_CONTROL_HOME ?? join(home, ".openscout", "control-plane");
187
+ const knowledgeDirectory = join(controlHome, "knowledge");
178
188
  return {
179
189
  supportDirectory,
180
190
  logsDirectory,
@@ -186,8 +196,12 @@ function resolveOpenScoutSupportPaths() {
186
196
  settingsPath: join(supportDirectory, "settings.json"),
187
197
  harnessCatalogPath: join(catalogDirectory, "harness-catalog.json"),
188
198
  relayAgentsRegistryPath: join(supportDirectory, "relay-agents.json"),
199
+ managedInstallsPath: join(supportDirectory, "managed-installs.json"),
189
200
  relayHubDirectory: process.env.OPENSCOUT_RELAY_HUB ?? join(home, ".openscout", "relay"),
190
- controlHome: process.env.OPENSCOUT_CONTROL_HOME ?? join(home, ".openscout", "control-plane"),
201
+ controlHome,
202
+ knowledgeDirectory,
203
+ knowledgeQmdDirectory: join(knowledgeDirectory, "qmd"),
204
+ knowledgeSqlitePath: join(knowledgeDirectory, "knowledge.sqlite"),
191
205
  desktopStatusPath: join(supportDirectory, "agent-status.json"),
192
206
  workspaceStatePath: join(supportDirectory, "workspace-state.json"),
193
207
  cutoverMarkerPath: join(supportDirectory, OPENSCOUT_RPC_CUTOVER_MARKER)
@@ -339,6 +353,7 @@ function isLoopbackHost(host) {
339
353
  }
340
354
  var BROKER_SERVICE_POLL_INTERVAL_MS = 100;
341
355
  var DEFAULT_BROKER_START_TIMEOUT_MS = 15000;
356
+ var DEFAULT_BROKER_STOP_TIMEOUT_MS = 20000;
342
357
  function buildDefaultBrokerUrl(host = DEFAULT_BROKER_HOST, port = DEFAULT_BROKER_PORT) {
343
358
  return `http://${host}:${port}`;
344
359
  }
@@ -444,6 +459,13 @@ function resolveBrokerStartTimeoutMs() {
444
459
  }
445
460
  return DEFAULT_BROKER_START_TIMEOUT_MS;
446
461
  }
462
+ function resolveBrokerStopTimeoutMs() {
463
+ const explicit = Number.parseInt(process.env.OPENSCOUT_BROKER_STOP_TIMEOUT_MS ?? "", 10);
464
+ if (Number.isFinite(explicit) && explicit > 0) {
465
+ return Math.max(explicit, BROKER_SERVICE_POLL_INTERVAL_MS);
466
+ }
467
+ return DEFAULT_BROKER_STOP_TIMEOUT_MS;
468
+ }
447
469
  function resolveBrokerServiceLabel(mode) {
448
470
  const explicit = process.env.OPENSCOUT_SERVICE_LABEL?.trim() || process.env.OPENSCOUT_BROKER_SERVICE_LABEL?.trim();
449
471
  if (explicit) {
@@ -533,7 +555,18 @@ function renderLaunchAgentPlist(config) {
533
555
  "OPENSCOUT_NODE_QUALIFIER",
534
556
  "OPENSCOUT_TAILSCALE_BIN",
535
557
  "OPENSCOUT_TAILSCALE_STATUS_JSON",
536
- "OPENSCOUT_SSE_KEEPALIVE_MS"
558
+ "OPENSCOUT_SSE_KEEPALIVE_MS",
559
+ "OPENSCOUT_WEB_EDGE_SCHEME",
560
+ "OPENSCOUT_WEB_PUBLIC_ORIGIN",
561
+ "OPENSCOUT_WEB_PORTAL_HOST",
562
+ "OPENSCOUT_WEB_LOCAL_NAME",
563
+ "OPENSCOUT_WEB_ADVERTISED_HOST",
564
+ "OPENSCOUT_WEB_TRUSTED_HOSTS",
565
+ "OPENSCOUT_WEB_TRUSTED_ORIGINS",
566
+ "OPENSCOUT_WEB_PORT",
567
+ "OPENSCOUT_WEB_FLAG_BUNDLE",
568
+ "OPENSCOUT_WEB_EXPERIENCE",
569
+ "OPENSCOUT_WEB_AB_VARIANT"
537
570
  ])
538
571
  };
539
572
  if (coreAgentsValue) {
@@ -816,6 +849,7 @@ async function startBrokerService(config = resolveBrokerServiceConfig()) {
816
849
  bootoutLegacyBrokerService(config);
817
850
  writeLaunchAgentPlist(config);
818
851
  runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
852
+ await waitForBrokerServiceStopped(config);
819
853
  runCommand(launchctlPath(), ["bootstrap", config.domainTarget, config.launchAgentPath], { allowFailure: true });
820
854
  runCommand(launchctlPath(), ["kickstart", "-k", config.serviceTarget], { allowFailure: true });
821
855
  const attempts = Math.ceil(resolveBrokerStartTimeoutMs() / BROKER_SERVICE_POLL_INTERVAL_MS);
@@ -832,16 +866,21 @@ async function startBrokerService(config = resolveBrokerServiceConfig()) {
832
866
  function sleep(ms) {
833
867
  return new Promise((resolve3) => setTimeout(resolve3, ms));
834
868
  }
835
- async function stopBrokerService(config = resolveBrokerServiceConfig()) {
836
- runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
837
- for (let attempt = 0;attempt < 30; attempt += 1) {
838
- const status = await brokerServiceStatus(config);
839
- if (!status.health.reachable) {
869
+ async function waitForBrokerServiceStopped(config) {
870
+ let status = await brokerServiceStatus(config);
871
+ const attempts = Math.ceil(resolveBrokerStopTimeoutMs() / BROKER_SERVICE_POLL_INTERVAL_MS);
872
+ for (let attempt = 0;attempt < attempts; attempt += 1) {
873
+ status = await brokerServiceStatus(config);
874
+ if (!status.loaded && !status.health.reachable) {
840
875
  return status;
841
876
  }
842
877
  await sleep(BROKER_SERVICE_POLL_INTERVAL_MS);
843
878
  }
844
- return brokerServiceStatus(config);
879
+ return status;
880
+ }
881
+ async function stopBrokerService(config = resolveBrokerServiceConfig()) {
882
+ runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
883
+ return waitForBrokerServiceStopped(config);
845
884
  }
846
885
  async function restartBrokerService(config = resolveBrokerServiceConfig()) {
847
886
  await stopBrokerService(config);
@@ -8,6 +8,7 @@ import { fileURLToPath } from "url";
8
8
 
9
9
  // packages/runtime/src/broker-api.ts
10
10
  import { request as httpRequest } from "http";
11
+ var DEFAULT_BROKER_JSON_REQUEST_TIMEOUT_MS = 30000;
11
12
  function normalizeBaseUrl(baseUrl) {
12
13
  const trimmed = baseUrl.trim();
13
14
  if (!trimmed) {
@@ -108,12 +109,19 @@ function requestBrokerOverUnixSocket(socketPath, baseUrl, path, options) {
108
109
  request.end();
109
110
  });
110
111
  }
112
+ function defaultBrokerRequestSignal(options) {
113
+ return options.signal ?? AbortSignal.timeout(DEFAULT_BROKER_JSON_REQUEST_TIMEOUT_MS);
114
+ }
111
115
  async function requestBrokerWire(baseUrl, path, options) {
116
+ const requestOptions = {
117
+ ...options,
118
+ signal: defaultBrokerRequestSignal(options)
119
+ };
112
120
  const socketPath = options.socketPath?.trim();
113
121
  if (socketPath) {
114
122
  try {
115
123
  return {
116
- response: await requestBrokerOverUnixSocket(socketPath, baseUrl, path, options),
124
+ response: await requestBrokerOverUnixSocket(socketPath, baseUrl, path, requestOptions),
117
125
  trace: {
118
126
  transport: "unix_socket",
119
127
  socketPath
@@ -124,7 +132,7 @@ async function requestBrokerWire(baseUrl, path, options) {
124
132
  throw error;
125
133
  }
126
134
  return {
127
- response: await requestBrokerOverHttp(baseUrl, path, options),
135
+ response: await requestBrokerOverHttp(baseUrl, path, requestOptions),
128
136
  trace: {
129
137
  transport: "http",
130
138
  socketPath,
@@ -134,7 +142,7 @@ async function requestBrokerWire(baseUrl, path, options) {
134
142
  }
135
143
  }
136
144
  return {
137
- response: await requestBrokerOverHttp(baseUrl, path, options),
145
+ response: await requestBrokerOverHttp(baseUrl, path, requestOptions),
138
146
  trace: {
139
147
  transport: "http"
140
148
  }
@@ -175,6 +183,8 @@ function resolveOpenScoutSupportPaths() {
175
183
  const logsDirectory = join(supportDirectory, "logs");
176
184
  const runtimeDirectory = join(supportDirectory, "runtime");
177
185
  const catalogDirectory = join(supportDirectory, "catalog");
186
+ const controlHome = process.env.OPENSCOUT_CONTROL_HOME ?? join(home, ".openscout", "control-plane");
187
+ const knowledgeDirectory = join(controlHome, "knowledge");
178
188
  return {
179
189
  supportDirectory,
180
190
  logsDirectory,
@@ -186,8 +196,12 @@ function resolveOpenScoutSupportPaths() {
186
196
  settingsPath: join(supportDirectory, "settings.json"),
187
197
  harnessCatalogPath: join(catalogDirectory, "harness-catalog.json"),
188
198
  relayAgentsRegistryPath: join(supportDirectory, "relay-agents.json"),
199
+ managedInstallsPath: join(supportDirectory, "managed-installs.json"),
189
200
  relayHubDirectory: process.env.OPENSCOUT_RELAY_HUB ?? join(home, ".openscout", "relay"),
190
- controlHome: process.env.OPENSCOUT_CONTROL_HOME ?? join(home, ".openscout", "control-plane"),
201
+ controlHome,
202
+ knowledgeDirectory,
203
+ knowledgeQmdDirectory: join(knowledgeDirectory, "qmd"),
204
+ knowledgeSqlitePath: join(knowledgeDirectory, "knowledge.sqlite"),
191
205
  desktopStatusPath: join(supportDirectory, "agent-status.json"),
192
206
  workspaceStatePath: join(supportDirectory, "workspace-state.json"),
193
207
  cutoverMarkerPath: join(supportDirectory, OPENSCOUT_RPC_CUTOVER_MARKER)
@@ -335,6 +349,7 @@ function resolveBrokerHost(scope = resolveAdvertiseScope()) {
335
349
  }
336
350
  var BROKER_SERVICE_POLL_INTERVAL_MS = 100;
337
351
  var DEFAULT_BROKER_START_TIMEOUT_MS = 15000;
352
+ var DEFAULT_BROKER_STOP_TIMEOUT_MS = 20000;
338
353
  function buildDefaultBrokerUrl(host = DEFAULT_BROKER_HOST, port = DEFAULT_BROKER_PORT) {
339
354
  return `http://${host}:${port}`;
340
355
  }
@@ -430,6 +445,13 @@ function resolveBrokerStartTimeoutMs() {
430
445
  }
431
446
  return DEFAULT_BROKER_START_TIMEOUT_MS;
432
447
  }
448
+ function resolveBrokerStopTimeoutMs() {
449
+ const explicit = Number.parseInt(process.env.OPENSCOUT_BROKER_STOP_TIMEOUT_MS ?? "", 10);
450
+ if (Number.isFinite(explicit) && explicit > 0) {
451
+ return Math.max(explicit, BROKER_SERVICE_POLL_INTERVAL_MS);
452
+ }
453
+ return DEFAULT_BROKER_STOP_TIMEOUT_MS;
454
+ }
433
455
  function resolveBrokerServiceLabel(mode) {
434
456
  const explicit = process.env.OPENSCOUT_SERVICE_LABEL?.trim() || process.env.OPENSCOUT_BROKER_SERVICE_LABEL?.trim();
435
457
  if (explicit) {
@@ -519,7 +541,18 @@ function renderLaunchAgentPlist(config) {
519
541
  "OPENSCOUT_NODE_QUALIFIER",
520
542
  "OPENSCOUT_TAILSCALE_BIN",
521
543
  "OPENSCOUT_TAILSCALE_STATUS_JSON",
522
- "OPENSCOUT_SSE_KEEPALIVE_MS"
544
+ "OPENSCOUT_SSE_KEEPALIVE_MS",
545
+ "OPENSCOUT_WEB_EDGE_SCHEME",
546
+ "OPENSCOUT_WEB_PUBLIC_ORIGIN",
547
+ "OPENSCOUT_WEB_PORTAL_HOST",
548
+ "OPENSCOUT_WEB_LOCAL_NAME",
549
+ "OPENSCOUT_WEB_ADVERTISED_HOST",
550
+ "OPENSCOUT_WEB_TRUSTED_HOSTS",
551
+ "OPENSCOUT_WEB_TRUSTED_ORIGINS",
552
+ "OPENSCOUT_WEB_PORT",
553
+ "OPENSCOUT_WEB_FLAG_BUNDLE",
554
+ "OPENSCOUT_WEB_EXPERIENCE",
555
+ "OPENSCOUT_WEB_AB_VARIANT"
523
556
  ])
524
557
  };
525
558
  if (coreAgentsValue) {
@@ -802,6 +835,7 @@ async function startBrokerService(config = resolveBrokerServiceConfig()) {
802
835
  bootoutLegacyBrokerService(config);
803
836
  writeLaunchAgentPlist(config);
804
837
  runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
838
+ await waitForBrokerServiceStopped(config);
805
839
  runCommand(launchctlPath(), ["bootstrap", config.domainTarget, config.launchAgentPath], { allowFailure: true });
806
840
  runCommand(launchctlPath(), ["kickstart", "-k", config.serviceTarget], { allowFailure: true });
807
841
  const attempts = Math.ceil(resolveBrokerStartTimeoutMs() / BROKER_SERVICE_POLL_INTERVAL_MS);
@@ -818,16 +852,21 @@ async function startBrokerService(config = resolveBrokerServiceConfig()) {
818
852
  function sleep(ms) {
819
853
  return new Promise((resolve3) => setTimeout(resolve3, ms));
820
854
  }
821
- async function stopBrokerService(config = resolveBrokerServiceConfig()) {
822
- runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
823
- for (let attempt = 0;attempt < 30; attempt += 1) {
824
- const status = await brokerServiceStatus(config);
825
- if (!status.health.reachable) {
855
+ async function waitForBrokerServiceStopped(config) {
856
+ let status = await brokerServiceStatus(config);
857
+ const attempts = Math.ceil(resolveBrokerStopTimeoutMs() / BROKER_SERVICE_POLL_INTERVAL_MS);
858
+ for (let attempt = 0;attempt < attempts; attempt += 1) {
859
+ status = await brokerServiceStatus(config);
860
+ if (!status.loaded && !status.health.reachable) {
826
861
  return status;
827
862
  }
828
863
  await sleep(BROKER_SERVICE_POLL_INTERVAL_MS);
829
864
  }
830
- return brokerServiceStatus(config);
865
+ return status;
866
+ }
867
+ async function stopBrokerService(config = resolveBrokerServiceConfig()) {
868
+ runCommand(launchctlPath(), ["bootout", config.serviceTarget], { allowFailure: true });
869
+ return waitForBrokerServiceStopped(config);
831
870
  }
832
871
  async function restartBrokerService(config = resolveBrokerServiceConfig()) {
833
872
  await stopBrokerService(config);