@openscout/scout 0.2.73 → 0.2.74
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.
- package/bin/scoutd +0 -0
- package/dist/build-manifest.json +9 -0
- package/dist/client/assets/{RepoDiffViewer-D8gg36W3.js → RepoDiffViewer-CTXJvjIL.js} +1 -1
- package/dist/client/assets/{addon-fit-D4KdY-pj.js → addon-fit-3IrvLm2n.js} +1 -1
- package/dist/client/assets/{addon-webgl-Bo_tmKBp.js → addon-webgl-BgxIDUI-.js} +1 -1
- package/dist/client/assets/{arc.es-D0gujIKy.js → arc.es-Bh8P_xre.js} +1 -1
- package/dist/client/assets/c-BIGW1oBm.js +1 -0
- package/dist/client/assets/cpp-DIPi6g--.js +1 -0
- package/dist/client/assets/css-CLj8gQPS.js +1 -0
- package/dist/client/assets/dart-bE4Kk8sk.js +1 -0
- package/dist/client/assets/docker-BcOcwvcX.js +1 -0
- package/dist/client/assets/{embed-entry-CUVNwyB_.js → embed-entry-wAEtYUEM.js} +1 -1
- package/dist/client/assets/go-C27-OAKa.js +1 -0
- package/dist/client/assets/html-pp8916En.js +1 -0
- package/dist/client/assets/index-BK3mRYyN.js +272 -0
- package/dist/client/assets/index-Dm1ZQS9G.css +1 -0
- package/dist/client/assets/java-CylS5w8V.js +1 -0
- package/dist/client/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/client/assets/json-Cp-IABpG.js +1 -0
- package/dist/client/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/client/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/client/assets/make-CHLpvVh8.js +1 -0
- package/dist/client/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/client/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/client/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/client/assets/python-B6aJPvgy.js +1 -0
- package/dist/client/assets/ruby-B13GW9FM.js +1 -0
- package/dist/client/assets/rust-B1yitclQ.js +1 -0
- package/dist/client/assets/scss-D5BDwBP9.js +1 -0
- package/dist/client/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/client/assets/sql-CRqJ_cUM.js +1 -0
- package/dist/client/assets/swift-D82vCrfD.js +1 -0
- package/dist/client/assets/toml-vGWfd6FD.js +1 -0
- package/dist/client/assets/tsx-COt5Ahok.js +1 -0
- package/dist/client/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/client/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/client/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/client/assets/{xterm-RfflDFod.js → xterm-CoGJTxj9.js} +1 -1
- package/dist/client/assets/yaml-Buea-lGh.js +1 -0
- package/dist/client/index.html +2 -2
- package/dist/main.mjs +887 -584
- package/dist/node/main.mjs +115 -1
- package/dist/pairing-runtime-controller.mjs +2525 -895
- package/dist/runtime/base-daemon.mjs +77 -20
- package/dist/runtime/broker-daemon.mjs +1403 -705
- package/dist/runtime/broker-process-manager.mjs +29 -0
- package/dist/runtime/mesh-discover.mjs +29 -0
- package/dist/scout-control-plane-web.mjs +2970 -1116
- package/dist/scout-web-server.mjs +2970 -1116
- package/package.json +1 -1
- package/dist/client/assets/index-CRkjiso5.js +0 -257
- package/dist/client/assets/index-D_RX2cRb.css +0 -1
package/dist/node/main.mjs
CHANGED
|
@@ -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
|
}
|