@openscout/scout 0.2.73 → 0.2.75

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 (52) hide show
  1. package/bin/scoutd +0 -0
  2. package/dist/build-manifest.json +9 -0
  3. package/dist/client/assets/{RepoDiffViewer-D8gg36W3.js → RepoDiffViewer-CTXJvjIL.js} +1 -1
  4. package/dist/client/assets/{addon-fit-D4KdY-pj.js → addon-fit-3IrvLm2n.js} +1 -1
  5. package/dist/client/assets/{addon-webgl-Bo_tmKBp.js → addon-webgl-BgxIDUI-.js} +1 -1
  6. package/dist/client/assets/{arc.es-D0gujIKy.js → arc.es-Bh8P_xre.js} +1 -1
  7. package/dist/client/assets/c-BIGW1oBm.js +1 -0
  8. package/dist/client/assets/cpp-DIPi6g--.js +1 -0
  9. package/dist/client/assets/css-CLj8gQPS.js +1 -0
  10. package/dist/client/assets/dart-bE4Kk8sk.js +1 -0
  11. package/dist/client/assets/docker-BcOcwvcX.js +1 -0
  12. package/dist/client/assets/{embed-entry-CUVNwyB_.js → embed-entry-wAEtYUEM.js} +1 -1
  13. package/dist/client/assets/go-C27-OAKa.js +1 -0
  14. package/dist/client/assets/html-pp8916En.js +1 -0
  15. package/dist/client/assets/index-BK3mRYyN.js +272 -0
  16. package/dist/client/assets/index-Dm1ZQS9G.css +1 -0
  17. package/dist/client/assets/java-CylS5w8V.js +1 -0
  18. package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
  19. package/dist/client/assets/json-Cp-IABpG.js +1 -0
  20. package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
  21. package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
  22. package/dist/client/assets/make-CHLpvVh8.js +1 -0
  23. package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
  24. package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
  25. package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
  26. package/dist/client/assets/python-B6aJPvgy.js +1 -0
  27. package/dist/client/assets/ruby-B13GW9FM.js +1 -0
  28. package/dist/client/assets/rust-B1yitclQ.js +1 -0
  29. package/dist/client/assets/scss-D5BDwBP9.js +1 -0
  30. package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
  31. package/dist/client/assets/sql-CRqJ_cUM.js +1 -0
  32. package/dist/client/assets/swift-D82vCrfD.js +1 -0
  33. package/dist/client/assets/toml-vGWfd6FD.js +1 -0
  34. package/dist/client/assets/tsx-COt5Ahok.js +1 -0
  35. package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
  36. package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
  37. package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
  38. package/dist/client/assets/{xterm-RfflDFod.js → xterm-CoGJTxj9.js} +1 -1
  39. package/dist/client/assets/yaml-Buea-lGh.js +1 -0
  40. package/dist/client/index.html +2 -2
  41. package/dist/main.mjs +887 -584
  42. package/dist/node/main.mjs +115 -1
  43. package/dist/pairing-runtime-controller.mjs +2525 -895
  44. package/dist/runtime/base-daemon.mjs +77 -20
  45. package/dist/runtime/broker-daemon.mjs +1403 -705
  46. package/dist/runtime/broker-process-manager.mjs +29 -0
  47. package/dist/runtime/mesh-discover.mjs +29 -0
  48. package/dist/scout-control-plane-web.mjs +2970 -1116
  49. package/dist/scout-web-server.mjs +2970 -1116
  50. package/package.json +1 -1
  51. package/dist/client/assets/index-CRkjiso5.js +0 -257
  52. package/dist/client/assets/index-D_RX2cRb.css +0 -1
@@ -182,6 +182,13 @@ import { existsSync as existsSync2, mkdirSync, rmSync, writeFileSync } from "nod
182
182
  import { homedir } from "node:os";
183
183
  import { join } from "node:path";
184
184
  var OPENSCOUT_RPC_CUTOVER_MARKER = "rpc-runtime-cutover-v1";
185
+ function assertTestIsolatedUserData(operation, isolationEnvKey) {
186
+ if (true)
187
+ return;
188
+ if (process.env[isolationEnvKey]?.trim())
189
+ return;
190
+ throw new Error(`Refusing to ${operation} while NODE_ENV=test without ${isolationEnvKey} set. ` + "Tests must isolate OpenScout user data in a temp directory (see prepareHome in onboarding.test.ts).");
191
+ }
185
192
  function resolveOpenScoutSupportPaths() {
186
193
  const home = homedir();
187
194
  const supportDirectory = process.env.OPENSCOUT_SUPPORT_DIRECTORY ?? join(home, "Library", "Application Support", "OpenScout");
@@ -214,6 +221,7 @@ function resolveOpenScoutSupportPaths() {
214
221
  };
215
222
  }
216
223
  function ensureOpenScoutCleanSlateSync() {
224
+ assertTestIsolatedUserData("reset the OpenScout support directory", "OPENSCOUT_SUPPORT_DIRECTORY");
217
225
  const paths = resolveOpenScoutSupportPaths();
218
226
  if (existsSync2(paths.cutoverMarkerPath)) {
219
227
  return;
@@ -1701,6 +1709,7 @@ function resolveBrokerPort() {
1701
1709
  return resolveEffectiveLocalConfig().ports?.broker ?? DEFAULT_LOCAL_CONFIG.ports.broker;
1702
1710
  }
1703
1711
  function writeLocalConfig(config) {
1712
+ assertTestIsolatedUserData("write the OpenScout local config", "OPENSCOUT_HOME");
1704
1713
  const configPath = localConfigPath();
1705
1714
  mkdirSync2(dirname(configPath), { recursive: true });
1706
1715
  const body = JSON.stringify({ ...config, version: LOCAL_CONFIG_VERSION }, null, 2) + `
@@ -2180,6 +2189,29 @@ function readNumber2(value) {
2180
2189
  function readHealthTransport(value) {
2181
2190
  return value === "unix_socket" || value === "http" || value === "in_process" ? value : undefined;
2182
2191
  }
2192
+ function readRuntimeFreshness(value) {
2193
+ if (!isRecord3(value))
2194
+ return;
2195
+ const state = readString2(value.state);
2196
+ const basis = readString2(value.basis);
2197
+ const detail = readString2(value.detail);
2198
+ if (!state || !basis || !detail)
2199
+ return;
2200
+ return {
2201
+ state,
2202
+ intentional: readBoolean(value.intentional) ?? false,
2203
+ basis,
2204
+ artifactCommit: readString2(value.artifactCommit) ?? null,
2205
+ expectedCommit: readString2(value.expectedCommit) ?? null,
2206
+ pin: readString2(value.pin) ?? null,
2207
+ pinReason: readString2(value.pinReason) ?? null,
2208
+ manifestPath: readString2(value.manifestPath) ?? null,
2209
+ version: readString2(value.version) ?? null,
2210
+ builtAt: readString2(value.builtAt) ?? null,
2211
+ sourceDirty: readBoolean(value.sourceDirty) ?? null,
2212
+ detail
2213
+ };
2214
+ }
2183
2215
  function normalizeNativeServiceStatus(input, config) {
2184
2216
  const healthRecord = isRecord3(input.health) ? input.health : {};
2185
2217
  const healthReachable = readBoolean(healthRecord.reachable) ?? readBoolean(input.reachable) ?? false;
@@ -2195,6 +2227,7 @@ function normalizeNativeServiceStatus(input, config) {
2195
2227
  const stdoutLogPath = readString2(input.stdoutLogPath) ?? config.stdoutLogPath;
2196
2228
  const stderrLogPath = readString2(input.stderrLogPath) ?? config.stderrLogPath;
2197
2229
  const lastLogLine = readString2(input.lastLogLine) ?? (healthReachable ? readLastLogLine([stdoutLogPath, stderrLogPath]) : readLastLogLine([stderrLogPath, stdoutLogPath]));
2230
+ const runtimeFreshness = readRuntimeFreshness(input.runtimeFreshness);
2198
2231
  return {
2199
2232
  label: readString2(input.label) ?? config.label,
2200
2233
  mode: readString2(input.mode) ?? config.mode,
@@ -2229,6 +2262,7 @@ function normalizeNativeServiceStatus(input, config) {
2229
2262
  ...isRecord3(healthRecord.services) ? { services: healthRecord.services } : {},
2230
2263
  error: healthError
2231
2264
  },
2265
+ ...runtimeFreshness ? { runtimeFreshness } : {},
2232
2266
  lastLogLine
2233
2267
  };
2234
2268
  }
@@ -2533,8 +2567,12 @@ function formatBrokerServiceStatus(status) {
2533
2567
  `reachable: ${status.reachable ? "yes" : "no"}`,
2534
2568
  `health: ${status.health.ok ? "ok" : status.health.error ?? "unreachable"}`,
2535
2569
  `health transport: ${status.health.transport ?? "unknown"}`,
2570
+ `runtime freshness: ${status.runtimeFreshness?.state ?? "unavailable"}`,
2536
2571
  `logs: ${status.stdoutLogPath}`
2537
2572
  ];
2573
+ if (status.runtimeFreshness) {
2574
+ lines.push(`runtime freshness detail: ${status.runtimeFreshness.detail}`);
2575
+ }
2538
2576
  if (status.health.socketFallbackError) {
2539
2577
  lines.push(`socket fallback: ${status.health.socketFallbackError}`);
2540
2578
  }
@@ -2778,6 +2816,10 @@ var BUILT_IN_HARNESS_CATALOG = [
2778
2816
  command: "claude",
2779
2817
  sessionFlag: "--resume"
2780
2818
  },
2819
+ sessionDefaults: {
2820
+ defaultTransport: "tmux",
2821
+ fallbackTransports: ["claude_stream_json"]
2822
+ },
2781
2823
  capabilities: ["chat", "invoke", "deliver", "summarize", "review"]
2782
2824
  },
2783
2825
  {
@@ -2814,6 +2856,10 @@ var BUILT_IN_HARNESS_CATALOG = [
2814
2856
  command: "grok",
2815
2857
  sessionFlag: "--resume"
2816
2858
  },
2859
+ sessionDefaults: {
2860
+ defaultHarness: "grok-acp",
2861
+ defaultTransport: "grok_acp"
2862
+ },
2817
2863
  capabilities: ["chat", "invoke", "deliver", "summarize", "review"],
2818
2864
  metadata: {
2819
2865
  invocationModel: "tmux_interactive"
@@ -2853,6 +2899,9 @@ var BUILT_IN_HARNESS_CATALOG = [
2853
2899
  sessionFlag: "resume",
2854
2900
  cwdFlag: "-C"
2855
2901
  },
2902
+ sessionDefaults: {
2903
+ defaultTransport: "codex_app_server"
2904
+ },
2856
2905
  capabilities: ["chat", "invoke", "deliver", "review", "execute"]
2857
2906
  },
2858
2907
  {
@@ -2885,12 +2934,53 @@ var BUILT_IN_HARNESS_CATALOG = [
2885
2934
  loginCommand: "grok login",
2886
2935
  notReadyMessage: "Grok ACP is installed but still needs a cached login or XAI_API_KEY."
2887
2936
  },
2937
+ sessionDefaults: {
2938
+ defaultTransport: "grok_acp"
2939
+ },
2888
2940
  capabilities: ["chat", "invoke", "deliver", "review", "execute"],
2889
2941
  metadata: {
2890
2942
  adapterType: "grok-acp",
2891
2943
  transport: "acp_stdio"
2892
2944
  }
2893
2945
  },
2946
+ {
2947
+ name: "kimi",
2948
+ harness: "kimi",
2949
+ label: "Kimi Code",
2950
+ description: "Kimi Code CLI coding agent over ACP",
2951
+ homepage: "https://www.kimi.com/code/docs/en/",
2952
+ tags: ["coding", "cli", "kimi", "moonshot", "acp"],
2953
+ featured: true,
2954
+ order: 4,
2955
+ support: {
2956
+ ...DEFAULT_SUPPORT,
2957
+ workspace: true,
2958
+ collaboration: true,
2959
+ files: true
2960
+ },
2961
+ install: {
2962
+ binary: "kimi",
2963
+ requires: ["curl"],
2964
+ macos: "curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash",
2965
+ linux: "curl -fsSL https://code.kimi.com/kimi-code/install.sh | bash",
2966
+ windows: "irm https://code.kimi.com/kimi-code/install.ps1 | iex"
2967
+ },
2968
+ readiness: {
2969
+ anyOf: [
2970
+ { kind: "file", path: "~/.kimi-code/credentials", label: "~/.kimi-code/credentials", fileType: "directory" }
2971
+ ],
2972
+ loginCommand: "kimi login",
2973
+ notReadyMessage: "Kimi Code is installed but still needs a cached login from kimi login."
2974
+ },
2975
+ sessionDefaults: {
2976
+ defaultTransport: "kimi_acp"
2977
+ },
2978
+ capabilities: ["chat", "invoke", "deliver", "review", "execute"],
2979
+ metadata: {
2980
+ adapterType: "kimi-acp",
2981
+ transport: "acp_stdio"
2982
+ }
2983
+ },
2894
2984
  {
2895
2985
  name: "cursor",
2896
2986
  harness: "cursor",
@@ -3081,6 +3171,17 @@ function mergeLaunch(base, override) {
3081
3171
  args: override?.args ?? base?.args ?? []
3082
3172
  };
3083
3173
  }
3174
+ function mergeSessionDefaults(base, override) {
3175
+ const defaultTransport = override?.defaultTransport ?? base?.defaultTransport;
3176
+ if (!defaultTransport)
3177
+ return;
3178
+ return {
3179
+ ...base ?? {},
3180
+ ...override ?? {},
3181
+ defaultTransport,
3182
+ fallbackTransports: override?.fallbackTransports ? [...override.fallbackTransports] : base?.fallbackTransports ? [...base.fallbackTransports] : undefined
3183
+ };
3184
+ }
3084
3185
  function formatRequirement(requirement) {
3085
3186
  if (requirement.label?.trim())
3086
3187
  return requirement.label.trim();
@@ -3120,6 +3221,10 @@ function createBuiltInHarnessCatalog() {
3120
3221
  } : undefined,
3121
3222
  launch: entry.launch ? { ...entry.launch, args: [...entry.launch.args] } : undefined,
3122
3223
  resume: entry.resume ? { ...entry.resume } : undefined,
3224
+ sessionDefaults: entry.sessionDefaults ? {
3225
+ ...entry.sessionDefaults,
3226
+ fallbackTransports: entry.sessionDefaults.fallbackTransports ? [...entry.sessionDefaults.fallbackTransports] : undefined
3227
+ } : undefined,
3123
3228
  resolveEnv: entry.resolveEnv ? [...entry.resolveEnv] : undefined,
3124
3229
  capabilities: [...entry.capabilities],
3125
3230
  metadata: entry.metadata ? { ...entry.metadata } : undefined
@@ -3137,6 +3242,7 @@ function mergeHarnessCatalogEntries(baseEntries, overrides = {}) {
3137
3242
  install: mergeInstall(entry.install, override.install),
3138
3243
  readiness: mergeReadiness(entry.readiness, override.readiness),
3139
3244
  launch: mergeLaunch(entry.launch, override.launch),
3245
+ sessionDefaults: mergeSessionDefaults(entry.sessionDefaults, override.sessionDefaults),
3140
3246
  resume: override.resume && entry.resume ? { ...entry.resume, ...override.resume } : entry.resume,
3141
3247
  tags: override.tags ? [...override.tags] : entry.tags,
3142
3248
  capabilities: override.capabilities ? [...override.capabilities] : entry.capabilities,
@@ -3167,6 +3273,7 @@ function mergeHarnessCatalogEntries(baseEntries, overrides = {}) {
3167
3273
  readiness: mergeReadiness(undefined, override.readiness),
3168
3274
  launch: mergeLaunch(undefined, override.launch),
3169
3275
  resume: override.resume?.command && override.resume?.sessionFlag ? { command: override.resume.command, sessionFlag: override.resume.sessionFlag, cwdFlag: override.resume.cwdFlag } : undefined,
3276
+ sessionDefaults: mergeSessionDefaults(undefined, override.sessionDefaults),
3170
3277
  resolveEnv: override.resolveEnv ? [...override.resolveEnv] : undefined,
3171
3278
  capabilities: [...override.capabilities],
3172
3279
  metadata: override.metadata ? { ...override.metadata } : undefined
@@ -5838,6 +5945,7 @@ async function readOpenScoutSettings(options = {}) {
5838
5945
  });
5839
5946
  }
5840
5947
  async function writeOpenScoutSettings(settings, options = {}) {
5948
+ assertTestIsolatedUserData("write OpenScout settings", "OPENSCOUT_SUPPORT_DIRECTORY");
5841
5949
  ensureOpenScoutCleanSlateSync();
5842
5950
  const current = await readOpenScoutSettings(options);
5843
5951
  const merged = {
@@ -7576,7 +7684,9 @@ function formatBrokerStatus(status) {
7576
7684
  `broker socket: ${status.brokerSocketPath}`,
7577
7685
  `loaded: ${status.loaded ? "yes" : "no"}`,
7578
7686
  `reachable: ${status.reachable ? "yes" : "no"}`,
7579
- `health: ${status.health.ok ? "ok" : status.health.error ?? "unreachable"}`
7687
+ `health: ${status.health.ok ? "ok" : status.health.error ?? "unreachable"}`,
7688
+ `runtime freshness: ${status.runtimeFreshness?.state ?? "unavailable"}`,
7689
+ ...status.runtimeFreshness ? [`runtime detail: ${status.runtimeFreshness.detail}`] : []
7580
7690
  ].join(`
7581
7691
  `);
7582
7692
  }
@@ -7589,12 +7699,16 @@ function formatDoctor(report) {
7589
7699
  `Broker service adapter: ${report.broker.serviceAdapter ?? "unknown"}`,
7590
7700
  `Broker URL: ${report.broker.brokerUrl}`,
7591
7701
  `Broker reachable: ${report.broker.reachable ? "yes" : "no"}`,
7702
+ `Runtime freshness: ${report.broker.runtimeFreshness?.state ?? "unavailable"}`,
7592
7703
  `Known runtimes: ${report.catalog.entries.length}`,
7593
7704
  `Onboarding needed: ${report.onboarding.needed ? "yes" : "no"}`
7594
7705
  ];
7595
7706
  if (report.nativeRepairs.requested) {
7596
7707
  lines.push(`Native repairs: ${report.nativeRepairs.detail}`);
7597
7708
  }
7709
+ if (report.broker.runtimeFreshness) {
7710
+ lines.push(`Runtime detail: ${report.broker.runtimeFreshness.detail}`);
7711
+ }
7598
7712
  return lines.join(`
7599
7713
  `);
7600
7714
  }