@openscout/scout 0.2.53 → 0.2.55

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.
@@ -14,7 +14,6 @@ var __export = (target, all) => {
14
14
  });
15
15
  };
16
16
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
- var __require = import.meta.require;
18
17
  // packages/agent-sessions/src/protocol/adapter.ts
19
18
  class BaseAdapter {
20
19
  config;
@@ -4389,7 +4388,14 @@ var init_dist = __esm(() => {
4389
4388
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4390
4389
  */
4391
4390
  });
4392
- // packages/protocol/src/agent-identity.ts
4391
+
4392
+ // packages/protocol/dist/common.js
4393
+ var init_common = () => {};
4394
+
4395
+ // packages/protocol/dist/actors.js
4396
+ var init_actors = () => {};
4397
+
4398
+ // packages/protocol/dist/agent-identity.js
4393
4399
  function trimIdentityPrefix(value) {
4394
4400
  return value.trim().replace(/^@+/, "").replace(/[.,!?;)\]]+$/, "");
4395
4401
  }
@@ -4739,17 +4745,17 @@ var init_agent_identity = __esm(() => {
4739
4745
  resolveAgentSelector = resolveAgentIdentity;
4740
4746
  });
4741
4747
 
4742
- // packages/protocol/src/agent-address.ts
4748
+ // packages/protocol/dist/agent-address.js
4743
4749
  var init_agent_address = __esm(() => {
4744
4750
  init_agent_identity();
4745
4751
  });
4746
4752
 
4747
- // packages/protocol/src/agent-selectors.ts
4753
+ // packages/protocol/dist/agent-selectors.js
4748
4754
  var init_agent_selectors = __esm(() => {
4749
4755
  init_agent_address();
4750
4756
  });
4751
4757
 
4752
- // packages/protocol/src/scout-agent-card.ts
4758
+ // packages/protocol/dist/scout-agent-card.js
4753
4759
  function buildScoutReturnAddress(input) {
4754
4760
  const next = {
4755
4761
  actorId: input.actorId,
@@ -4784,11 +4790,48 @@ function buildScoutReturnAddress(input) {
4784
4790
  }
4785
4791
  return next;
4786
4792
  }
4787
- // packages/protocol/src/index.ts
4788
- var init_src2 = __esm(() => {
4793
+ // packages/protocol/dist/mesh.js
4794
+ var init_mesh = () => {};
4795
+
4796
+ // packages/protocol/dist/conversations.js
4797
+ var init_conversations = () => {};
4798
+ // packages/protocol/dist/messages.js
4799
+ var init_messages = () => {};
4800
+
4801
+ // packages/protocol/dist/invocations.js
4802
+ var init_invocations = () => {};
4803
+
4804
+ // packages/protocol/dist/scout-dispatch.js
4805
+ var init_scout_dispatch = () => {};
4806
+
4807
+ // packages/protocol/dist/deliveries.js
4808
+ var init_deliveries = () => {};
4809
+
4810
+ // packages/protocol/dist/transports.js
4811
+ var init_transports = () => {};
4812
+
4813
+ // packages/protocol/dist/events.js
4814
+ var init_events = () => {};
4815
+
4816
+ // packages/protocol/dist/thread-events.js
4817
+ var init_thread_events = () => {};
4818
+
4819
+ // packages/protocol/dist/index.js
4820
+ var init_dist2 = __esm(() => {
4821
+ init_common();
4822
+ init_actors();
4789
4823
  init_agent_identity();
4790
4824
  init_agent_address();
4791
4825
  init_agent_selectors();
4826
+ init_mesh();
4827
+ init_conversations();
4828
+ init_messages();
4829
+ init_invocations();
4830
+ init_scout_dispatch();
4831
+ init_deliveries();
4832
+ init_transports();
4833
+ init_events();
4834
+ init_thread_events();
4792
4835
  });
4793
4836
 
4794
4837
  // packages/runtime/src/support-paths.ts
@@ -7068,7 +7111,7 @@ async function initializeOpenScoutSetup(options = {}) {
7068
7111
  var SCOUT_AGENT_ID = "scout", SCOUT_PRIMARY_CONVERSATION_ID = "dm.scout.primary", MANAGED_AGENT_HARNESSES, DEFAULT_OPERATOR_NAME, DEFAULT_CAPABILITIES, DEFAULT_TRANSPORT = "claude_stream_json", DEFAULT_TELEGRAM_MODE = "polling", LEGACY_DEFAULT_TELEGRAM_CONVERSATION_ID = "channel.shared", DEFAULT_TELEGRAM_CONVERSATION_ID, SETTINGS_VERSION = 1, PROJECT_CONFIG_VERSION = 1, PROJECT_SCAN_SKIP_DIRECTORIES, PROJECT_STRONG_MARKERS, PROJECT_WEAK_MARKERS, PROJECT_HARNESS_MARKERS, PROJECT_STRONG_MARKERS_FLAT_NESTED, PROJECT_WEAK_MARKERS_FLAT_NESTED, GIT_BRANCH_CACHE_TTL_MS = 15000, gitBranchCache, SCOUT_SKILL_FILE_NAME = "SKILL.md", SETUP_MODULE_DIRECTORY, SCOUT_SKILL_REPO_ROOT, SCOUT_SKILL_INSTALL_PATHS, PROJECT_SCAN_MAX_DEPTH = 64;
7069
7112
  var init_setup = __esm(() => {
7070
7113
  init_dist();
7071
- init_src2();
7114
+ init_dist2();
7072
7115
  init_harness_catalog();
7073
7116
  init_support_paths();
7074
7117
  init_user_project_hints();
@@ -7784,6 +7827,7 @@ class ClaudeStreamJsonSession {
7784
7827
  await writeFile4(join13(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
7785
7828
  this.claudeSessionId = await readOptionalFile2(this.sessionStatePath);
7786
7829
  const args = [
7830
+ "--verbose",
7787
7831
  "--print",
7788
7832
  "--input-format",
7789
7833
  "stream-json",
@@ -11837,7 +11881,7 @@ function shouldDisableGeneratedCodexEndpoint(endpoint) {
11837
11881
  }
11838
11882
  var MODULE_DIRECTORY, OPENSCOUT_REPO_ROOT, DEFAULT_LOCAL_AGENT_CAPABILITIES, DEFAULT_LOCAL_AGENT_HARNESS = "claude", SUPPORTED_LOCAL_AGENT_HARNESSES;
11839
11883
  var init_local_agents = __esm(async () => {
11840
- init_src2();
11884
+ init_dist2();
11841
11885
  init_claude_stream_json();
11842
11886
  init_codex_app_server();
11843
11887
  init_setup();
@@ -11852,7 +11896,7 @@ var init_local_agents = __esm(async () => {
11852
11896
 
11853
11897
  // packages/web/server/index.ts
11854
11898
  import { existsSync as existsSync13 } from "fs";
11855
- import { dirname as dirname12, join as join20 } from "path";
11899
+ import { dirname as dirname12, join as join20, resolve as resolve9 } from "path";
11856
11900
  import { fileURLToPath as fileURLToPath8 } from "url";
11857
11901
 
11858
11902
  // packages/web/server/create-openscout-web-server.ts
@@ -14529,80 +14573,22 @@ function installScoutApiMiddleware(app, label = "api") {
14529
14573
  });
14530
14574
  }
14531
14575
  async function registerScoutWebAssets(app, options) {
14532
- if (options.assetMode === "vite-dev") {
14533
- const { createServer } = await import("vite");
14534
- const fs = await import("fs");
14535
- const path = await import("path");
14536
- const vite = await createServer({
14537
- configFile: options.viteConfigPath,
14538
- server: { middlewareMode: true, hmr: { port: 5183 } },
14539
- appType: "custom"
14540
- });
14541
- const viteRoot = (vite.config.root ?? process.cwd()).replace(/\/$/, "");
14542
- const proxyToVite = (req, url) => {
14543
- return new Promise((resolve5) => {
14544
- const http = __require("http");
14545
- const { Duplex } = __require("stream");
14546
- const socket = new Duplex({
14547
- read() {},
14548
- write(_chunk, _encoding, cb) {
14549
- cb();
14550
- }
14551
- });
14552
- const nodeReq = new http.IncomingMessage(socket);
14553
- nodeReq.method = req.method;
14554
- nodeReq.url = url.pathname + url.search;
14555
- nodeReq.headers = {};
14556
- for (const [key, value] of req.headers.entries()) {
14557
- nodeReq.headers[key.toLowerCase()] = value;
14558
- }
14559
- const nodeRes = new http.ServerResponse(nodeReq);
14560
- const chunks = [];
14561
- nodeRes.write = function(chunk) {
14562
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
14563
- return true;
14564
- };
14565
- const originalEnd = nodeRes.end.bind(nodeRes);
14566
- nodeRes.end = function(chunk) {
14567
- if (chunk) {
14568
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
14569
- }
14570
- const body = Buffer.concat(chunks);
14571
- const headers = new Headers;
14572
- for (const [key, val] of Object.entries(nodeRes.getHeaders())) {
14573
- if (val == null)
14574
- continue;
14575
- if (Array.isArray(val)) {
14576
- for (const v of val)
14577
- headers.append(key, v);
14578
- } else {
14579
- headers.set(key, String(val));
14580
- }
14581
- }
14582
- resolve5(new Response(body.length > 0 ? body : null, {
14583
- status: nodeRes.statusCode,
14584
- headers
14585
- }));
14586
- return originalEnd();
14587
- };
14588
- vite.middlewares.handle(nodeReq, nodeRes, async () => {
14589
- try {
14590
- const indexPath = path.join(viteRoot, "index.html");
14591
- let html2 = fs.readFileSync(indexPath, "utf-8");
14592
- html2 = await vite.transformIndexHtml(url.pathname, html2);
14593
- resolve5(new Response(html2, {
14594
- status: 200,
14595
- headers: { "content-type": "text/html; charset=utf-8" }
14596
- }));
14597
- } catch {
14598
- resolve5(new Response("Not Found", { status: 404 }));
14599
- }
14600
- });
14601
- });
14602
- };
14576
+ const viteUrl = options.viteDevUrl?.trim() || options.defaultViteUrl;
14577
+ if (options.assetMode === "vite-proxy") {
14603
14578
  app.all("/*", async (c) => {
14604
- const url = new URL(c.req.url);
14605
- return proxyToVite(c.req.raw, url);
14579
+ const target = new URL(c.req.path, viteUrl);
14580
+ target.search = new URL(c.req.url).search;
14581
+ const headers = new Headers(c.req.header());
14582
+ headers.delete("host");
14583
+ const response = await fetch(target.toString(), {
14584
+ method: c.req.method,
14585
+ headers,
14586
+ body: c.req.method !== "GET" && c.req.method !== "HEAD" ? c.req.raw.body : undefined
14587
+ });
14588
+ return new Response(response.body, {
14589
+ status: response.status,
14590
+ headers: response.headers
14591
+ });
14606
14592
  });
14607
14593
  return;
14608
14594
  }
@@ -15912,9 +15898,131 @@ function queryFleet(opts) {
15912
15898
  activity
15913
15899
  };
15914
15900
  }
15901
+ var WINDOW_TIERS = [
15902
+ { ms: 30 * 60000, label: "30m" },
15903
+ { ms: 60 * 60000, label: "1h" },
15904
+ { ms: 6 * 60 * 60000, label: "6h" },
15905
+ { ms: 24 * 60 * 60000, label: "24h" },
15906
+ { ms: 7 * 24 * 60 * 60000, label: "7d" }
15907
+ ];
15908
+ var MIN_FILLED_BUCKETS = 3;
15909
+ var _sealedCounts = new Map;
15910
+ var _cachedTier = null;
15911
+ function queryHeartrate(numBuckets = 48) {
15912
+ const nowMs = Date.now();
15913
+ let chosenTier = WINDOW_TIERS[WINDOW_TIERS.length - 1];
15914
+ for (const tier of WINDOW_TIERS) {
15915
+ const bucketMs2 = tier.ms / numBuckets;
15916
+ const currentBucketStart2 = Math.floor(nowMs / bucketMs2) * bucketMs2;
15917
+ const alignedStart2 = currentBucketStart2 - (numBuckets - 1) * bucketMs2;
15918
+ if (_cachedTier === tier.label) {
15919
+ let sealedHits = 0;
15920
+ let filledSealed = 0;
15921
+ for (let i = 0;i < numBuckets - 1; i++) {
15922
+ const key = String(alignedStart2 + i * bucketMs2);
15923
+ if (_sealedCounts.has(key)) {
15924
+ sealedHits++;
15925
+ if (_sealedCounts.get(key) > 0)
15926
+ filledSealed++;
15927
+ }
15928
+ }
15929
+ if (sealedHits === numBuckets - 1 && filledSealed >= MIN_FILLED_BUCKETS) {
15930
+ chosenTier = tier;
15931
+ break;
15932
+ }
15933
+ }
15934
+ const rows2 = db().prepare(`SELECT ts FROM activity_items WHERE ts >= ? ORDER BY ts ASC`).all(alignedStart2);
15935
+ const counts2 = new Array(numBuckets).fill(0);
15936
+ for (const row of rows2) {
15937
+ const ms = row.ts < 1000000000000 ? row.ts * 1000 : row.ts;
15938
+ if (ms < alignedStart2)
15939
+ continue;
15940
+ const idx = Math.min(numBuckets - 1, Math.floor((ms - alignedStart2) / bucketMs2));
15941
+ if (idx >= 0)
15942
+ counts2[idx]++;
15943
+ }
15944
+ const filled = counts2.filter((c) => c > 0).length;
15945
+ if (filled >= MIN_FILLED_BUCKETS) {
15946
+ if (_cachedTier !== tier.label) {
15947
+ _sealedCounts.clear();
15948
+ _cachedTier = tier.label;
15949
+ }
15950
+ for (let i = 0;i < numBuckets - 1; i++) {
15951
+ _sealedCounts.set(String(alignedStart2 + i * bucketMs2), counts2[i]);
15952
+ }
15953
+ const peak2 = Math.max(1, ...counts2);
15954
+ return {
15955
+ windowLabel: tier.label,
15956
+ buckets: counts2.map((count, i) => ({
15957
+ ts: Math.round(alignedStart2 + i * bucketMs2),
15958
+ count,
15959
+ value: count / peak2
15960
+ }))
15961
+ };
15962
+ }
15963
+ }
15964
+ const bucketMs = chosenTier.ms / numBuckets;
15965
+ const currentBucketStart = Math.floor(nowMs / bucketMs) * bucketMs;
15966
+ const alignedStart = currentBucketStart - (numBuckets - 1) * bucketMs;
15967
+ if (_cachedTier === chosenTier.label) {
15968
+ const counts2 = new Array(numBuckets).fill(0);
15969
+ let allSealed = true;
15970
+ for (let i = 0;i < numBuckets - 1; i++) {
15971
+ const key = String(alignedStart + i * bucketMs);
15972
+ if (_sealedCounts.has(key)) {
15973
+ counts2[i] = _sealedCounts.get(key);
15974
+ } else {
15975
+ allSealed = false;
15976
+ break;
15977
+ }
15978
+ }
15979
+ if (allSealed) {
15980
+ const liveStart = alignedStart + (numBuckets - 1) * bucketMs;
15981
+ const row = db().prepare(`SELECT COUNT(*) AS c FROM activity_items WHERE ts >= ?`).get(liveStart);
15982
+ counts2[numBuckets - 1] = row.c;
15983
+ const peak2 = Math.max(1, ...counts2);
15984
+ return {
15985
+ windowLabel: chosenTier.label,
15986
+ buckets: counts2.map((count, i) => ({
15987
+ ts: Math.round(alignedStart + i * bucketMs),
15988
+ count,
15989
+ value: count / peak2
15990
+ }))
15991
+ };
15992
+ }
15993
+ }
15994
+ _sealedCounts.clear();
15995
+ _cachedTier = chosenTier.label;
15996
+ const rows = db().prepare(`SELECT ts FROM activity_items WHERE ts >= ? ORDER BY ts ASC`).all(alignedStart);
15997
+ const counts = new Array(numBuckets).fill(0);
15998
+ for (const row of rows) {
15999
+ const ms = row.ts < 1000000000000 ? row.ts * 1000 : row.ts;
16000
+ if (ms < alignedStart)
16001
+ continue;
16002
+ const idx = Math.min(numBuckets - 1, Math.floor((ms - alignedStart) / bucketMs));
16003
+ if (idx >= 0)
16004
+ counts[idx]++;
16005
+ }
16006
+ for (let i = 0;i < numBuckets - 1; i++) {
16007
+ _sealedCounts.set(String(alignedStart + i * bucketMs), counts[i]);
16008
+ }
16009
+ for (const key of _sealedCounts.keys()) {
16010
+ if (Number(key) < alignedStart)
16011
+ _sealedCounts.delete(key);
16012
+ }
16013
+ const peak = Math.max(1, ...counts);
16014
+ return {
16015
+ windowLabel: chosenTier.label,
16016
+ buckets: counts.map((count, i) => ({
16017
+ ts: Math.round(alignedStart + i * bucketMs),
16018
+ count,
16019
+ value: count / peak
16020
+ }))
16021
+ };
16022
+ }
15915
16023
 
15916
16024
  // packages/web/server/core/broker/service.ts
15917
- init_src2();
16025
+ init_dist2();
15918
16026
  init_setup();
15919
16027
  init_support_paths();
15920
16028
  await init_local_agents();
@@ -17258,6 +17366,7 @@ async function createOpenScoutWebServer(options) {
17258
17366
  app.get("/api/shell-state/refresh", async (c) => c.json(await shellStateCache.refresh()));
17259
17367
  app.get("/api/agents", (c) => c.json(queryAgents()));
17260
17368
  app.get("/api/activity", (c) => c.json(queryActivity()));
17369
+ app.get("/api/heartrate", (c) => c.json(queryHeartrate()));
17261
17370
  app.get("/api/fleet", (c) => c.json(queryFleet({
17262
17371
  limit: parseOptionalPositiveInt(c.req.query("limit")),
17263
17372
  activityLimit: parseOptionalPositiveInt(c.req.query("activityLimit"))
@@ -17479,7 +17588,8 @@ async function createOpenScoutWebServer(options) {
17479
17588
  await registerScoutWebAssets(app, {
17480
17589
  assetMode: options.assetMode,
17481
17590
  staticRoot: resolveStaticRoot(options.staticRoot),
17482
- viteConfigPath: resolve8(dirname11(fileURLToPath7(import.meta.url)), "../vite.config.ts")
17591
+ viteDevUrl: options.viteDevUrl,
17592
+ defaultViteUrl: "http://127.0.0.1:5180"
17483
17593
  });
17484
17594
  const warmupCaches = () => Promise.allSettled([
17485
17595
  shellStateCache.refresh(),
@@ -17887,19 +17997,25 @@ function resolveStaticRoot2() {
17887
17997
  return process.env.OPENSCOUT_WEB_STATIC_ROOT.trim();
17888
17998
  }
17889
17999
  const selfDir = dirname12(fileURLToPath8(import.meta.url));
17890
- const siblingClient = join20(selfDir, "client", "index.html");
17891
- if (existsSync13(siblingClient)) {
17892
- return join20(selfDir, "client");
18000
+ const siblingClientRoot = join20(selfDir, "client");
18001
+ if (existsSync13(join20(siblingClientRoot, "index.html"))) {
18002
+ return siblingClientRoot;
18003
+ }
18004
+ const sourceDistClientRoot = resolve9(selfDir, "../dist/client");
18005
+ if (existsSync13(join20(sourceDistClientRoot, "index.html"))) {
18006
+ return sourceDistClientRoot;
17893
18007
  }
17894
18008
  return;
17895
18009
  }
17896
18010
  var staticRoot = resolveStaticRoot2();
17897
- var dev = !staticRoot;
17898
- var idleTimeoutSeconds = Number.parseInt(process.env.OPENSCOUT_WEB_IDLE_TIMEOUT_SECONDS?.trim() || (dev ? "180" : "30"), 10);
18011
+ var viteDevUrl = process.env.OPENSCOUT_WEB_VITE_URL?.trim() || undefined;
18012
+ var useViteProxy = Boolean(viteDevUrl) || !staticRoot;
18013
+ var idleTimeoutSeconds = Number.parseInt(process.env.OPENSCOUT_WEB_IDLE_TIMEOUT_SECONDS?.trim() || (useViteProxy ? "180" : "30"), 10);
17899
18014
  var { app, warmupCaches } = await createOpenScoutWebServer({
17900
18015
  currentDirectory,
17901
18016
  shellStateCacheTtlMs,
17902
- assetMode: dev ? "vite-dev" : "static",
18017
+ assetMode: useViteProxy ? "vite-proxy" : "static",
18018
+ viteDevUrl,
17903
18019
  staticRoot
17904
18020
  });
17905
18021
  var honoFetch = app.fetch;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openscout/scout",
3
- "version": "0.2.53",
3
+ "version": "0.2.55",
4
4
  "description": "Published Scout package that installs the `scout` command",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -23,6 +23,6 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@openscout/runtime": "0.2.53"
26
+ "@openscout/runtime": "0.2.55"
27
27
  }
28
28
  }