@pushpalsdev/cli 1.1.3 → 1.1.5
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/dist/pushpals-cli.js +80 -69
- package/monitor-ui/+not-found.html +1 -1
- package/monitor-ui/_expo/static/js/web/{entry-e66b4de45f75e702ac16916082bcc9a5.js → entry-ff425ab85ad13c1920b8ee00abfae7dd.js} +1 -1
- package/monitor-ui/_sitemap.html +1 -1
- package/monitor-ui/index.html +1 -1
- package/monitor-ui/modal.html +1 -1
- package/package.json +1 -1
- package/runtime/prompts/workerpals/miniswe_explicit_targets_block.md +1 -1
- package/runtime/sandbox/.pushpals-remotebuddy-fallback.js +1 -1
- package/runtime/sandbox/apps/workerpals/src/backends/openai_codex/openai_codex_executor.py +96 -16
- package/runtime/sandbox/apps/workerpals/src/backends/openai_codex/test_openai_codex_runtime_config.py +73 -0
- package/runtime/sandbox/apps/workerpals/src/backends/openhands/openhands_executor.py +3 -3
- package/runtime/sandbox/apps/workerpals/src/execute_job.ts +63 -9
- package/runtime/sandbox/prompts/workerpals/miniswe_explicit_targets_block.md +1 -1
package/dist/pushpals-cli.js
CHANGED
|
@@ -1620,6 +1620,8 @@ var DEFAULT_RUNTIME_BOOT_TIMEOUT_MS = 90000;
|
|
|
1620
1620
|
var DEFAULT_RUNTIME_BOOT_POLL_MS = 1000;
|
|
1621
1621
|
var DEFAULT_SERVER_BOOT_TIMEOUT_MS = 20000;
|
|
1622
1622
|
var DEFAULT_SERVICE_STABILITY_GRACE_MS = 4000;
|
|
1623
|
+
var DEFAULT_STARTUP_GIT_PROBE_TIMEOUT_MS = 5000;
|
|
1624
|
+
var DEFAULT_STARTUP_GIT_REMOTE_TIMEOUT_MS = 1e4;
|
|
1623
1625
|
var EMBEDDED_SERVICE_RESTART_MAX_ATTEMPTS = 4;
|
|
1624
1626
|
var WORKERPAL_STARTUP_READINESS_PROBE_MAX_MS = 15000;
|
|
1625
1627
|
var EMBEDDED_RUNTIME_SAFETY_CAP_DISABLE_ENV = "PUSHPALS_DISABLE_EMBEDDED_SAFETY_CAPS";
|
|
@@ -1917,6 +1919,31 @@ function parsePositiveInt(value, fallback) {
|
|
|
1917
1919
|
return fallback;
|
|
1918
1920
|
return parsed;
|
|
1919
1921
|
}
|
|
1922
|
+
function clampPositiveInt(value, min, max) {
|
|
1923
|
+
if (!Number.isFinite(value))
|
|
1924
|
+
return min;
|
|
1925
|
+
return Math.max(min, Math.min(max, Math.trunc(value)));
|
|
1926
|
+
}
|
|
1927
|
+
function resolveStartupGitProbeTimeoutMs(env) {
|
|
1928
|
+
return clampPositiveInt(parsePositiveInt(env.PUSHPALS_STARTUP_GIT_PROBE_TIMEOUT_MS, DEFAULT_STARTUP_GIT_PROBE_TIMEOUT_MS), 1000, 30000);
|
|
1929
|
+
}
|
|
1930
|
+
function resolveStartupGitRemoteTimeoutMs(env) {
|
|
1931
|
+
return clampPositiveInt(parsePositiveInt(env.PUSHPALS_STARTUP_GIT_REMOTE_TIMEOUT_MS, DEFAULT_STARTUP_GIT_REMOTE_TIMEOUT_MS), 1000, 60000);
|
|
1932
|
+
}
|
|
1933
|
+
async function withStartupTimeout(promise, timeoutMs, timeoutValue) {
|
|
1934
|
+
let timer = null;
|
|
1935
|
+
try {
|
|
1936
|
+
return await Promise.race([
|
|
1937
|
+
promise,
|
|
1938
|
+
new Promise((resolveTimeout) => {
|
|
1939
|
+
timer = setTimeout(() => resolveTimeout(timeoutValue()), Math.max(1, timeoutMs));
|
|
1940
|
+
})
|
|
1941
|
+
]);
|
|
1942
|
+
} finally {
|
|
1943
|
+
if (timer)
|
|
1944
|
+
clearTimeout(timer);
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1920
1947
|
function jsonHtmlBootstrap(value) {
|
|
1921
1948
|
return JSON.stringify(value).replace(/</g, "\\u003c");
|
|
1922
1949
|
}
|
|
@@ -2000,15 +2027,15 @@ function withWindowsGitSchannelEnv(env, platform = process.platform) {
|
|
|
2000
2027
|
return env;
|
|
2001
2028
|
return appendGitConfigEnv(env, "http.sslBackend", "schannel");
|
|
2002
2029
|
}
|
|
2003
|
-
async function runGitWithEnv(args, cwd, env) {
|
|
2004
|
-
return await runCommandWithEnv(["git", ...args], cwd, withWindowsGitSchannelEnv(env));
|
|
2030
|
+
async function runGitWithEnv(args, cwd, env, timeoutMs) {
|
|
2031
|
+
return await runCommandWithEnv(["git", ...args], cwd, withWindowsGitSchannelEnv(env), timeoutMs);
|
|
2005
2032
|
}
|
|
2006
|
-
async function runGit(args, cwd) {
|
|
2033
|
+
async function runGit(args, cwd, timeoutMs) {
|
|
2007
2034
|
return await runGitWithEnv(args, cwd, {
|
|
2008
2035
|
...process.env,
|
|
2009
2036
|
GIT_TERMINAL_PROMPT: "0",
|
|
2010
2037
|
GCM_INTERACTIVE: "Never"
|
|
2011
|
-
});
|
|
2038
|
+
}, timeoutMs);
|
|
2012
2039
|
}
|
|
2013
2040
|
async function resolveCurrentGitRepoRoot(cwd) {
|
|
2014
2041
|
const inside = await runGit(["rev-parse", "--is-inside-work-tree"], cwd);
|
|
@@ -2738,20 +2765,14 @@ function normalizeChildProcessEnv(baseEnv, platform = process.platform) {
|
|
|
2738
2765
|
}
|
|
2739
2766
|
return env;
|
|
2740
2767
|
}
|
|
2741
|
-
async function resolveCommandPath(command, cwd, env) {
|
|
2768
|
+
async function resolveCommandPath(command, cwd, env, timeoutMs = resolveStartupGitProbeTimeoutMs(env)) {
|
|
2742
2769
|
const lookupCommands = process.platform === "win32" ? resolveWindowsWhereExecutableCandidatesForEnv(env, process.platform).map((lookup) => [lookup, command]) : [["which", command]];
|
|
2743
2770
|
for (const lookup of lookupCommands) {
|
|
2744
2771
|
try {
|
|
2745
|
-
const
|
|
2746
|
-
|
|
2747
|
-
env,
|
|
2748
|
-
stdout: "pipe",
|
|
2749
|
-
stderr: "ignore"
|
|
2750
|
-
});
|
|
2751
|
-
const [stdout, exitCode] = await Promise.all([new Response(proc.stdout).text(), proc.exited]);
|
|
2752
|
-
if (exitCode !== 0)
|
|
2772
|
+
const result = await runCommandWithEnv(lookup, cwd, env, timeoutMs);
|
|
2773
|
+
if (!result.ok)
|
|
2753
2774
|
continue;
|
|
2754
|
-
const resolved = stdout.split(/\r?\n/).map((line) => line.trim()).find((line) => line.length > 0);
|
|
2775
|
+
const resolved = result.stdout.split(/\r?\n/).map((line) => line.trim()).find((line) => line.length > 0);
|
|
2755
2776
|
if (resolved)
|
|
2756
2777
|
return resolved;
|
|
2757
2778
|
} catch {}
|
|
@@ -3159,50 +3180,31 @@ function computeEmbeddedServiceRestartBackoffMs(attempt) {
|
|
|
3159
3180
|
function shouldRestartEmbeddedService(attempts, maxAttempts = EMBEDDED_SERVICE_RESTART_MAX_ATTEMPTS) {
|
|
3160
3181
|
return shouldRestartService(attempts, maxAttempts);
|
|
3161
3182
|
}
|
|
3162
|
-
async function canSpawnCommand(command, cwd, env) {
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
cwd,
|
|
3166
|
-
env,
|
|
3167
|
-
stdin: "ignore",
|
|
3168
|
-
stdout: "ignore",
|
|
3169
|
-
stderr: "ignore"
|
|
3170
|
-
});
|
|
3171
|
-
const exitCode = await proc.exited;
|
|
3172
|
-
return exitCode === 0;
|
|
3173
|
-
} catch {
|
|
3174
|
-
return false;
|
|
3175
|
-
}
|
|
3183
|
+
async function canSpawnCommand(command, cwd, env, timeoutMs = resolveStartupGitProbeTimeoutMs(env)) {
|
|
3184
|
+
const result = await runCommandWithEnv(command, cwd, env, timeoutMs);
|
|
3185
|
+
return result.ok;
|
|
3176
3186
|
}
|
|
3177
|
-
async function canSpawnGitViaWindowsShell(commandArgs, cwd, env, platform = process.platform) {
|
|
3187
|
+
async function canSpawnGitViaWindowsShell(commandArgs, cwd, env, platform = process.platform, timeoutMs = resolveStartupGitProbeTimeoutMs(env)) {
|
|
3178
3188
|
if (platform !== "win32")
|
|
3179
3189
|
return false;
|
|
3180
3190
|
const commandLine = commandArgs.map((arg) => quoteWindowsCmdArg(arg)).join(" ");
|
|
3181
3191
|
for (const shellExecutable of resolveWindowsShellExecutableCandidatesForEnv(env, platform)) {
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
env,
|
|
3186
|
-
stdin: "ignore",
|
|
3187
|
-
stdout: "ignore",
|
|
3188
|
-
stderr: "ignore"
|
|
3189
|
-
});
|
|
3190
|
-
const exitCode = await proc.exited;
|
|
3191
|
-
return exitCode === 0;
|
|
3192
|
-
} catch {}
|
|
3192
|
+
const result = await runCommandWithEnv([shellExecutable, "/d", "/s", "/c", commandLine], cwd, env, timeoutMs);
|
|
3193
|
+
if (result.ok)
|
|
3194
|
+
return true;
|
|
3193
3195
|
}
|
|
3194
3196
|
return false;
|
|
3195
3197
|
}
|
|
3196
|
-
async function resolveSourceControlManagerGitProbe(cwd, env, platform = process.platform) {
|
|
3198
|
+
async function resolveSourceControlManagerGitProbe(cwd, env, platform = process.platform, timeoutMs = resolveStartupGitProbeTimeoutMs(env)) {
|
|
3197
3199
|
const candidates = resolveRuntimeGitExecutableCandidates(env, platform);
|
|
3198
3200
|
for (const candidate of candidates) {
|
|
3199
|
-
if (await canSpawnCommand([candidate, "--version"], cwd, env)) {
|
|
3201
|
+
if (await canSpawnCommand([candidate, "--version"], cwd, env, timeoutMs)) {
|
|
3200
3202
|
return { ok: true, detail: candidate };
|
|
3201
3203
|
}
|
|
3202
3204
|
}
|
|
3203
3205
|
if (platform === "win32") {
|
|
3204
3206
|
for (const candidate of candidates) {
|
|
3205
|
-
if (await canSpawnGitViaWindowsShell([candidate, "--version"], cwd, env, platform)) {
|
|
3207
|
+
if (await canSpawnGitViaWindowsShell([candidate, "--version"], cwd, env, platform, timeoutMs)) {
|
|
3206
3208
|
return { ok: true, detail: `${candidate} via shell` };
|
|
3207
3209
|
}
|
|
3208
3210
|
}
|
|
@@ -3630,7 +3632,12 @@ async function precheckSourceControlManagerGitAvailability(opts) {
|
|
|
3630
3632
|
if (preconfiguredGitBinary) {
|
|
3631
3633
|
applyResolvedGitBinaryToRuntimeEnv(env, preconfiguredGitBinary, platform);
|
|
3632
3634
|
}
|
|
3633
|
-
const
|
|
3635
|
+
const remoteTimeoutMs = resolveStartupGitRemoteTimeoutMs(env);
|
|
3636
|
+
const remoteStatus = await withStartupTimeout(opts.gitRemoteCheckFn ? opts.gitRemoteCheckFn(opts.repoRoot, opts.remote, env) : opts.repoHasRemoteFn ? opts.repoHasRemoteFn(opts.repoRoot, opts.remote).then((hasRemote) => hasRemote ? { status: "ok", remote: opts.remote } : { status: "missing_remote", remote: opts.remote }) : checkGitRemoteConfigured(opts.repoRoot, opts.remote, env, remoteTimeoutMs), remoteTimeoutMs, () => ({
|
|
3637
|
+
status: "error",
|
|
3638
|
+
remote: opts.remote,
|
|
3639
|
+
detail: `timed out after ${remoteTimeoutMs}ms`
|
|
3640
|
+
}));
|
|
3634
3641
|
if (remoteStatus.status === "missing_remote") {
|
|
3635
3642
|
return {
|
|
3636
3643
|
status: "skipped",
|
|
@@ -3719,7 +3726,7 @@ function resolveWorkerpalStartupReadinessProbeTimeoutMs(config) {
|
|
|
3719
3726
|
function shouldRunEmbeddedRuntimeStartupPrechecks(opts) {
|
|
3720
3727
|
return !opts.serverHealthy && !opts.noAutoStart;
|
|
3721
3728
|
}
|
|
3722
|
-
async function checkGitRemoteConfigured(repoRoot, remote, env) {
|
|
3729
|
+
async function checkGitRemoteConfigured(repoRoot, remote, env, timeoutMs = resolveStartupGitRemoteTimeoutMs(env ?? process.env)) {
|
|
3723
3730
|
const normalizedRemote = String(remote ?? "").trim();
|
|
3724
3731
|
if (!normalizedRemote) {
|
|
3725
3732
|
return { status: "missing_remote", remote: normalizedRemote };
|
|
@@ -3728,7 +3735,7 @@ async function checkGitRemoteConfigured(repoRoot, remote, env) {
|
|
|
3728
3735
|
...process.env,
|
|
3729
3736
|
GIT_TERMINAL_PROMPT: "0",
|
|
3730
3737
|
GCM_INTERACTIVE: "Never"
|
|
3731
|
-
});
|
|
3738
|
+
}, timeoutMs);
|
|
3732
3739
|
if (result.ok && result.stdout) {
|
|
3733
3740
|
return { status: "ok", remote: normalizedRemote };
|
|
3734
3741
|
}
|
|
@@ -3757,7 +3764,7 @@ async function checkPushpalsBranchOnRemote(repoRoot, remote, branch) {
|
|
|
3757
3764
|
};
|
|
3758
3765
|
}
|
|
3759
3766
|
const ref = `refs/heads/${normalizedBranch}`;
|
|
3760
|
-
const result = await runGit(["ls-remote", "--heads", normalizedRemote, ref], repoRoot);
|
|
3767
|
+
const result = await runGit(["ls-remote", "--heads", normalizedRemote, ref], repoRoot, resolveStartupGitRemoteTimeoutMs(process.env));
|
|
3761
3768
|
if (!result.ok) {
|
|
3762
3769
|
const detail = result.stderr || result.stdout || `exit ${result.exitCode}`;
|
|
3763
3770
|
return {
|
|
@@ -3789,8 +3796,9 @@ async function enforcePushpalsRemoteBranchPrecheck(repoRoot, remote, branch) {
|
|
|
3789
3796
|
console.error("[pushpals] Precheck failed: create/push that branch first or set source_control_manager.pushpals_branch to an existing remote branch.");
|
|
3790
3797
|
return false;
|
|
3791
3798
|
}
|
|
3792
|
-
console.
|
|
3793
|
-
|
|
3799
|
+
console.warn(`[pushpals] Precheck warning: could not verify remote branch "${result.remote}/${result.branch}": ${result.detail}`);
|
|
3800
|
+
console.warn("[pushpals] Precheck warning: continuing startup without SourceControlManager branch verification because the remote check was inconclusive.");
|
|
3801
|
+
return true;
|
|
3794
3802
|
}
|
|
3795
3803
|
function isPathEqualOrWithin(parentPath, childPath) {
|
|
3796
3804
|
const parent = normalizeRepoPathForComparison(parentPath);
|
|
@@ -4459,31 +4467,35 @@ ${tail}` : ""}`);
|
|
|
4459
4467
|
recordStartupPhase("workerpal", Date.now(), "disabled");
|
|
4460
4468
|
}
|
|
4461
4469
|
const scmHealthy = await probeSourceControlManager(opts.sourceControlManagerPort);
|
|
4462
|
-
const scmGitProbe = await resolveSourceControlManagerGitProbe(opts.repoRoot, runtimeEnv, process.platform);
|
|
4463
|
-
const scmRemoteStatus = await checkGitRemoteConfigured(opts.repoRoot, opts.sourceControlManagerRemote, runtimeEnv);
|
|
4464
4470
|
if (!scmHealthy) {
|
|
4465
4471
|
const scmPhaseStartedAt = Date.now();
|
|
4472
|
+
console.log("[pushpals] Checking embedded SourceControlManager git/remote preflight...");
|
|
4473
|
+
appendRuntimeServicesLogLine(runtimeServicesLogPath, "[pushpals] checking embedded source_control_manager git/remote preflight.");
|
|
4474
|
+
const scmGitProbe = await resolveSourceControlManagerGitProbe(opts.repoRoot, runtimeEnv, process.platform);
|
|
4466
4475
|
if (!scmGitProbe.ok) {
|
|
4467
4476
|
console.warn("[pushpals] Git is not available to embedded SourceControlManager; skipping SCM startup.");
|
|
4468
4477
|
appendRuntimeServicesLogLine(runtimeServicesLogPath, `[pushpals] source_control_manager skipped: git is unavailable in embedded runtime env (${scmGitProbe.detail}).`);
|
|
4469
4478
|
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "skipped_no_git");
|
|
4470
|
-
} else if (scmRemoteStatus.status === "error") {
|
|
4471
|
-
console.warn(`[pushpals] Could not inspect SourceControlManager git remote "${opts.sourceControlManagerRemote}"; skipping SCM startup.`);
|
|
4472
|
-
appendRuntimeServicesLogLine(runtimeServicesLogPath, `[pushpals] source_control_manager skipped: remote "${opts.sourceControlManagerRemote}" could not be inspected (${scmRemoteStatus.detail}).`);
|
|
4473
|
-
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "skipped_remote_error");
|
|
4474
|
-
} else if (scmRemoteStatus.status === "ok") {
|
|
4475
|
-
console.log(`[pushpals] Embedded SourceControlManager git=${scmGitProbe.detail}`);
|
|
4476
|
-
console.log("[pushpals] Starting embedded SourceControlManager...");
|
|
4477
|
-
const sourceControlManagerService = launchService("source_control_manager", [
|
|
4478
|
-
runtimeBinaries.sourceControlManager,
|
|
4479
|
-
"--skip-clean-check"
|
|
4480
|
-
]);
|
|
4481
|
-
console.log(`[pushpals] source_control_manager log: ${sourceControlManagerService.logPath ?? serviceLogPaths.source_control_manager}`);
|
|
4482
|
-
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "started");
|
|
4483
4479
|
} else {
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4480
|
+
const scmRemoteStatus = await checkGitRemoteConfigured(opts.repoRoot, opts.sourceControlManagerRemote, runtimeEnv);
|
|
4481
|
+
if (scmRemoteStatus.status === "error") {
|
|
4482
|
+
console.warn(`[pushpals] Could not inspect SourceControlManager git remote "${opts.sourceControlManagerRemote}"; skipping SCM startup.`);
|
|
4483
|
+
appendRuntimeServicesLogLine(runtimeServicesLogPath, `[pushpals] source_control_manager skipped: remote "${opts.sourceControlManagerRemote}" could not be inspected (${scmRemoteStatus.detail}).`);
|
|
4484
|
+
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "skipped_remote_error");
|
|
4485
|
+
} else if (scmRemoteStatus.status === "ok") {
|
|
4486
|
+
console.log(`[pushpals] Embedded SourceControlManager git=${scmGitProbe.detail}`);
|
|
4487
|
+
console.log("[pushpals] Starting embedded SourceControlManager...");
|
|
4488
|
+
const sourceControlManagerService = launchService("source_control_manager", [
|
|
4489
|
+
runtimeBinaries.sourceControlManager,
|
|
4490
|
+
"--skip-clean-check"
|
|
4491
|
+
]);
|
|
4492
|
+
console.log(`[pushpals] source_control_manager log: ${sourceControlManagerService.logPath ?? serviceLogPaths.source_control_manager}`);
|
|
4493
|
+
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "started");
|
|
4494
|
+
} else {
|
|
4495
|
+
console.log(`[pushpals] Repo has no git remote "${opts.sourceControlManagerRemote}"; skipping embedded SourceControlManager.`);
|
|
4496
|
+
appendRuntimeServicesLogLine(runtimeServicesLogPath, `[pushpals] source_control_manager skipped: repo has no remote "${opts.sourceControlManagerRemote}".`);
|
|
4497
|
+
recordStartupPhase("source_control_manager", scmPhaseStartedAt, "skipped_no_remote");
|
|
4498
|
+
}
|
|
4487
4499
|
}
|
|
4488
4500
|
} else {
|
|
4489
4501
|
recordStartupPhase("source_control_manager", Date.now(), "reused");
|
|
@@ -5249,8 +5261,7 @@ async function main() {
|
|
|
5249
5261
|
sessionId
|
|
5250
5262
|
});
|
|
5251
5263
|
if (scmGitPrecheck.status === "failed") {
|
|
5252
|
-
console.
|
|
5253
|
-
process.exit(1);
|
|
5264
|
+
console.warn(`[pushpals] Embedded SourceControlManager precheck failed (${scmGitPrecheck.detail}); continuing startup without blocking on SCM.`);
|
|
5254
5265
|
}
|
|
5255
5266
|
workerpalDockerPrecheck = await precheckWorkerpalDockerAvailability({
|
|
5256
5267
|
repoRoot,
|
|
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
|
|
|
435
435
|
@keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
|
|
436
436
|
@keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
|
|
437
437
|
@keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
|
|
438
|
-
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-
|
|
438
|
+
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-ff425ab85ad13c1920b8ee00abfae7dd.js" defer></script>
|
|
439
439
|
</body></html>
|
|
@@ -1027,7 +1027,7 @@ __d(function(g,r,i,a,m,_e,d){"use strict";function t(t){return t&&t.__esModule?t
|
|
|
1027
1027
|
__d(function(g,r,i,_a,m,e,d){"use strict";function t(t){if(!t)return null;try{const n=JSON.parse(t);if(n&&"object"==typeof n&&!Array.isArray(n))return n}catch{return null}return null}function n(n){const o=t(n.params),s=o?.requestId;return"string"==typeof s&&s.trim()?s:null}Object.defineProperty(e,'__esModule',{value:!0}),e.deriveCoordinationRows=function(t,o,s){const a=new Map;for(const t of o){const o=n(t);if(!o)continue;const s=a.get(o)??[];s.push(t),a.set(o,s)}const u=new Map;for(const t of s){const n=u.get(t.jobId)??[];n.push(t),u.set(t.jobId,n)}return t.map(t=>{const n=[...a.get(t.id)??[]].sort((t,n)=>n.updatedAt.localeCompare(t.updatedAt)),o=n.flatMap(t=>u.get(t.id)??[]),s="failed"===t.status||n.some(t=>"failed"===t.status)||o.some(t=>"failed"===t.status),c=o.find(t=>"processed"===t.status),l=n.some(t=>"claimed"===t.status),f=n.length>0||"claimed"===t.status||"completed"===t.status;let p="awaiting_remote",h="This request has not been delegated to execution yet.";if(s)p="failed",h="A planning/execution/finalization step failed and needs intervention.";else if(c){p="ready_for_review",h=`Ready to review on ${c.branch??"integration branch"} (${c.commitSha?.slice(0,8)??"new commit"}).`}else l||"claimed"===t.status?(p="executing",h="WorkerPal execution is active or waiting on downstream completion."):f&&(p="planning",h="RemoteBuddy has routed work and prepared execution artifacts.");return{request:t,jobs:n,completions:o,stage:p,stageDetail:h}})}},1016,[]);
|
|
1028
1028
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.FlowRibbon=function(e){const o=(0,t.c)(14),{theme:p,steps:b}=e;let h,x,y,w;o[0]!==p.border||o[1]!==p.panelAlt?(h=[f.wrap,{backgroundColor:p.panelAlt,borderColor:p.border}],o[0]=p.border,o[1]=p.panelAlt,o[2]=h):h=o[2];if(o[3]!==b||o[4]!==p){let e;o[6]!==b.length||o[7]!==p?(e=(e,t)=>{const n=u(p,e.tone),o=t<b.length-1;return(0,c.jsxs)(s.default,{style:f.stepOuter,children:[(0,c.jsxs)(s.default,{style:[f.step,{borderColor:`${n}66`,backgroundColor:`${n}16`}],children:[(0,c.jsx)(l.default,{style:[f.label,{color:n,fontFamily:p.fontSans}],numberOfLines:1,children:e.label}),(0,c.jsx)(l.default,{style:[f.detail,{color:p.textMuted,fontFamily:p.fontSans}],numberOfLines:2,children:e.detail})]}),o?(0,c.jsx)(s.default,{style:[f.connector,{backgroundColor:`${p.border}CC`}]}):null]},e.key)},o[6]=b.length,o[7]=p,o[8]=e):e=o[8],x=b.map(e),o[3]=b,o[4]=p,o[5]=x}else x=o[5];o[9]!==x?(y=(0,c.jsx)(n.default,{horizontal:!0,showsHorizontalScrollIndicator:!1,children:x}),o[9]=x,o[10]=y):y=o[10];o[11]!==h||o[12]!==y?(w=(0,c.jsx)(s.default,{style:h,children:y}),o[11]=h,o[12]=y,o[13]=w):w=o[13];return w};var t=r(d[0]);r(d[1]);var n=e(r(d[2])),o=e(r(d[3])),l=e(r(d[4])),s=e(r(d[5])),c=r(d[6]);function u(e,t){return"positive"===t?e.positive:"warning"===t?e.warning:"danger"===t?e.danger:e.accent}const f=o.default.create({wrap:{marginHorizontal:20,marginBottom:10,borderWidth:1,borderRadius:14,paddingHorizontal:10,paddingVertical:10},stepOuter:{flexDirection:"row",alignItems:"center"},step:{width:172,borderWidth:1,borderRadius:12,paddingHorizontal:10,paddingVertical:9},label:{fontSize:11,fontWeight:"700",textTransform:"uppercase",letterSpacing:.3},detail:{marginTop:4,fontSize:12,lineHeight:16},connector:{width:18,height:1,marginHorizontal:8}})},1017,[1135,21,317,136,123,310,2]);
|
|
1029
1029
|
__d(function(g,r,i,a,m,_e,d){"use strict";function t(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.JobsPane=function(t){const l=(0,e.c)(108),{theme:x,isWide:A,jobs:F,jobCounts:k,pendingSnapshot:B,completions:w,completionCounts:z,sessionState:C,requestFilterId:L,jobFilterId:q,onClearFilter:W}=t;let I;t:{if(q){let t;if(l[0]!==q||l[1]!==F){let e;l[3]!==q?(e=t=>t.id===q,l[3]=q,l[4]=e):e=l[4],t=F.filter(e),l[0]=q,l[1]=F,l[2]=t}else t=l[2];I=t;break t}if(L){let t;if(l[5]!==F||l[6]!==L){let e;l[8]!==L?(e=t=>h(t.params)===L,l[8]=L,l[9]=e):e=l[9],t=F.filter(e),l[5]=F,l[6]=L,l[7]=t}else t=l[7];I=t;break t}I=F}const R=I;let D;l[10]!==R?(D=R.slice(0,40),l[10]=R,l[11]=D):D=l[11];const $=D;let _;l[12]!==R?(_=new Set(R.map(M)),l[12]=R,l[13]=_):_=l[13];const P=_;let v;t:{if(0===P.size&&(L||q)){let t;l[14]===Symbol.for("react.memo_cache_sentinel")?(t=[],l[14]=t):t=l[14],v=t;break t}if(!L&&!q){v=w;break t}let t;if(l[15]!==w||l[16]!==P){let e;l[18]!==P?(e=t=>P.has(t.jobId),l[18]=P,l[19]=e):e=l[19],t=w.filter(e),l[15]=w,l[16]=P,l[17]=t}else t=l[17];v=t}const H=v;let V;l[20]!==B?(V=new Map(B.map(S)),l[20]=B,l[21]=V):V=l[21];const J=V,N=Boolean(L||q),E=q??R[0]?.id??null;let K;l[22]!==k?(K=(0,f.queueValue)(k,"pending"),l[22]=k,l[23]=K):K=l[23];const O=String(K);let Q,G;l[24]!==O||l[25]!==x?(Q=(0,p.jsx)(b.MetricTile,{title:"Queued Jobs",value:O,tone:"warning",theme:x}),l[24]=O,l[25]=x,l[26]=Q):Q=l[26];l[27]!==k?(G=(0,f.queueValue)(k,"claimed"),l[27]=k,l[28]=G):G=l[28];const U=String(G);let X,Y;l[29]!==U||l[30]!==x?(X=(0,p.jsx)(b.MetricTile,{title:"Running Jobs",value:U,tone:"accent",theme:x}),l[29]=U,l[30]=x,l[31]=X):X=l[31];l[32]!==z?(Y=(0,f.queueValue)(z,"processed"),l[32]=z,l[33]=Y):Y=l[33];const Z=String(Y);let tt;l[34]!==Z||l[35]!==x?(tt=(0,p.jsx)(b.MetricTile,{title:"Completions",value:Z,tone:"positive",theme:x}),l[34]=Z,l[35]=x,l[36]=tt):tt=l[36];const et=String((0,f.queueValue)(k,"failed")+(0,f.queueValue)(k,"abandoned")+(0,f.queueValue)(k,"publish_blocked"));let ot,nt;l[37]!==et||l[38]!==x?(ot=(0,p.jsx)(b.MetricTile,{title:"Failed / Abandoned / Blocked",value:et,tone:"danger",theme:x}),l[37]=et,l[38]=x,l[39]=ot):ot=l[39];l[40]!==X||l[41]!==tt||l[42]!==ot||l[43]!==Q?(nt=(0,p.jsxs)(u.default,{style:T.metricRow,children:[Q,X,tt,ot]}),l[40]=X,l[41]=tt,l[42]=ot,l[43]=Q,l[44]=nt):nt=l[44];const lt=A&&T.jobsLayoutWide;let it,at,rt,st,dt,ut,ct,ft,mt,bt,pt,ht,xt,yt,jt,gt;l[45]!==lt?(it=[T.jobsLayout,lt],l[45]=lt,l[46]=it):it=l[46];l[47]!==x.border||l[48]!==x.panel?(at=[T.jobsListPane,{borderColor:x.border,backgroundColor:x.panel}],l[47]=x.border,l[48]=x.panel,l[49]=at):at=l[49];l[50]!==x.fontSans||l[51]!==x.text?(rt=(0,p.jsx)(s.default,{style:[T.sectionTitle,{color:x.text,fontFamily:x.fontSans}],children:"Queue Activity"}),l[50]=x.fontSans,l[51]=x.text,l[52]=rt):rt=l[52];l[53]!==N||l[54]!==W||l[55]!==x.accent||l[56]!==x.border||l[57]!==x.fontSans||l[58]!==x.panelAlt?(st=N&&W?(0,p.jsx)(n.default,{style:[T.clearFilterButton,{borderColor:x.border,backgroundColor:x.panelAlt}],onPress:W,children:(0,p.jsx)(s.default,{style:[T.clearFilterLabel,{color:x.accent,fontFamily:x.fontSans}],children:"Clear Filter"})}):null,l[53]=N,l[54]=W,l[55]=x.accent,l[56]=x.border,l[57]=x.fontSans,l[58]=x.panelAlt,l[59]=st):st=l[59];l[60]!==rt||l[61]!==st?(dt=(0,p.jsxs)(u.default,{style:T.sectionHeader,children:[rt,st]}),l[60]=rt,l[61]=st,l[62]=dt):dt=l[62];l[63]!==N||l[64]!==q||l[65]!==L||l[66]!==x.fontMono||l[67]!==x.textMuted?(ut=N?(0,p.jsxs)(s.default,{style:[T.filterMeta,{color:x.textMuted,fontFamily:x.fontMono}],children:["request ",L?.slice(0,8)??"--"," | job"," ",q?.slice(0,8)??"--"]}):null,l[63]=N,l[64]=q,l[65]=L,l[66]=x.fontMono,l[67]=x.textMuted,l[68]=ut):ut=l[68];l[69]!==N||l[70]!==J||l[71]!==$||l[72]!==x?(ct=0===$.length?(0,p.jsx)(s.default,{style:[T.emptySubtitle,{color:x.textMuted,fontFamily:x.fontSans}],children:N?"No jobs matched the selected request/job.":"No job rows yet."}):(0,p.jsx)(o.default,{data:$,keyExtractor:j,renderItem:t=>{const{item:e}=t,o=(0,f.statusColor)(x,e.status),n=J.get(e.id),l=e.priority??"normal",c=y(e),b=[e.enqueuedAt?`enq ${(0,f.prettyTs)(e.enqueuedAt)}`:null,e.claimedAt?`claim ${(0,f.prettyTs)(e.claimedAt)}`:null,e.startedAt?`start ${(0,f.prettyTs)(e.startedAt)}`:null,e.firstLogAt?`first-log ${(0,f.prettyTs)(e.firstLogAt)}`:null,e.completedAt?`done ${(0,f.prettyTs)(e.completedAt)}`:null,e.abandonedAt?`abandon ${(0,f.prettyTs)(e.abandonedAt)}`:null,e.publishBlockedAt?`blocked ${(0,f.prettyTs)(e.publishBlockedAt)}`:null,e.failedAt?`fail ${(0,f.prettyTs)(e.failedAt)}`:null].filter(Boolean);("completed"===e.status||"failed"===e.status||"abandoned"===e.status||"publish_blocked"===e.status)&&null!=c&&b.push(`elapsed ${(0,f.formatDuration)(c)}`);const h="pending"===e.status&&n?`queue #${n.position} (eta ${(0,f.formatEtaMs)(n.etaMs)})`:"claimed"===e.status?"running":"abandoned"===e.status?"abandoned":"publish_blocked"===e.status?"publish blocked":null!=c?`elapsed ${(0,f.formatDuration)(c)}`:"terminal";return(0,p.jsxs)(u.default,{style:[T.jobRow,{borderColor:x.border}],children:[(0,p.jsx)(u.default,{style:[T.jobDot,{backgroundColor:o}]}),(0,p.jsxs)(u.default,{style:T.jobTextCol,children:[(0,p.jsx)(s.default,{style:[T.jobKind,{color:x.text,fontFamily:x.fontSans}],children:e.kind}),(0,p.jsxs)(s.default,{style:[T.jobMeta,{color:x.textMuted,fontFamily:x.fontSans}],children:[e.id.slice(0,8)," | worker ",e.workerId??"--"," |"," ",(0,f.relativeMs)(e.updatedAt)]}),(0,p.jsxs)(s.default,{selectable:!0,style:[T.jobIdentifierLine,{color:x.textMuted,fontFamily:x.fontMono}],children:["jobId=",e.id," | workerId=",e.workerId??"--"]}),(0,p.jsxs)(s.default,{style:[T.jobMeta,{color:x.textMuted,fontFamily:x.fontSans}],children:["priority ",l," | ",h]}),b.length>0?(0,p.jsx)(s.default,{style:[T.jobPhaseLine,{color:x.textMuted,fontFamily:x.fontMono}],children:b.join(" | ")}):null,null!=e.executionBudgetMs||null!=e.finalizationBudgetMs?(0,p.jsxs)(s.default,{style:[T.jobMeta,{color:x.textMuted,fontFamily:x.fontSans}],children:["budget exec ",(0,f.formatDuration)(e.executionBudgetMs)," | finalize"," ",(0,f.formatDuration)(e.finalizationBudgetMs)]}):null]}),(0,p.jsx)(s.default,{style:[T.jobStatus,{color:o,fontFamily:x.fontSans}],children:e.status})]})}}),l[69]=N,l[70]=J,l[71]=$,l[72]=x,l[73]=ct):ct=l[73];l[74]!==x||l[75]!==H?(ft=H.length>0?(0,p.jsxs)(u.default,{style:T.completionStrip,children:[(0,p.jsx)(s.default,{style:[T.subSectionTitle,{color:x.text,fontFamily:x.fontSans}],children:"Recent Completions"}),H.slice(0,16).map(t=>{const e=(0,f.statusColor)(x,t.status);return(0,p.jsxs)(u.default,{style:[T.completionRow,{borderColor:x.border}],children:[(0,p.jsx)(s.default,{style:[T.completionMeta,{color:x.text,fontFamily:x.fontMono}],children:t.id.slice(0,8)}),(0,p.jsx)(s.default,{style:[T.completionLine,{color:x.textMuted,fontFamily:x.fontSans}],children:(0,f.clip)(t.message,110)}),(0,p.jsxs)(s.default,{style:[T.completionMeta,{color:x.textMuted,fontFamily:x.fontSans}],children:[t.branch??"--"," | ",t.commitSha?.slice(0,8)??"--"]}),(0,p.jsx)(s.default,{style:[T.completionStatus,{color:e,fontFamily:x.fontSans}],children:t.status})]},t.id)})]}):null,l[74]=x,l[75]=H,l[76]=ft):ft=l[76];l[77]!==at||l[78]!==dt||l[79]!==ut||l[80]!==ct||l[81]!==ft?(mt=(0,p.jsxs)(u.default,{style:at,children:[dt,ut,ct,ft]}),l[77]=at,l[78]=dt,l[79]=ut,l[80]=ct,l[81]=ft,l[82]=mt):mt=l[82];l[83]!==x.border||l[84]!==x.panel?(bt=[T.jobsTracePane,{borderColor:x.border,backgroundColor:x.panel}],l[83]=x.border,l[84]=x.panel,l[85]=bt):bt=l[85];l[86]!==x.fontSans||l[87]!==x.text?(pt=(0,p.jsx)(s.default,{style:[T.sectionTitle,{color:x.text,fontFamily:x.fontSans}],children:"Tasks and Traces"}),l[86]=x.fontSans,l[87]=x.text,l[88]=pt):pt=l[88];l[89]!==x.fontMono||l[90]!==x.fontSans||l[91]!==x.mode?(ht={mode:x.mode,fontSans:x.fontSans,fontMono:x.fontMono},l[89]=x.fontMono,l[90]=x.fontSans,l[91]=x.mode,l[92]=ht):ht=l[92];l[93]!==E||l[94]!==C||l[95]!==ht?(xt=(0,p.jsx)(u.default,{style:T.tracePanelBody,children:(0,p.jsx)(c.TasksJobsLogs,{state:C,theme:ht,focusJobId:E})}),l[93]=E,l[94]=C,l[95]=ht,l[96]=xt):xt=l[96];l[97]!==bt||l[98]!==pt||l[99]!==xt?(yt=(0,p.jsxs)(u.default,{style:bt,children:[pt,xt]}),l[97]=bt,l[98]=pt,l[99]=xt,l[100]=yt):yt=l[100];l[101]!==it||l[102]!==mt||l[103]!==yt?(jt=(0,p.jsxs)(u.default,{style:it,children:[mt,yt]}),l[101]=it,l[102]=mt,l[103]=yt,l[104]=jt):jt=l[104];l[105]!==nt||l[106]!==jt?(gt=(0,p.jsxs)(u.default,{style:T.fill,children:[nt,jt]}),l[105]=nt,l[106]=jt,l[107]=gt):gt=l[107];return gt};var e=r(d[0]);r(d[1]);var o=t(r(d[2])),n=t(r(d[3])),l=t(r(d[4])),s=t(r(d[5])),u=t(r(d[6])),c=r(d[7]),f=r(d[8]),b=r(d[9]),p=r(d[10]);function h(t){if(!t)return null;try{const e=JSON.parse(t);if(!e||"object"!=typeof e||Array.isArray(e))return null;const o=e.requestId;return"string"==typeof o&&o.trim()?o.trim():null}catch{return null}}function x(t){if(!t)return null;const e=Date.parse(t);return Number.isFinite(e)?e:null}function y(t){if("number"==typeof t.durationMs&&Number.isFinite(t.durationMs)&&t.durationMs>=0)return Math.floor(t.durationMs);const e=x(t.completedAt)??x(t.abandonedAt)??x(t.publishBlockedAt)??x(t.failedAt)??("completed"===t.status||"failed"===t.status||"abandoned"===t.status||"publish_blocked"===t.status?x(t.updatedAt):null),o=x(t.startedAt)??x(t.claimedAt)??x(t.enqueuedAt);return null==o||null==e||e<o?null:e-o}function j(t){return t.id}function S(t){return[t.id,t]}function M(t){return t.id}const T=l.default.create({fill:{flex:1},metricRow:{flexDirection:"row",flexWrap:"wrap",paddingHorizontal:20,paddingBottom:10},emptySubtitle:{fontSize:13,lineHeight:19},jobsLayout:{flex:1,flexDirection:"column",paddingHorizontal:20,paddingBottom:14},jobsLayoutWide:{flexDirection:"row"},jobsListPane:{flex:1,borderWidth:1,borderRadius:16,padding:12,marginBottom:10,minHeight:220},jobsTracePane:{flex:1.25,borderWidth:1,borderRadius:16,padding:12,minHeight:260},tracePanelBody:{flex:1,minHeight:260},sectionHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},sectionTitle:{fontSize:16,fontWeight:"700",marginBottom:8},filterMeta:{fontSize:11,marginBottom:8},clearFilterButton:{borderWidth:1,borderRadius:8,paddingHorizontal:9,paddingVertical:4,marginBottom:8,marginLeft:8},clearFilterLabel:{fontSize:10,fontWeight:"700",textTransform:"uppercase",letterSpacing:.2},subSectionTitle:{fontSize:13,fontWeight:"700",marginBottom:5},jobRow:{flexDirection:"row",alignItems:"center",borderBottomWidth:1,paddingVertical:8},jobDot:{width:8,height:8,borderRadius:4,marginRight:10},jobTextCol:{flex:1},jobKind:{fontSize:13,fontWeight:"700"},jobMeta:{fontSize:12,marginTop:2},jobIdentifierLine:{fontSize:11,marginTop:3},jobPhaseLine:{fontSize:11,marginTop:4},jobStatus:{fontSize:11,fontWeight:"700",textTransform:"uppercase"},completionStrip:{marginTop:8},completionRow:{borderTopWidth:1,paddingTop:8,marginTop:7},completionLine:{fontSize:12,marginBottom:3},completionMeta:{fontSize:11,marginBottom:2},completionStatus:{fontSize:11,fontWeight:"700",textTransform:"uppercase"}})},1018,[1135,21,308,417,136,123,310,1019,1014,1015,2]);
|
|
1030
|
-
__d(function(g,r,i,_a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.TasksJobsLogs=function(e){const a=(0,t.c)(37),{state:c,theme:f,focusJobId:b}=e,[p,y]=(0,o.useState)(null),h=f?.mode??"light";let x;a[0]!==h?(x=S(h),a[0]=h,a[1]=x):x=a[1];const j=x;let k;a[2]!==j||a[3]!==f?(k=H(j,f),a[2]=j,a[3]=f,a[4]=k):k=a[4];const I=k;let T,F,B,C,w,E,z;if(a[5]!==c.tasks){F=Array.from(c.tasks.values()).sort(J),T=new Set;for(const e of F)for(const t of e.jobIds)T.add(t);a[5]=c.tasks,a[6]=T,a[7]=F}else T=a[6],F=a[7];a[8]!==b||a[9]!==F?(B=()=>{if(!b)return;const e=F.find(e=>e.jobIds.includes(b));e&&y(e.taskId)},C=[b,F],a[8]=b,a[9]=F,a[10]=B,a[11]=C):(B=a[10],C=a[11]);if((0,o.useEffect)(B,C),0===F.length&&0===c.jobs.size){let e,t;return a[12]!==I.muted?(e=(0,u.jsx)(s.default,{style:I.muted,children:"No tasks or jobs yet"}),a[12]=I.muted,a[13]=e):e=a[13],a[14]!==I.emptyContainer||a[15]!==e?(t=(0,u.jsx)(n.default,{style:I.emptyContainer,children:e}),a[14]=I.emptyContainer,a[15]=e,a[16]=t):t=a[16],t}a[17]!==p||a[18]!==b||a[19]!==j||a[20]!==c.jobs||a[21]!==c.logs||a[22]!==I||a[23]!==F?(w=F.length>0?(0,u.jsxs)(n.default,{style:I.section,children:[(0,u.jsx)(s.default,{style:I.sectionTitle,children:"Tasks"}),F.map(e=>{const t=e.jobIds.map(e=>c.jobs.get(e)).filter(Boolean),o={claimed:0,pending:1,enqueued:2,completed:3,publish_blocked:4,abandoned:5,failed:6};return t.sort((e,t)=>{const n=o[e.status]??9,s=o[t.status]??9;return n!==s?n-s:e.ts.localeCompare(t.ts)}),(0,u.jsx)(D,{task:e,jobs:t,logs:c.logs,expanded:p===e.taskId,onToggle:()=>y(p===e.taskId?null:e.taskId),focusJobId:b,styles:I,palette:j},e.taskId)})]}):null,a[17]=p,a[18]=b,a[19]=j,a[20]=c.jobs,a[21]=c.logs,a[22]=I,a[23]=F,a[24]=w):w=a[24];a[25]!==b||a[26]!==j||a[27]!==c.jobs||a[28]!==c.logs||a[29]!==I||a[30]!==T?(E=(0,u.jsx)(R,{jobs:c.jobs,logs:c.logs,taskJobIds:T,focusJobId:b,styles:I,palette:j}),a[25]=b,a[26]=j,a[27]=c.jobs,a[28]=c.logs,a[29]=I,a[30]=T,a[31]=E):E=a[31];a[32]!==I.container||a[33]!==I.content||a[34]!==w||a[35]!==E?(z=(0,u.jsxs)(l.default,{style:I.container,contentContainerStyle:I.content,children:[w,E]}),a[32]=I.container,a[33]=I.content,a[34]=w,a[35]=E,a[36]=z):z=a[36];return z};var t=r(d[0]),o=r(d[1]),n=e(r(d[2])),s=e(r(d[3])),a=e(r(d[4])),l=e(r(d[5])),c=e(r(d[6]));r(d[7]);var u=r(d[8]);const f="__PUSHPALS_OH_RESULT__ ",b="___RESULT___ ",p=500,y=/\x1b\[[0-9;]*m/g;const h=(function(e){const t=Number.parseInt(String(e??"").trim(),10);return Number.isFinite(t)?Math.max(20,Math.min(500,t)):100})(void 0);async function x(e){const t=String(e??"").trim();if(!t)return!1;try{const e=globalThis.navigator,o=e?.clipboard?.writeText;return"function"==typeof o&&(await o(t),!0)}catch{return!1}}const j={bg:"#F4F8FB",panel:"#FFFFFF",panelAlt:"#EEF4F8",border:"#D2E0E8",text:"#112230",textMuted:"#547086",accent:"#007E77",success:"#169A58",warning:"#C7851E",danger:"#D64553",reasoningText:"#1D4E89",reasoningBg:"#EAF4FF",actionText:"#0F6C48",actionBg:"#E9FBF5",infoText:"#334155",infoBg:"#F4F8FB",errorText:"#A22A35",errorBg:"#FEECEF"},k={bg:"#14212A",panel:"#16222B",panelAlt:"#1B2A35",border:"#284050",text:"#EAF3F6",textMuted:"#97B3C2",accent:"#2FD6C8",success:"#5DDD8B",warning:"#FFB95A",danger:"#FF6B72",reasoningText:"#9BC6FF",reasoningBg:"#1D2A40",actionText:"#8EF5BD",actionBg:"#163628",infoText:"#D2E3ED",infoBg:"#1A2934",errorText:"#FFACB5",errorBg:"#3A1B22"};function S(e){return"dark"===e?k:j}function I(e,t){switch(e){case"completed":return t.success;case"failed":case"abandoned":case"publish_blocked":return t.danger;case"claimed":case"started":case"in_progress":return t.warning;default:return t.accent}}function T(e){return e.replace(y,"").replace(/\s+/g," ").trim()}function F(e){return e.length<=p?e:`${e.slice(0,497)}...`}function B(e){if(!e)return"";const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString():""}function C(e,t){const o=e.toLowerCase();return"stderr"===t||o.includes("error")||o.includes("failed")||o.includes("traceback")||o.includes("exception")?"error":/\b(think|reason|analysis|plan|decide|why|because|approach|strategy)\b/i.test(o)?"reasoning":/\b(run|running|execute|executing|write|patch|edit|search|read|fetch|merge|commit|push|claim)\b/i.test(o)?"action":"info"}function w(e,t,o,n,s,a){const l=n.trim();if(!l)return;const c=`${o}|${l}`;t.has(c)||(t.add(c),e.push({key:`${o}:${e.length}`,source:o,line:l,tone:s,ts:a}))}function E(e,t,o,n,s){for(const a of n.split(/\r?\n/).map(e=>F(T(e))).filter(Boolean))w(e,t,o,a,s)}function z(e){if(e.length<=h)return e;const t=e.length-h,o=e.slice(-h);return[{key:`trace:compacted:${e.length}`,source:"trace",line:`Compacted trace: showing latest ${h} lines (${t} older lines hidden).`,tone:"info"},...o]}function _(e,t){const o=[],n=new Set;if(e.summary&&E(o,n,"summary",e.summary,"reasoning"),e.message&&E(o,n,"failure",e.message,"error"),e.detail&&E(o,n,"detail",e.detail,"error"),e.params&&"object"==typeof e.params){const t="string"==typeof e.params.instruction?e.params.instruction:"",s="string"==typeof e.params.targetPath?e.params.targetPath:"";t&&E(o,n,"request",`Instruction: ${t}`,"reasoning"),s&&E(o,n,"request",`Target path: ${s}`,"action")}if(Array.isArray(e.artifacts))for(const t of e.artifacts){if(!t?.text)continue;const e=`artifact.${t.kind||"text"}`,s="stderr"===t.kind?"error":"info";E(o,n,e,t.text,s)}for(const e of t){const t=T(e.line||"");if(t&&!t.startsWith(b)){if(t.startsWith(f)){const s=t.slice(f.length).trim();if(!s)continue;try{const e=JSON.parse(s);"string"==typeof e.summary&&E(o,n,"openhands.summary",e.summary,"reasoning"),"string"==typeof e.stdout&&E(o,n,"openhands.stdout",e.stdout,"info"),"string"==typeof e.stderr&&E(o,n,"openhands.stderr",e.stderr,"error")}catch{E(o,n,"openhands",s,C(s,e.stream))}continue}w(o,n,`log.${e.stream}`,t,C(t,e.stream),e.ts)}}return z(o)}function H(e,t){const o=t?.fontSans,n=t?.fontMono??"monospace";return c.default.create({container:{flex:1,backgroundColor:e.bg},content:{padding:12,paddingBottom:16},emptyContainer:{flex:1,alignItems:"center",justifyContent:"center",padding:24},section:{marginBottom:16},sectionTitle:{fontSize:13,fontWeight:"700",color:e.textMuted,textTransform:"uppercase",letterSpacing:.5,marginBottom:8,fontFamily:o},taskCard:{backgroundColor:e.panel,borderRadius:8,marginBottom:8,borderLeftWidth:3,borderLeftColor:e.border,boxShadow:"0 1px 3px rgba(0,0,0,0.12)"},taskHeader:{flexDirection:"row",alignItems:"center",padding:10,gap:8},taskTitle:{flex:1,fontSize:14,fontWeight:"600",color:e.text,fontFamily:o},taskBody:{paddingHorizontal:10,paddingBottom:10},desc:{fontSize:12,color:e.textMuted,marginBottom:4,fontFamily:o},progressMsg:{fontSize:12,color:e.warning,fontStyle:"italic",marginBottom:8,fontFamily:o},jobCard:{backgroundColor:e.panelAlt,borderRadius:6,marginTop:6,borderWidth:1,borderColor:e.border},jobCardFocused:{borderColor:e.accent,borderWidth:2},jobHeader:{flexDirection:"row",alignItems:"center",padding:8,gap:6,flexWrap:"wrap"},jobBody:{borderTopWidth:1,borderTopColor:e.border,paddingBottom:8},jobKind:{fontSize:13,fontWeight:"500",color:e.text,fontFamily:o},workerId:{fontSize:11,color:e.accent,fontFamily:n},logCount:{fontSize:11,color:e.textMuted,marginLeft:"auto",fontFamily:o},jobSummary:{fontSize:12,color:e.text,paddingHorizontal:8,paddingTop:8,paddingBottom:4,fontFamily:o},identifierSection:{paddingHorizontal:8,paddingTop:6,paddingBottom:2},identifierRow:{flexDirection:"column",alignItems:"flex-start"},identifierText:{fontSize:11,color:e.textMuted,fontFamily:n},copyIdsButton:{marginTop:6,alignSelf:"flex-start",borderRadius:6,borderWidth:1,borderColor:e.border,backgroundColor:e.panel,paddingHorizontal:8,paddingVertical:4},copyIdsButtonText:{fontSize:11,fontWeight:"600",color:e.text,fontFamily:o},jobError:{fontSize:12,color:e.danger,paddingHorizontal:8,paddingTop:4,fontFamily:o},jobErrorDetail:{fontSize:11,color:e.danger,paddingHorizontal:8,paddingTop:2,fontFamily:n},traceSection:{marginTop:4},traceScroll:{maxHeight:220},traceLine:{fontSize:11,paddingHorizontal:8,paddingVertical:2,fontFamily:n},traceReasoning:{color:e.reasoningText,backgroundColor:e.reasoningBg},traceAction:{color:e.actionText,backgroundColor:e.actionBg},traceInfo:{color:e.infoText,backgroundColor:e.infoBg},traceError:{color:e.errorText,backgroundColor:e.errorBg},rawToggle:{marginTop:6,marginHorizontal:8,paddingHorizontal:8,paddingVertical:6,borderRadius:6,borderWidth:1,borderColor:e.border,backgroundColor:e.panel,alignSelf:"flex-start"},rawToggleText:{fontSize:11,color:e.text,fontWeight:"600",fontFamily:o},logSections:{borderTopWidth:1,borderTopColor:e.border,marginTop:6},streamLabel:{fontSize:10,fontWeight:"700",color:e.textMuted,textTransform:"uppercase",paddingHorizontal:8,paddingTop:6,letterSpacing:.5,fontFamily:o},logScroll:{maxHeight:200},logLine:{fontSize:11,paddingHorizontal:8,paddingVertical:1,fontFamily:n},logStdout:{color:e.infoText,backgroundColor:e.actionBg},logStderr:{color:e.errorText,backgroundColor:e.errorBg},dot:{width:8,height:8,borderRadius:4},statusBadge:{fontSize:11,fontWeight:"600",fontFamily:o},chevron:{fontSize:12,color:e.textMuted,fontFamily:o},muted:{fontSize:12,color:e.textMuted,fontStyle:"italic",paddingHorizontal:8,fontFamily:o}})}function A(e,t){switch(e){case"reasoning":return t.traceReasoning;case"action":return t.traceAction;case"error":return t.traceError;default:return t.traceInfo}}function D(e){const o=(0,t.c)(42),{task:l,jobs:c,logs:f,expanded:b,onToggle:p,focusJobId:y,styles:h,palette:x}=e;let j;o[0]!==x||o[1]!==l.status?(j=I(l.status,x),o[0]=x,o[1]=l.status,o[2]=j):j=o[2];const k=j;let S,T,F,B,C,w;o[3]!==k?(S={backgroundColor:k},o[3]=k,o[4]=S):S=o[4],o[5]!==h.dot||o[6]!==S?(T=(0,u.jsx)(n.default,{style:[h.dot,S]}),o[5]=h.dot,o[6]=S,o[7]=T):T=o[7],o[8]!==h.taskTitle||o[9]!==l.title?(F=(0,u.jsx)(s.default,{style:h.taskTitle,numberOfLines:1,children:l.title}),o[8]=h.taskTitle,o[9]=l.title,o[10]=F):F=o[10],o[11]!==k?(B={color:k},o[11]=k,o[12]=B):B=o[12],o[13]!==h.statusBadge||o[14]!==B?(C=[h.statusBadge,B],o[13]=h.statusBadge,o[14]=B,o[15]=C):C=o[15],o[16]!==C||o[17]!==l.status?(w=(0,u.jsx)(s.default,{style:C,children:l.status}),o[16]=C,o[17]=l.status,o[18]=w):w=o[18];const E=b?"v":">";let z,_,H,A;return o[19]!==h.chevron||o[20]!==E?(z=(0,u.jsx)(s.default,{style:h.chevron,children:E}),o[19]=h.chevron,o[20]=E,o[21]=z):z=o[21],o[22]!==p||o[23]!==h.taskHeader||o[24]!==T||o[25]!==F||o[26]!==w||o[27]!==z?(_=(0,u.jsxs)(a.default,{onPress:p,style:h.taskHeader,children:[T,F,w,z]}),o[22]=p,o[23]=h.taskHeader,o[24]=T,o[25]=F,o[26]=w,o[27]=z,o[28]=_):_=o[28],o[29]!==b||o[30]!==y||o[31]!==c||o[32]!==f||o[33]!==x||o[34]!==h||o[35]!==l.description||o[36]!==l.latestProgress?(H=b&&(0,u.jsxs)(n.default,{style:h.taskBody,children:[l.description?(0,u.jsx)(s.default,{style:h.desc,children:l.description}):null,l.latestProgress?(0,u.jsx)(s.default,{style:h.progressMsg,children:l.latestProgress}):null,0===c.length&&(0,u.jsx)(s.default,{style:h.muted,children:"No jobs yet"}),c.map(e=>(0,u.jsx)(v,{job:e,logs:f.get(e.jobId)??[],forceExpanded:y===e.jobId,focused:y===e.jobId,styles:h,palette:x},e.jobId))]}),o[29]=b,o[30]=y,o[31]=c,o[32]=f,o[33]=x,o[34]=h,o[35]=l.description,o[36]=l.latestProgress,o[37]=H):H=o[37],o[38]!==h.taskCard||o[39]!==_||o[40]!==H?(A=(0,u.jsxs)(n.default,{style:h.taskCard,children:[_,H]}),o[38]=h.taskCard,o[39]=_,o[40]=H,o[41]=A):A=o[41],A}function v(e){const c=(0,t.c)(79),{job:f,logs:b,forceExpanded:p,focused:y,styles:h,palette:j}=e,k=void 0!==p&&p,S=void 0!==y&&y,[T,F]=(0,o.useState)(!1),[C,w]=(0,o.useState)(!1),[E,z]=(0,o.useState)("idle"),H=(0,o.useRef)(null);let D;c[0]!==f.status||c[1]!==j?(D=I(f.status,j),c[0]=f.status,c[1]=j,c[2]=D):D=c[2];const v=D;let R,P,J,q,N;c[3]!==k?(R=()=>{k&&F(!0)},c[3]=k,c[4]=R):R=c[4],c[5]!==k||c[6]!==f.jobId?(P=[k,f.jobId],c[5]=k,c[6]=f.jobId,c[7]=P):P=c[7],(0,o.useEffect)(R,P),c[8]===Symbol.for("react.memo_cache_sentinel")?(J=()=>()=>{H.current&&clearTimeout(H.current)},q=[],c[8]=J,c[9]=q):(J=c[8],q=c[9]),(0,o.useEffect)(J,q),c[10]!==f.jobId||c[11]!==f.workerId?(N=async()=>{const e=[`jobId=${f.jobId}`];f.workerId&&e.push(`workerId=${f.workerId}`);const t=await x(e.join("\n"));z(t?"copied":"unavailable"),H.current&&clearTimeout(H.current),H.current=setTimeout(()=>z("idle"),t?1600:2600)},c[10]=f.jobId,c[11]=f.workerId,c[12]=N):N=c[12];const O=N;let K;c[13]!==b?(K=b.filter(M).sort(W),c[13]=b,c[14]=K):K=c[14];const U=K;let V;c[15]!==b?(V=b.filter($).sort(L),c[15]=b,c[16]=V):V=c[16];const G=V;let Q;c[17]!==f||c[18]!==b?(Q=_(f,b),c[17]=f,c[18]=b,c[19]=Q):Q=c[19];const X=Q,Y=U.length+G.length,Z=S&&h.jobCardFocused;let ee,te,oe,re,ne,se,ae,le,ie,de;c[20]!==h.jobCard||c[21]!==Z?(ee=[h.jobCard,Z],c[20]=h.jobCard,c[21]=Z,c[22]=ee):ee=c[22],c[23]!==T?(te=()=>F(!T),c[23]=T,c[24]=te):te=c[24],c[25]!==v?(oe={backgroundColor:v},c[25]=v,c[26]=oe):oe=c[26],c[27]!==h.dot||c[28]!==oe?(re=(0,u.jsx)(n.default,{style:[h.dot,oe]}),c[27]=h.dot,c[28]=oe,c[29]=re):re=c[29],c[30]!==f.kind||c[31]!==h.jobKind?(ne=(0,u.jsx)(s.default,{style:h.jobKind,children:f.kind}),c[30]=f.kind,c[31]=h.jobKind,c[32]=ne):ne=c[32],c[33]!==v?(se={color:v},c[33]=v,c[34]=se):se=c[34],c[35]!==h.statusBadge||c[36]!==se?(ae=[h.statusBadge,se],c[35]=h.statusBadge,c[36]=se,c[37]=ae):ae=c[37],c[38]!==f.status||c[39]!==ae?(le=(0,u.jsx)(s.default,{style:ae,children:f.status}),c[38]=f.status,c[39]=ae,c[40]=le):le=c[40],c[41]!==f.workerId||c[42]!==h.workerId?(ie=f.workerId?(0,u.jsxs)(s.default,{style:h.workerId,children:["@",f.workerId]}):null,c[41]=f.workerId,c[42]=h.workerId,c[43]=ie):ie=c[43],c[44]!==h.logCount||c[45]!==Y||c[46]!==X.length?(de=X.length>0||Y>0?(0,u.jsxs)(s.default,{style:h.logCount,children:[X.length," trace / ",Y," raw"]}):null,c[44]=h.logCount,c[45]=Y,c[46]=X.length,c[47]=de):de=c[47];const ce=T?"v":">";let ue,fe,ge,be;return c[48]!==h.chevron||c[49]!==ce?(ue=(0,u.jsx)(s.default,{style:h.chevron,children:ce}),c[48]=h.chevron,c[49]=ce,c[50]=ue):ue=c[50],c[51]!==h.jobHeader||c[52]!==te||c[53]!==re||c[54]!==ne||c[55]!==le||c[56]!==ie||c[57]!==de||c[58]!==ue?(fe=(0,u.jsxs)(a.default,{onPress:te,style:h.jobHeader,children:[re,ne,le,ie,de,ue]}),c[51]=h.jobHeader,c[52]=te,c[53]=re,c[54]=ne,c[55]=le,c[56]=ie,c[57]=de,c[58]=ue,c[59]=fe):fe=c[59],c[60]!==E||c[61]!==T||c[62]!==O||c[63]!==f.detail||c[64]!==f.jobId||c[65]!==f.message||c[66]!==f.summary||c[67]!==f.workerId||c[68]!==C||c[69]!==G||c[70]!==U||c[71]!==h||c[72]!==Y||c[73]!==X?(ge=T&&(0,u.jsxs)(n.default,{style:h.jobBody,children:[f.summary?(0,u.jsx)(s.default,{style:h.jobSummary,children:f.summary}):null,(0,u.jsxs)(n.default,{style:h.identifierSection,children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"Identifiers"}),(0,u.jsxs)(n.default,{style:h.identifierRow,children:[(0,u.jsxs)(s.default,{style:h.identifierText,selectable:!0,children:["jobId=",f.jobId]}),f.workerId?(0,u.jsxs)(s.default,{style:h.identifierText,selectable:!0,children:["workerId=",f.workerId]}):(0,u.jsx)(s.default,{style:h.identifierText,children:"workerId=--"})]}),(0,u.jsx)(a.default,{style:h.copyIdsButton,onPress:O,children:(0,u.jsx)(s.default,{style:h.copyIdsButtonText,children:"copied"===E?"Copied IDs":"unavailable"===E?"Select text to copy":"Copy IDs"})})]}),f.message?(0,u.jsx)(s.default,{style:h.jobError,children:f.message}):null,f.detail?(0,u.jsx)(s.default,{style:h.jobErrorDetail,children:f.detail}):null,X.length>0?(0,u.jsxs)(n.default,{style:h.traceSection,children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"Trace"}),(0,u.jsx)(l.default,{style:h.traceScroll,nestedScrollEnabled:!0,children:X.map(e=>(0,u.jsxs)(s.default,{style:[h.traceLine,A(e.tone,h)],selectable:!0,children:[e.ts?`${B(e.ts)} `:"","[",e.source,"]"," ",e.line]},e.key))})]}):(0,u.jsx)(s.default,{style:h.muted,children:"No trace output captured for this job."}),Y>0?(0,u.jsx)(a.default,{style:h.rawToggle,onPress:()=>w(!C),children:(0,u.jsx)(s.default,{style:h.rawToggleText,children:C?"Hide raw logs":`Show raw logs (${Y})`})}):null,C&&Y>0?(0,u.jsxs)(n.default,{style:h.logSections,children:[U.length>0?(0,u.jsxs)(n.default,{children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"STDOUT"}),(0,u.jsx)(l.default,{style:h.logScroll,nestedScrollEnabled:!0,children:U.map(e=>(0,u.jsxs)(s.default,{style:[h.logLine,h.logStdout],selectable:!0,children:[e.ts?`${B(e.ts)} `:"",e.line]},`stdout-${e.seq}`))})]}):null,G.length>0?(0,u.jsxs)(n.default,{children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"STDERR"}),(0,u.jsx)(l.default,{style:h.logScroll,nestedScrollEnabled:!0,children:G.map(e=>(0,u.jsxs)(s.default,{style:[h.logLine,h.logStderr],selectable:!0,children:[e.ts?`${B(e.ts)} `:"",e.line]},`stderr-${e.seq}`))})]}):null]}):null]}),c[60]=E,c[61]=T,c[62]=O,c[63]=f.detail,c[64]=f.jobId,c[65]=f.message,c[66]=f.summary,c[67]=f.workerId,c[68]=C,c[69]=G,c[70]=U,c[71]=h,c[72]=Y,c[73]=X,c[74]=ge):ge=c[74],c[75]!==ee||c[76]!==fe||c[77]!==ge?(be=(0,u.jsxs)(n.default,{style:ee,children:[fe,ge]}),c[75]=ee,c[76]=fe,c[77]=ge,c[78]=be):be=c[78],be}function L(e,t){return e.seq-t.seq}function $(e){return"stderr"===e.stream}function W(e,t){return e.seq-t.seq}function M(e){return"stdout"===e.stream}function R(e){const o=(0,t.c)(15),{jobs:a,logs:l,taskJobIds:c,focusJobId:f,styles:b,palette:p}=e;let y,h;if(o[0]!==f||o[1]!==a||o[2]!==l||o[3]!==p||o[4]!==b||o[5]!==c){h=Symbol.for("react.early_return_sentinel");e:{const e=Array.from(a.values()).filter(e=>!c.has(e.jobId)).sort(P);if(0===e.length){h=null;break e}let t,x;o[8]!==b.sectionTitle?(t=(0,u.jsx)(s.default,{style:b.sectionTitle,children:"Standalone Jobs"}),o[8]=b.sectionTitle,o[9]=t):t=o[9],o[10]!==f||o[11]!==l||o[12]!==p||o[13]!==b?(x=e=>(0,u.jsx)(v,{job:e,logs:l.get(e.jobId)??[],forceExpanded:f===e.jobId,focused:f===e.jobId,styles:b,palette:p},e.jobId),o[10]=f,o[11]=l,o[12]=p,o[13]=b,o[14]=x):x=o[14],y=(0,u.jsxs)(n.default,{style:b.section,children:[t,e.map(x)]})}o[0]=f,o[1]=a,o[2]=l,o[3]=p,o[4]=b,o[5]=c,o[6]=y,o[7]=h}else y=o[6],h=o[7];return h!==Symbol.for("react.early_return_sentinel")?h:y}function P(e,t){return t.ts.localeCompare(e.ts)}function J(e,t){return t.ts.localeCompare(e.ts)}},1019,[1135,21,310,123,404,317,136,114,2]);
|
|
1030
|
+
__d(function(g,r,i,_a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.TasksJobsLogs=function(e){const a=(0,t.c)(37),{state:c,theme:f,focusJobId:b}=e,[p,y]=(0,o.useState)(null),h=f?.mode??"light";let x;a[0]!==h?(x=S(h),a[0]=h,a[1]=x):x=a[1];const j=x;let k;a[2]!==j||a[3]!==f?(k=H(j,f),a[2]=j,a[3]=f,a[4]=k):k=a[4];const I=k;let T,F,B,C,w,E,z;if(a[5]!==c.tasks){F=Array.from(c.tasks.values()).sort(J),T=new Set;for(const e of F)for(const t of e.jobIds)T.add(t);a[5]=c.tasks,a[6]=T,a[7]=F}else T=a[6],F=a[7];a[8]!==b||a[9]!==F?(B=()=>{if(!b)return;const e=F.find(e=>e.jobIds.includes(b));e&&y(e.taskId)},C=[b,F],a[8]=b,a[9]=F,a[10]=B,a[11]=C):(B=a[10],C=a[11]);if((0,o.useEffect)(B,C),0===F.length&&0===c.jobs.size){let e,t;return a[12]!==I.muted?(e=(0,u.jsx)(s.default,{style:I.muted,children:"No tasks or jobs yet"}),a[12]=I.muted,a[13]=e):e=a[13],a[14]!==I.emptyContainer||a[15]!==e?(t=(0,u.jsx)(n.default,{style:I.emptyContainer,children:e}),a[14]=I.emptyContainer,a[15]=e,a[16]=t):t=a[16],t}a[17]!==p||a[18]!==b||a[19]!==j||a[20]!==c.jobs||a[21]!==c.logs||a[22]!==I||a[23]!==F?(w=F.length>0?(0,u.jsxs)(n.default,{style:I.section,children:[(0,u.jsx)(s.default,{style:I.sectionTitle,children:"Tasks"}),F.map(e=>{const t=e.jobIds.map(e=>c.jobs.get(e)).filter(Boolean),o={claimed:0,pending:1,enqueued:2,completed:3,publish_blocked:4,abandoned:5,failed:6};return t.sort((e,t)=>{const n=o[e.status]??9,s=o[t.status]??9;return n!==s?n-s:e.ts.localeCompare(t.ts)}),(0,u.jsx)(D,{task:e,jobs:t,logs:c.logs,expanded:p===e.taskId,onToggle:()=>y(p===e.taskId?null:e.taskId),focusJobId:b,styles:I,palette:j},e.taskId)})]}):null,a[17]=p,a[18]=b,a[19]=j,a[20]=c.jobs,a[21]=c.logs,a[22]=I,a[23]=F,a[24]=w):w=a[24];a[25]!==b||a[26]!==j||a[27]!==c.jobs||a[28]!==c.logs||a[29]!==I||a[30]!==T?(E=(0,u.jsx)(R,{jobs:c.jobs,logs:c.logs,taskJobIds:T,focusJobId:b,styles:I,palette:j}),a[25]=b,a[26]=j,a[27]=c.jobs,a[28]=c.logs,a[29]=I,a[30]=T,a[31]=E):E=a[31];a[32]!==I.container||a[33]!==I.content||a[34]!==w||a[35]!==E?(z=(0,u.jsxs)(l.default,{style:I.container,contentContainerStyle:I.content,children:[w,E]}),a[32]=I.container,a[33]=I.content,a[34]=w,a[35]=E,a[36]=z):z=a[36];return z};var t=r(d[0]),o=r(d[1]),n=e(r(d[2])),s=e(r(d[3])),a=e(r(d[4])),l=e(r(d[5])),c=e(r(d[6]));r(d[7]);var u=r(d[8]);const f="__PUSHPALS_OH_RESULT__ ",b="___RESULT___ ",p=500,y=/\x1b\[[0-9;]*m/g;const h=(function(e){const t=Number.parseInt(String(e??"").trim(),10);return Number.isFinite(t)?Math.max(20,Math.min(500,t)):100})(void 0);async function x(e){const t=String(e??"").trim();if(!t)return!1;try{const e=globalThis.navigator,o=e?.clipboard?.writeText;return"function"==typeof o&&(await o(t),!0)}catch{return!1}}const j={bg:"#F4F8FB",panel:"#FFFFFF",panelAlt:"#EEF4F8",border:"#D2E0E8",text:"#112230",textMuted:"#547086",accent:"#007E77",success:"#169A58",warning:"#C7851E",danger:"#D64553",reasoningText:"#1D4E89",reasoningBg:"#EAF4FF",actionText:"#0F6C48",actionBg:"#E9FBF5",infoText:"#334155",infoBg:"#F4F8FB",errorText:"#A22A35",errorBg:"#FEECEF"},k={bg:"#14212A",panel:"#16222B",panelAlt:"#1B2A35",border:"#284050",text:"#EAF3F6",textMuted:"#97B3C2",accent:"#2FD6C8",success:"#5DDD8B",warning:"#FFB95A",danger:"#FF6B72",reasoningText:"#9BC6FF",reasoningBg:"#1D2A40",actionText:"#8EF5BD",actionBg:"#163628",infoText:"#D2E3ED",infoBg:"#1A2934",errorText:"#FFACB5",errorBg:"#3A1B22"};function S(e){return"dark"===e?k:j}function I(e,t){switch(e){case"completed":return t.success;case"failed":case"abandoned":case"publish_blocked":return t.danger;case"claimed":case"started":case"in_progress":return t.warning;default:return t.accent}}function T(e){return e.replace(y,"").replace(/\s+/g," ").trim()}function F(e){return e.length<=p?e:`${e.slice(0,497)}...`}function B(e){if(!e)return"";const t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString():""}function C(e,t){const o=e.toLowerCase();return"stderr"===t||o.includes("error")||o.includes("failed")||o.includes("traceback")||o.includes("exception")?"error":/\b(think|reason|analysis|plan|decide|why|because|approach|strategy)\b/i.test(o)?"reasoning":/\b(run|running|execute|executing|write|patch|edit|search|read|fetch|merge|commit|push|claim)\b/i.test(o)?"action":"info"}function w(e,t,o,n,s,a){const l=n.trim();if(!l)return;const c=`${o}|${l}`;t.has(c)||(t.add(c),e.push({key:`${o}:${e.length}`,source:o,line:l,tone:s,ts:a}))}function E(e,t,o,n,s){for(const a of n.split(/\r?\n/).map(e=>F(T(e))).filter(Boolean))w(e,t,o,a,s)}function z(e){if(e.length<=h)return e;const t=e.length-h,o=e.slice(-h);return[{key:`trace:compacted:${e.length}`,source:"trace",line:`Compacted trace: showing latest ${h} lines (${t} older lines hidden).`,tone:"info"},...o]}function _(e,t){const o=[],n=new Set;if(e.summary&&E(o,n,"summary",e.summary,"reasoning"),e.message&&E(o,n,"failure",e.message,"error"),e.detail&&E(o,n,"detail",e.detail,"error"),e.params&&"object"==typeof e.params){const t="string"==typeof e.params.instruction?e.params.instruction:"",s="string"==typeof e.params.targetPath?e.params.targetPath:"";t&&E(o,n,"request",`Instruction: ${t}`,"reasoning"),s&&E(o,n,"request",`Suggested starting point: ${s}`,"action")}if(Array.isArray(e.artifacts))for(const t of e.artifacts){if(!t?.text)continue;const e=`artifact.${t.kind||"text"}`,s="stderr"===t.kind?"error":"info";E(o,n,e,t.text,s)}for(const e of t){const t=T(e.line||"");if(t&&!t.startsWith(b)){if(t.startsWith(f)){const s=t.slice(f.length).trim();if(!s)continue;try{const e=JSON.parse(s);"string"==typeof e.summary&&E(o,n,"openhands.summary",e.summary,"reasoning"),"string"==typeof e.stdout&&E(o,n,"openhands.stdout",e.stdout,"info"),"string"==typeof e.stderr&&E(o,n,"openhands.stderr",e.stderr,"error")}catch{E(o,n,"openhands",s,C(s,e.stream))}continue}w(o,n,`log.${e.stream}`,t,C(t,e.stream),e.ts)}}return z(o)}function H(e,t){const o=t?.fontSans,n=t?.fontMono??"monospace";return c.default.create({container:{flex:1,backgroundColor:e.bg},content:{padding:12,paddingBottom:16},emptyContainer:{flex:1,alignItems:"center",justifyContent:"center",padding:24},section:{marginBottom:16},sectionTitle:{fontSize:13,fontWeight:"700",color:e.textMuted,textTransform:"uppercase",letterSpacing:.5,marginBottom:8,fontFamily:o},taskCard:{backgroundColor:e.panel,borderRadius:8,marginBottom:8,borderLeftWidth:3,borderLeftColor:e.border,boxShadow:"0 1px 3px rgba(0,0,0,0.12)"},taskHeader:{flexDirection:"row",alignItems:"center",padding:10,gap:8},taskTitle:{flex:1,fontSize:14,fontWeight:"600",color:e.text,fontFamily:o},taskBody:{paddingHorizontal:10,paddingBottom:10},desc:{fontSize:12,color:e.textMuted,marginBottom:4,fontFamily:o},progressMsg:{fontSize:12,color:e.warning,fontStyle:"italic",marginBottom:8,fontFamily:o},jobCard:{backgroundColor:e.panelAlt,borderRadius:6,marginTop:6,borderWidth:1,borderColor:e.border},jobCardFocused:{borderColor:e.accent,borderWidth:2},jobHeader:{flexDirection:"row",alignItems:"center",padding:8,gap:6,flexWrap:"wrap"},jobBody:{borderTopWidth:1,borderTopColor:e.border,paddingBottom:8},jobKind:{fontSize:13,fontWeight:"500",color:e.text,fontFamily:o},workerId:{fontSize:11,color:e.accent,fontFamily:n},logCount:{fontSize:11,color:e.textMuted,marginLeft:"auto",fontFamily:o},jobSummary:{fontSize:12,color:e.text,paddingHorizontal:8,paddingTop:8,paddingBottom:4,fontFamily:o},identifierSection:{paddingHorizontal:8,paddingTop:6,paddingBottom:2},identifierRow:{flexDirection:"column",alignItems:"flex-start"},identifierText:{fontSize:11,color:e.textMuted,fontFamily:n},copyIdsButton:{marginTop:6,alignSelf:"flex-start",borderRadius:6,borderWidth:1,borderColor:e.border,backgroundColor:e.panel,paddingHorizontal:8,paddingVertical:4},copyIdsButtonText:{fontSize:11,fontWeight:"600",color:e.text,fontFamily:o},jobError:{fontSize:12,color:e.danger,paddingHorizontal:8,paddingTop:4,fontFamily:o},jobErrorDetail:{fontSize:11,color:e.danger,paddingHorizontal:8,paddingTop:2,fontFamily:n},traceSection:{marginTop:4},traceScroll:{maxHeight:220},traceLine:{fontSize:11,paddingHorizontal:8,paddingVertical:2,fontFamily:n},traceReasoning:{color:e.reasoningText,backgroundColor:e.reasoningBg},traceAction:{color:e.actionText,backgroundColor:e.actionBg},traceInfo:{color:e.infoText,backgroundColor:e.infoBg},traceError:{color:e.errorText,backgroundColor:e.errorBg},rawToggle:{marginTop:6,marginHorizontal:8,paddingHorizontal:8,paddingVertical:6,borderRadius:6,borderWidth:1,borderColor:e.border,backgroundColor:e.panel,alignSelf:"flex-start"},rawToggleText:{fontSize:11,color:e.text,fontWeight:"600",fontFamily:o},logSections:{borderTopWidth:1,borderTopColor:e.border,marginTop:6},streamLabel:{fontSize:10,fontWeight:"700",color:e.textMuted,textTransform:"uppercase",paddingHorizontal:8,paddingTop:6,letterSpacing:.5,fontFamily:o},logScroll:{maxHeight:200},logLine:{fontSize:11,paddingHorizontal:8,paddingVertical:1,fontFamily:n},logStdout:{color:e.infoText,backgroundColor:e.actionBg},logStderr:{color:e.errorText,backgroundColor:e.errorBg},dot:{width:8,height:8,borderRadius:4},statusBadge:{fontSize:11,fontWeight:"600",fontFamily:o},chevron:{fontSize:12,color:e.textMuted,fontFamily:o},muted:{fontSize:12,color:e.textMuted,fontStyle:"italic",paddingHorizontal:8,fontFamily:o}})}function A(e,t){switch(e){case"reasoning":return t.traceReasoning;case"action":return t.traceAction;case"error":return t.traceError;default:return t.traceInfo}}function D(e){const o=(0,t.c)(42),{task:l,jobs:c,logs:f,expanded:b,onToggle:p,focusJobId:y,styles:h,palette:x}=e;let j;o[0]!==x||o[1]!==l.status?(j=I(l.status,x),o[0]=x,o[1]=l.status,o[2]=j):j=o[2];const k=j;let S,T,F,B,C,w;o[3]!==k?(S={backgroundColor:k},o[3]=k,o[4]=S):S=o[4],o[5]!==h.dot||o[6]!==S?(T=(0,u.jsx)(n.default,{style:[h.dot,S]}),o[5]=h.dot,o[6]=S,o[7]=T):T=o[7],o[8]!==h.taskTitle||o[9]!==l.title?(F=(0,u.jsx)(s.default,{style:h.taskTitle,numberOfLines:1,children:l.title}),o[8]=h.taskTitle,o[9]=l.title,o[10]=F):F=o[10],o[11]!==k?(B={color:k},o[11]=k,o[12]=B):B=o[12],o[13]!==h.statusBadge||o[14]!==B?(C=[h.statusBadge,B],o[13]=h.statusBadge,o[14]=B,o[15]=C):C=o[15],o[16]!==C||o[17]!==l.status?(w=(0,u.jsx)(s.default,{style:C,children:l.status}),o[16]=C,o[17]=l.status,o[18]=w):w=o[18];const E=b?"v":">";let z,_,H,A;return o[19]!==h.chevron||o[20]!==E?(z=(0,u.jsx)(s.default,{style:h.chevron,children:E}),o[19]=h.chevron,o[20]=E,o[21]=z):z=o[21],o[22]!==p||o[23]!==h.taskHeader||o[24]!==T||o[25]!==F||o[26]!==w||o[27]!==z?(_=(0,u.jsxs)(a.default,{onPress:p,style:h.taskHeader,children:[T,F,w,z]}),o[22]=p,o[23]=h.taskHeader,o[24]=T,o[25]=F,o[26]=w,o[27]=z,o[28]=_):_=o[28],o[29]!==b||o[30]!==y||o[31]!==c||o[32]!==f||o[33]!==x||o[34]!==h||o[35]!==l.description||o[36]!==l.latestProgress?(H=b&&(0,u.jsxs)(n.default,{style:h.taskBody,children:[l.description?(0,u.jsx)(s.default,{style:h.desc,children:l.description}):null,l.latestProgress?(0,u.jsx)(s.default,{style:h.progressMsg,children:l.latestProgress}):null,0===c.length&&(0,u.jsx)(s.default,{style:h.muted,children:"No jobs yet"}),c.map(e=>(0,u.jsx)(v,{job:e,logs:f.get(e.jobId)??[],forceExpanded:y===e.jobId,focused:y===e.jobId,styles:h,palette:x},e.jobId))]}),o[29]=b,o[30]=y,o[31]=c,o[32]=f,o[33]=x,o[34]=h,o[35]=l.description,o[36]=l.latestProgress,o[37]=H):H=o[37],o[38]!==h.taskCard||o[39]!==_||o[40]!==H?(A=(0,u.jsxs)(n.default,{style:h.taskCard,children:[_,H]}),o[38]=h.taskCard,o[39]=_,o[40]=H,o[41]=A):A=o[41],A}function v(e){const c=(0,t.c)(79),{job:f,logs:b,forceExpanded:p,focused:y,styles:h,palette:j}=e,k=void 0!==p&&p,S=void 0!==y&&y,[T,F]=(0,o.useState)(!1),[C,w]=(0,o.useState)(!1),[E,z]=(0,o.useState)("idle"),H=(0,o.useRef)(null);let D;c[0]!==f.status||c[1]!==j?(D=I(f.status,j),c[0]=f.status,c[1]=j,c[2]=D):D=c[2];const v=D;let R,P,J,q,N;c[3]!==k?(R=()=>{k&&F(!0)},c[3]=k,c[4]=R):R=c[4],c[5]!==k||c[6]!==f.jobId?(P=[k,f.jobId],c[5]=k,c[6]=f.jobId,c[7]=P):P=c[7],(0,o.useEffect)(R,P),c[8]===Symbol.for("react.memo_cache_sentinel")?(J=()=>()=>{H.current&&clearTimeout(H.current)},q=[],c[8]=J,c[9]=q):(J=c[8],q=c[9]),(0,o.useEffect)(J,q),c[10]!==f.jobId||c[11]!==f.workerId?(N=async()=>{const e=[`jobId=${f.jobId}`];f.workerId&&e.push(`workerId=${f.workerId}`);const t=await x(e.join("\n"));z(t?"copied":"unavailable"),H.current&&clearTimeout(H.current),H.current=setTimeout(()=>z("idle"),t?1600:2600)},c[10]=f.jobId,c[11]=f.workerId,c[12]=N):N=c[12];const O=N;let K;c[13]!==b?(K=b.filter(M).sort(W),c[13]=b,c[14]=K):K=c[14];const U=K;let V;c[15]!==b?(V=b.filter($).sort(L),c[15]=b,c[16]=V):V=c[16];const G=V;let Q;c[17]!==f||c[18]!==b?(Q=_(f,b),c[17]=f,c[18]=b,c[19]=Q):Q=c[19];const X=Q,Y=U.length+G.length,Z=S&&h.jobCardFocused;let ee,te,oe,re,ne,se,ae,le,ie,de;c[20]!==h.jobCard||c[21]!==Z?(ee=[h.jobCard,Z],c[20]=h.jobCard,c[21]=Z,c[22]=ee):ee=c[22],c[23]!==T?(te=()=>F(!T),c[23]=T,c[24]=te):te=c[24],c[25]!==v?(oe={backgroundColor:v},c[25]=v,c[26]=oe):oe=c[26],c[27]!==h.dot||c[28]!==oe?(re=(0,u.jsx)(n.default,{style:[h.dot,oe]}),c[27]=h.dot,c[28]=oe,c[29]=re):re=c[29],c[30]!==f.kind||c[31]!==h.jobKind?(ne=(0,u.jsx)(s.default,{style:h.jobKind,children:f.kind}),c[30]=f.kind,c[31]=h.jobKind,c[32]=ne):ne=c[32],c[33]!==v?(se={color:v},c[33]=v,c[34]=se):se=c[34],c[35]!==h.statusBadge||c[36]!==se?(ae=[h.statusBadge,se],c[35]=h.statusBadge,c[36]=se,c[37]=ae):ae=c[37],c[38]!==f.status||c[39]!==ae?(le=(0,u.jsx)(s.default,{style:ae,children:f.status}),c[38]=f.status,c[39]=ae,c[40]=le):le=c[40],c[41]!==f.workerId||c[42]!==h.workerId?(ie=f.workerId?(0,u.jsxs)(s.default,{style:h.workerId,children:["@",f.workerId]}):null,c[41]=f.workerId,c[42]=h.workerId,c[43]=ie):ie=c[43],c[44]!==h.logCount||c[45]!==Y||c[46]!==X.length?(de=X.length>0||Y>0?(0,u.jsxs)(s.default,{style:h.logCount,children:[X.length," trace / ",Y," raw"]}):null,c[44]=h.logCount,c[45]=Y,c[46]=X.length,c[47]=de):de=c[47];const ce=T?"v":">";let ue,fe,ge,be;return c[48]!==h.chevron||c[49]!==ce?(ue=(0,u.jsx)(s.default,{style:h.chevron,children:ce}),c[48]=h.chevron,c[49]=ce,c[50]=ue):ue=c[50],c[51]!==h.jobHeader||c[52]!==te||c[53]!==re||c[54]!==ne||c[55]!==le||c[56]!==ie||c[57]!==de||c[58]!==ue?(fe=(0,u.jsxs)(a.default,{onPress:te,style:h.jobHeader,children:[re,ne,le,ie,de,ue]}),c[51]=h.jobHeader,c[52]=te,c[53]=re,c[54]=ne,c[55]=le,c[56]=ie,c[57]=de,c[58]=ue,c[59]=fe):fe=c[59],c[60]!==E||c[61]!==T||c[62]!==O||c[63]!==f.detail||c[64]!==f.jobId||c[65]!==f.message||c[66]!==f.summary||c[67]!==f.workerId||c[68]!==C||c[69]!==G||c[70]!==U||c[71]!==h||c[72]!==Y||c[73]!==X?(ge=T&&(0,u.jsxs)(n.default,{style:h.jobBody,children:[f.summary?(0,u.jsx)(s.default,{style:h.jobSummary,children:f.summary}):null,(0,u.jsxs)(n.default,{style:h.identifierSection,children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"Identifiers"}),(0,u.jsxs)(n.default,{style:h.identifierRow,children:[(0,u.jsxs)(s.default,{style:h.identifierText,selectable:!0,children:["jobId=",f.jobId]}),f.workerId?(0,u.jsxs)(s.default,{style:h.identifierText,selectable:!0,children:["workerId=",f.workerId]}):(0,u.jsx)(s.default,{style:h.identifierText,children:"workerId=--"})]}),(0,u.jsx)(a.default,{style:h.copyIdsButton,onPress:O,children:(0,u.jsx)(s.default,{style:h.copyIdsButtonText,children:"copied"===E?"Copied IDs":"unavailable"===E?"Select text to copy":"Copy IDs"})})]}),f.message?(0,u.jsx)(s.default,{style:h.jobError,children:f.message}):null,f.detail?(0,u.jsx)(s.default,{style:h.jobErrorDetail,children:f.detail}):null,X.length>0?(0,u.jsxs)(n.default,{style:h.traceSection,children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"Trace"}),(0,u.jsx)(l.default,{style:h.traceScroll,nestedScrollEnabled:!0,children:X.map(e=>(0,u.jsxs)(s.default,{style:[h.traceLine,A(e.tone,h)],selectable:!0,children:[e.ts?`${B(e.ts)} `:"","[",e.source,"]"," ",e.line]},e.key))})]}):(0,u.jsx)(s.default,{style:h.muted,children:"No trace output captured for this job."}),Y>0?(0,u.jsx)(a.default,{style:h.rawToggle,onPress:()=>w(!C),children:(0,u.jsx)(s.default,{style:h.rawToggleText,children:C?"Hide raw logs":`Show raw logs (${Y})`})}):null,C&&Y>0?(0,u.jsxs)(n.default,{style:h.logSections,children:[U.length>0?(0,u.jsxs)(n.default,{children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"STDOUT"}),(0,u.jsx)(l.default,{style:h.logScroll,nestedScrollEnabled:!0,children:U.map(e=>(0,u.jsxs)(s.default,{style:[h.logLine,h.logStdout],selectable:!0,children:[e.ts?`${B(e.ts)} `:"",e.line]},`stdout-${e.seq}`))})]}):null,G.length>0?(0,u.jsxs)(n.default,{children:[(0,u.jsx)(s.default,{style:h.streamLabel,children:"STDERR"}),(0,u.jsx)(l.default,{style:h.logScroll,nestedScrollEnabled:!0,children:G.map(e=>(0,u.jsxs)(s.default,{style:[h.logLine,h.logStderr],selectable:!0,children:[e.ts?`${B(e.ts)} `:"",e.line]},`stderr-${e.seq}`))})]}):null]}):null]}),c[60]=E,c[61]=T,c[62]=O,c[63]=f.detail,c[64]=f.jobId,c[65]=f.message,c[66]=f.summary,c[67]=f.workerId,c[68]=C,c[69]=G,c[70]=U,c[71]=h,c[72]=Y,c[73]=X,c[74]=ge):ge=c[74],c[75]!==ee||c[76]!==fe||c[77]!==ge?(be=(0,u.jsxs)(n.default,{style:ee,children:[fe,ge]}),c[75]=ee,c[76]=fe,c[77]=ge,c[78]=be):be=c[78],be}function L(e,t){return e.seq-t.seq}function $(e){return"stderr"===e.stream}function W(e,t){return e.seq-t.seq}function M(e){return"stdout"===e.stream}function R(e){const o=(0,t.c)(15),{jobs:a,logs:l,taskJobIds:c,focusJobId:f,styles:b,palette:p}=e;let y,h;if(o[0]!==f||o[1]!==a||o[2]!==l||o[3]!==p||o[4]!==b||o[5]!==c){h=Symbol.for("react.early_return_sentinel");e:{const e=Array.from(a.values()).filter(e=>!c.has(e.jobId)).sort(P);if(0===e.length){h=null;break e}let t,x;o[8]!==b.sectionTitle?(t=(0,u.jsx)(s.default,{style:b.sectionTitle,children:"Standalone Jobs"}),o[8]=b.sectionTitle,o[9]=t):t=o[9],o[10]!==f||o[11]!==l||o[12]!==p||o[13]!==b?(x=e=>(0,u.jsx)(v,{job:e,logs:l.get(e.jobId)??[],forceExpanded:f===e.jobId,focused:f===e.jobId,styles:b,palette:p},e.jobId),o[10]=f,o[11]=l,o[12]=p,o[13]=b,o[14]=x):x=o[14],y=(0,u.jsxs)(n.default,{style:b.section,children:[t,e.map(x)]})}o[0]=f,o[1]=a,o[2]=l,o[3]=p,o[4]=b,o[5]=c,o[6]=y,o[7]=h}else y=o[6],h=o[7];return h!==Symbol.for("react.early_return_sentinel")?h:y}function P(e,t){return t.ts.localeCompare(e.ts)}function J(e,t){return t.ts.localeCompare(e.ts)}},1019,[1135,21,310,123,404,317,136,114,2]);
|
|
1031
1031
|
__d(function(g,r,i,a,m,_e,d){"use strict";function t(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.DashboardHeader=function(t){const n=(0,e.c)(61),{theme:h,mode:p,repo:x,snapshotTs:y,formatRelativeTime:S,formatAbsoluteTime:M,onChangeMode:b}=t;let j;n[0]!==x?.remoteUrl?(j=x?.remoteUrl?.trim()||"unavailable",n[0]=x?.remoteUrl,n[1]=j):j=n[1];const L=j,w="github"===x?.provider?x.browserUrl:null;let v;n[2]!==M||n[3]!==S||n[4]!==y?(v=y?`${S(y)} (${M(y)})`:"waiting for /system/status",n[2]=M,n[3]=S,n[4]=y,n[5]=v):v=n[5];const z=v;let F;n[6]!==w?(F=async()=>{if(w)try{if(!await o.default.canOpenURL(w))return;await o.default.openURL(w)}catch(t){const e=t;console.error(`[DashboardHeader] Failed to open repo URL: ${w}`,e)}},n[6]=w,n[7]=F):F=n[7];const T=F;let U,C,H,_;n[8]!==h.fontSans||n[9]!==h.textMuted?(U=(0,u.jsx)(s.default,{style:[c.eyebrow,{color:h.textMuted,fontFamily:h.fontSans}],children:"pushpals operations console"}),n[8]=h.fontSans,n[9]=h.textMuted,n[10]=U):U=n[10];n[11]!==h.fontSans||n[12]!==h.text?(C=(0,u.jsx)(s.default,{style:[c.title,{color:h.text,fontFamily:h.fontSans}],children:"Mission Control"}),n[11]=h.fontSans,n[12]=h.text,n[13]=C):C=n[13];n[14]!==h.fontSans||n[15]!==h.textMuted?(H=(0,u.jsx)(s.default,{style:[c.subtitle,{color:h.textMuted,fontFamily:h.fontSans}],children:"Coordinate your edits with autonomous buddy execution across planning, jobs, and integration in one live board."}),n[14]=h.fontSans,n[15]=h.textMuted,n[16]=H):H=n[16];n[17]!==h.fontSans||n[18]!==h.textMuted?(_=[c.repoLine,{color:h.textMuted,fontFamily:h.fontSans}],n[17]=h.fontSans,n[18]=h.textMuted,n[19]=_):_=n[19];const R=w?h.accent:h.textMuted;let D;n[20]!==R||n[21]!==h.fontMono?(D={color:R,fontFamily:h.fontMono},n[20]=R,n[21]=h.fontMono,n[22]=D):D=n[22];const V=w?c.repoLink:null;let B,$,k,O;n[23]!==V||n[24]!==D?(B=[c.repoValue,D,V],n[23]=V,n[24]=D,n[25]=B):B=n[25];n[26]!==T||n[27]!==w?($=w?()=>{T()}:void 0,n[26]=T,n[27]=w,n[28]=$):$=n[28];n[29]!==L||n[30]!==B||n[31]!==$?(k=(0,u.jsx)(s.default,{style:B,onPress:$,children:L}),n[29]=L,n[30]=B,n[31]=$,n[32]=k):k=n[32];n[33]!==k||n[34]!==_?(O=(0,u.jsxs)(s.default,{style:_,children:["Current repo:"," ",k]}),n[33]=k,n[34]=_,n[35]=O):O=n[35];const P=y?h.accent:h.textMuted;let W,A,I,q,E,G,J;n[36]!==P||n[37]!==h.fontSans?(W=[c.snapshotLine,{color:P,fontFamily:h.fontSans}],n[36]=P,n[37]=h.fontSans,n[38]=W):W=n[38];n[39]!==h.fontMono||n[40]!==h.text?(A=[c.snapshotValue,{color:h.text,fontFamily:h.fontMono}],n[39]=h.fontMono,n[40]=h.text,n[41]=A):A=n[41];n[42]!==z||n[43]!==A?(I=(0,u.jsx)(s.default,{style:A,children:z}),n[42]=z,n[43]=A,n[44]=I):I=n[44];n[45]!==W||n[46]!==I?(q=(0,u.jsxs)(s.default,{style:W,children:["Snapshot:"," ",I]}),n[45]=W,n[46]=I,n[47]=q):q=n[47];n[48]!==O||n[49]!==q||n[50]!==U||n[51]!==C||n[52]!==H?(E=(0,u.jsxs)(l.default,{style:c.headerLeft,children:[U,C,H,O,q]}),n[48]=O,n[49]=q,n[50]=U,n[51]=C,n[52]=H,n[53]=E):E=n[53];n[54]!==p||n[55]!==b||n[56]!==h?(G=(0,u.jsx)(f.ModeSwitcher,{mode:p,onChange:b,theme:h}),n[54]=p,n[55]=b,n[56]=h,n[57]=G):G=n[57];n[58]!==E||n[59]!==G?(J=(0,u.jsxs)(l.default,{style:c.header,children:[E,G]}),n[58]=E,n[59]=G,n[60]=J):J=n[60];return J};var e=r(d[0]);r(d[1]);var o=t(r(d[2])),n=t(r(d[3])),s=t(r(d[4])),l=t(r(d[5])),f=r(d[6]),u=r(d[7]);const c=n.default.create({header:{flexDirection:"row",justifyContent:"space-between",alignItems:"flex-start",paddingHorizontal:20,paddingTop:18,paddingBottom:12},headerLeft:{flex:1,paddingRight:12},eyebrow:{fontSize:11,letterSpacing:1.3,textTransform:"uppercase",marginBottom:4},title:{fontSize:30,fontWeight:"700",marginBottom:2},subtitle:{fontSize:13,lineHeight:19,maxWidth:640},repoLine:{marginTop:6,fontSize:12,lineHeight:17},repoValue:{fontSize:12},repoLink:{textDecorationLine:"underline"},snapshotLine:{marginTop:4,fontSize:12,lineHeight:17},snapshotValue:{fontSize:12}})},1020,[1135,21,396,136,123,310,1021,2]);
|
|
1032
1032
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.ModeSwitcher=function(e){const n=(0,t.c)(14),{mode:u,onChange:b,theme:x}=e;let h;n[0]===Symbol.for("react.memo_cache_sentinel")?(h=["auto","light","dark"],n[0]=h):h=n[0];const S=h;let p,y,_;n[1]!==x.border||n[2]!==x.panelAlt?(p=[f.modeWrap,{borderColor:x.border,backgroundColor:x.panelAlt}],n[1]=x.border,n[2]=x.panelAlt,n[3]=p):p=n[3];n[4]!==u||n[5]!==b||n[6]!==x.accentSoft||n[7]!==x.accentText||n[8]!==x.fontSans||n[9]!==x.textMuted?(y=S.map(e=>{const t=u===e;return(0,s.jsx)(o.default,{style:[f.modeBtn,t&&{backgroundColor:x.accentSoft}],onPress:()=>b(e),accessibilityRole:"button",accessibilityLabel:`Set theme mode to ${e}`,accessibilityState:{selected:t},children:(0,s.jsx)(l.default,{style:[f.modeText,{color:t?x.accentText:x.textMuted,fontFamily:x.fontSans}],children:e})},e)}),n[4]=u,n[5]=b,n[6]=x.accentSoft,n[7]=x.accentText,n[8]=x.fontSans,n[9]=x.textMuted,n[10]=y):y=n[10];n[11]!==p||n[12]!==y?(_=(0,s.jsx)(c.default,{style:p,children:y}),n[11]=p,n[12]=y,n[13]=_):_=n[13];return _};var t=r(d[0]);r(d[1]);var o=e(r(d[2])),n=e(r(d[3])),l=e(r(d[4])),c=e(r(d[5])),s=r(d[6]);const f=n.default.create({modeWrap:{flexDirection:"row",borderWidth:1,borderRadius:12,overflow:"hidden",alignSelf:"flex-start"},modeBtn:{paddingHorizontal:10,paddingVertical:7},modeText:{fontSize:12,fontWeight:"600",textTransform:"capitalize"}})},1021,[1135,21,417,136,123,310,2]);
|
|
1033
1033
|
__d(function(g,r,i,a,m,_e,d){"use strict";function e(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(_e,'__esModule',{value:!0}),_e.DashboardMetrics=function(e){const n=(0,t.c)(29),{theme:u,connected:v,totalEvents:f,pendingRequests:p,pendingJobs:h,onlineWorkers:b,busyWorkers:j,lastRefresh:x,formatRelativeTime:M,formatAbsoluteTime:w}=e,T=p+h,_=v?"Live":"Disconnected",y=`${f} events`,R=v?"positive":"danger";let W;n[0]!==_||n[1]!==y||n[2]!==R||n[3]!==u?(W=(0,l.jsx)(s.MetricTile,{title:"Connection",value:_,detail:y,tone:R,theme:u}),n[0]=_,n[1]=y,n[2]=R,n[3]=u,n[4]=W):W=n[4];const k=String(T),$=`${p} requests | ${h} jobs`,D=T>0?"warning":"positive";let S;n[5]!==k||n[6]!==$||n[7]!==D||n[8]!==u?(S=(0,l.jsx)(s.MetricTile,{title:"Pending Work",value:k,detail:$,tone:D,theme:u}),n[5]=k,n[6]=$,n[7]=D,n[8]=u,n[9]=S):S=n[9];const q=String(b),A=`${j} busy`;let L,P,z,B,C;n[10]!==A||n[11]!==q||n[12]!==u?(L=(0,l.jsx)(s.MetricTile,{title:"Active Workers",value:q,detail:A,theme:u}),n[10]=A,n[11]=q,n[12]=u,n[13]=L):L=n[13];n[14]!==M||n[15]!==x?(P=x?M(x):"--",n[14]=M,n[15]=x,n[16]=P):P=n[16];n[17]!==w||n[18]!==x?(z=x?w(x):"waiting",n[17]=w,n[18]=x,n[19]=z):z=n[19];n[20]!==P||n[21]!==z||n[22]!==u?(B=(0,l.jsx)(s.MetricTile,{title:"Last Sync",value:P,detail:z,theme:u}),n[20]=P,n[21]=z,n[22]=u,n[23]=B):B=n[23];n[24]!==L||n[25]!==B||n[26]!==W||n[27]!==S?(C=(0,l.jsxs)(o.default,{style:c.metricRow,children:[W,S,L,B]}),n[24]=L,n[25]=B,n[26]=W,n[27]=S,n[28]=C):C=n[28];return C};var t=r(d[0]);r(d[1]);var n=e(r(d[2])),o=e(r(d[3])),s=r(d[4]),l=r(d[5]);const c=n.default.create({metricRow:{flexDirection:"row",flexWrap:"wrap",paddingHorizontal:20,paddingBottom:10}})},1022,[1135,21,136,310,1015,2]);
|
package/monitor-ui/_sitemap.html
CHANGED
|
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
|
|
|
435
435
|
@keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
|
|
436
436
|
@keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
|
|
437
437
|
@keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
|
|
438
|
-
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-
|
|
438
|
+
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"></div></div><script src="/_expo/static/js/web/entry-ff425ab85ad13c1920b8ee00abfae7dd.js" defer></script>
|
|
439
439
|
</body></html>
|
package/monitor-ui/index.html
CHANGED
|
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
|
|
|
435
435
|
@keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
|
|
436
436
|
@keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
|
|
437
437
|
@keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
|
|
438
|
-
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-13awgt0" style="background-color:rgba(236,242,245,1.00)"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-15zx4ds r-a4e7m4 r-j33s3c r-1ovo9ad" style="background-color:rgba(0,126,119,0.13)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-5fjp4n r-9s5a0n r-1hy2ut r-9dcw1g" style="background-color:rgba(199,133,30,0.09)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-1iuttuq r-pbsvq8 r-1b0pg27 r-1sxiqef" style="background-color:rgba(22,154,88,0.09)"></div><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-16y2uox r-2llsf r-kzbkwu"><div class="css-g5y9jx r-16uyjmq r-rs99b7 r-13awgt0 r-hv52eu r-ifefl9 r-1udh08x" style="background-color:rgba(247,250,252,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);opacity:0;transform:translateY(18px)"><div class="css-g5y9jx r-1habvwh r-18u37iz r-1wtj0ep r-kzbkwu r-u9wvl5 r-131miar"><div class="css-g5y9jx r-13awgt0 r-j2kj52"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1q67n59 r-15zivkp r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">pushpals operations console</div><div dir="auto" class="css-146c3p1 r-1ra0lkn r-b88u0q r-zl2h9q" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Mission Control</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo r-1cmskyw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Coordinate your edits with autonomous buddy execution across planning, jobs, and integration in one live board.</div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-kc8jnq" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Current repo:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(84,112,134,1.00);font-family:'IBM Plex Mono', 'JetBrains Mono', monospace">unavailable</span></div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-14gqq1x" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Snapshot:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(17,34,48,1.00);font-family:'IBM Plex Mono', 'JetBrains Mono', monospace">waiting for /system/status</span></div></div><div class="css-g5y9jx r-k200y r-1q9bdsx r-rs99b7 r-18u37iz r-1udh08x" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><button aria-label="Set theme mode to auto" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" style="background-color:rgba(217,244,241,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(2,92,86,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">auto</div></button><button aria-label="Set theme mode to light" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">light</div></button><button aria-label="Set theme mode to dark" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">dark</div></button></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-15d164r r-bhtmuz r-ytbthy r-1ubuhtd" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><div class="css-g5y9jx r-150rngu r-18u37iz r-16y2uox r-1wbh5a2 r-lltvgl r-buy8e9 r-agouwx r-2eszeu"><div class="css-g5y9jx r-18u37iz"><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(199,133,30,0.40);border-right-color:rgba(199,133,30,0.40);border-bottom-color:rgba(199,133,30,0.40);border-left-color:rgba(199,133,30,0.40);background-color:rgba(199,133,30,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(199,133,30,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">1. You</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Awaiting input</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">2. Session</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Ready</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">3. RemoteBuddy</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 pending, 0 claimed</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">4. WorkerPals</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 online, 0 busy, 0 queued</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">5. SCM</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 ready, 0 pending</div></div></div></div></div></div><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o r-u9wvl5"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Connection</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(214,69,83,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Disconnected</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 events</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Pending Work</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 requests | 0 jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Active Workers</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 busy</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Last Sync</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">--</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">waiting</div></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-18u37iz r-15d164r r-bhtmuz r-146eth8" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><button aria-label="Coordination tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" style="background-color:rgba(0,126,119,1.00);border-top-color:rgba(0,126,119,1.00);border-right-color:rgba(0,126,119,1.00);border-bottom-color:rgba(0,126,119,1.00);border-left-color:rgba(0,126,119,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(255,255,255,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Coordination<!-- --> (0)</div></button><button aria-label="Chat tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Chat<!-- --> (0)</div></button><button aria-label="Requests tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Requests<!-- --> (0)</div></button><button aria-label="Jobs & Traces tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Jobs & Traces<!-- --> (0)</div></button><button aria-label="System tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">System<!-- --> (0)</div></button><button aria-label="Config tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Config</div></button></div><div class="css-g5y9jx r-13awgt0 r-ifefl9" style="opacity:1;transform:translateY(0px)"><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-1t2hasf r-u9wvl5"><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Ready For Review</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 processed completions</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Active Handoffs</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 running jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Awaiting Remote</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 pending requests</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Blocked</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 failed jobs</div></div></div><div class="css-g5y9jx r-eqz5dr"><div class="css-g5y9jx r-1867qdf r-rs99b7 r-k3250r r-15d164r r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1wtj0ep"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Change Coordination Board</div><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1g94qm0" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0<!-- --> latest requests</div></div><div class="css-g5y9jx r-1habvwh r-1867qdf r-nsbfu8"><div dir="auto" class="css-146c3p1 r-1i10wst r-b88u0q r-15zivkp" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Nothing to coordinate yet</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Send a task from chat and this board will trace the full handoff from request to integration.</div></div></div><div class="css-g5y9jx r-1867qdf r-rs99b7 r-jprt8p r-15d164r r-11wrixw r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Review Queue</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">No processed completions yet.</div><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif;margin-top:14px">Needs Attention</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">No failed coordination chains.</div></div></div></div></div></div></div></div></div></div></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-e66b4de45f75e702ac16916082bcc9a5.js" defer></script>
|
|
438
|
+
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-13awgt0" style="background-color:rgba(236,242,245,1.00)"><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-15zx4ds r-a4e7m4 r-j33s3c r-1ovo9ad" style="background-color:rgba(0,126,119,0.13)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-5fjp4n r-9s5a0n r-1hy2ut r-9dcw1g" style="background-color:rgba(199,133,30,0.09)"></div><div class="css-g5y9jx r-cpet4d r-u8s1d r-g7s1ez r-1iuttuq r-pbsvq8 r-1b0pg27 r-1sxiqef" style="background-color:rgba(22,154,88,0.09)"></div><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-16y2uox r-2llsf r-kzbkwu"><div class="css-g5y9jx r-16uyjmq r-rs99b7 r-13awgt0 r-hv52eu r-ifefl9 r-1udh08x" style="background-color:rgba(247,250,252,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);opacity:0;transform:translateY(18px)"><div class="css-g5y9jx r-1habvwh r-18u37iz r-1wtj0ep r-kzbkwu r-u9wvl5 r-131miar"><div class="css-g5y9jx r-13awgt0 r-j2kj52"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1q67n59 r-15zivkp r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">pushpals operations console</div><div dir="auto" class="css-146c3p1 r-1ra0lkn r-b88u0q r-zl2h9q" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Mission Control</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo r-1cmskyw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Coordinate your edits with autonomous buddy execution across planning, jobs, and integration in one live board.</div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-kc8jnq" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Current repo:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(84,112,134,1.00);font-family:'IBM Plex Mono', 'JetBrains Mono', monospace">unavailable</span></div><div dir="auto" class="css-146c3p1 r-1enofrn r-5fcqz0 r-14gqq1x" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Snapshot:<!-- --> <span class="css-1jxf684 r-1enofrn" style="color:rgba(17,34,48,1.00);font-family:'IBM Plex Mono', 'JetBrains Mono', monospace">waiting for /system/status</span></div></div><div class="css-g5y9jx r-k200y r-1q9bdsx r-rs99b7 r-18u37iz r-1udh08x" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><button aria-label="Set theme mode to auto" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" style="background-color:rgba(217,244,241,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(2,92,86,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">auto</div></button><button aria-label="Set theme mode to light" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">light</div></button><button aria-label="Set theme mode to dark" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1yd117h r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-1enofrn r-1kfrs79 r-1ozqkpa" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">dark</div></button></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-15d164r r-bhtmuz r-ytbthy r-1ubuhtd" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><div class="css-g5y9jx r-150rngu r-18u37iz r-16y2uox r-1wbh5a2 r-lltvgl r-buy8e9 r-agouwx r-2eszeu"><div class="css-g5y9jx r-18u37iz"><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(199,133,30,0.40);border-right-color:rgba(199,133,30,0.40);border-bottom-color:rgba(199,133,30,0.40);border-left-color:rgba(199,133,30,0.40);background-color:rgba(199,133,30,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(199,133,30,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">1. You</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Awaiting input</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">2. Session</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Ready</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">3. RemoteBuddy</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 pending, 0 claimed</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(22,154,88,0.40);border-right-color:rgba(22,154,88,0.40);border-bottom-color:rgba(22,154,88,0.40);border-left-color:rgba(22,154,88,0.40);background-color:rgba(22,154,88,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">4. WorkerPals</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 online, 0 busy, 0 queued</div></div><div class="css-g5y9jx r-109y4c4 r-8dgmk1 r-12ym1je" style="background-color:rgba(207,218,226,0.80)"></div></div><div class="css-g5y9jx r-1awozwy r-18u37iz"><div class="css-g5y9jx r-1q9bdsx r-rs99b7 r-1s5swlz r-1ubuhtd r-13i4ljo" style="border-top-color:rgba(0,126,119,0.40);border-right-color:rgba(0,126,119,0.40);border-bottom-color:rgba(0,126,119,0.40);border-left-color:rgba(0,126,119,0.40);background-color:rgba(0,126,119,0.09)"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1gkfh8e r-b88u0q r-1dpkw9 r-tsynxw" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">5. SCM</div><div dir="auto" class="css-146c3p1 r-8akbws r-krxsd3 r-dnmrzs r-1qsk4np r-1udbk01 r-1enofrn r-1cwl3u0 r-14gqq1x" style="-webkit-line-clamp:2;color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 ready, 0 pending</div></div></div></div></div></div><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o r-u9wvl5"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Connection</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(214,69,83,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Disconnected</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 events</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Pending Work</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 requests | 0 jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Active Workers</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 busy</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Last Sync</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">--</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">waiting</div></div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-18u37iz r-15d164r r-bhtmuz r-146eth8" style="background-color:rgba(244,248,251,1.00);border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00)"><button aria-label="Coordination tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" style="background-color:rgba(0,126,119,1.00);border-top-color:rgba(0,126,119,1.00);border-right-color:rgba(0,126,119,1.00);border-bottom-color:rgba(0,126,119,1.00);border-left-color:rgba(0,126,119,1.00)" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(255,255,255,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Coordination<!-- --> (0)</div></button><button aria-label="Chat tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Chat<!-- --> (0)</div></button><button aria-label="Requests tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Requests<!-- --> (0)</div></button><button aria-label="Jobs & Traces tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Jobs & Traces<!-- --> (0)</div></button><button aria-label="System tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">System<!-- --> (0)</div></button><button aria-label="Config tab" role="button" tabindex="0" class="css-g5y9jx r-1loqt21 r-1otgn73 r-1awozwy r-42olwf r-1dzdj1l r-rs99b7 r-13awgt0 r-1777fci r-11f147o r-1ubuhtd" type="button"><div dir="auto" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1enofrn r-b88u0q" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Config</div></button></div><div class="css-g5y9jx r-13awgt0 r-ifefl9" style="opacity:1;transform:translateY(0px)"><div class="css-g5y9jx r-150rngu r-eqz5dr r-16y2uox r-1wbh5a2 r-11yh6sk r-1rnoaur r-agouwx r-13awgt0"><div class="css-g5y9jx r-1t2hasf r-u9wvl5"><div class="css-g5y9jx r-18u37iz r-1w6e6rj r-1mi0q7o"><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Ready For Review</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 processed completions</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Active Handoffs</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(0,126,119,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 running jobs</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Awaiting Remote</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 pending requests</div></div><div class="css-g5y9jx r-t23y2h r-rs99b7 r-16y2uox r-5oul0u r-1kb76zh r-bgnin r-ytbthy r-3o4zer" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(244,248,251,1.00)"><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1cm7zt9 r-tsynxw" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Blocked</div><div dir="auto" class="css-146c3p1 r-evnaw r-b88u0q r-19qrga8" style="color:rgba(22,154,88,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0</div><div dir="auto" class="css-146c3p1 r-1enofrn r-19qrga8" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0 failed jobs</div></div></div><div class="css-g5y9jx r-eqz5dr"><div class="css-g5y9jx r-1867qdf r-rs99b7 r-k3250r r-15d164r r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1wtj0ep"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Change Coordination Board</div><div dir="auto" class="css-146c3p1 r-1gkfh8e r-1g94qm0" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">0<!-- --> latest requests</div></div><div class="css-g5y9jx r-1habvwh r-1867qdf r-nsbfu8"><div dir="auto" class="css-146c3p1 r-1i10wst r-b88u0q r-15zivkp" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Nothing to coordinate yet</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Send a task from chat and this board will trace the full handoff from request to integration.</div></div></div><div class="css-g5y9jx r-1867qdf r-rs99b7 r-jprt8p r-15d164r r-11wrixw r-xyw6el" style="border-top-color:rgba(207,218,226,1.00);border-right-color:rgba(207,218,226,1.00);border-bottom-color:rgba(207,218,226,1.00);border-left-color:rgba(207,218,226,1.00);background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">Review Queue</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">No processed completions yet.</div><div dir="auto" class="css-146c3p1 r-ubezar r-b88u0q r-5oul0u" style="color:rgba(17,34,48,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif;margin-top:14px">Needs Attention</div><div dir="auto" class="css-146c3p1 r-n6v787 r-hjklzo" style="color:rgba(84,112,134,1.00);font-family:'Space Grotesk', 'Avenir Next', 'Trebuchet MS', sans-serif">No failed coordination chains.</div></div></div></div></div></div></div></div></div></div></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-ff425ab85ad13c1920b8ee00abfae7dd.js" defer></script>
|
|
439
439
|
</body></html>
|
package/monitor-ui/modal.html
CHANGED
|
@@ -435,5 +435,5 @@ input::-webkit-search-cancel-button,input::-webkit-search-decoration,input::-web
|
|
|
435
435
|
@keyframes r-1pzkwqh{0%{transform:translateY(100%);}100%{transform:translateY(0%);}}
|
|
436
436
|
@keyframes r-imtty0{0%{opacity:0;}100%{opacity:1;}}
|
|
437
437
|
@keyframes r-q67da2{0%{transform:translateX(-100%);}100%{transform:translateX(400%);}}
|
|
438
|
-
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-184en5c r-12vffkv"><div class="css-g5y9jx r-12vffkv" style="height:64px"><div class="css-g5y9jx r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af r-12vffkv"><div class="css-g5y9jx r-qklmqi r-13awgt0 r-105ug2t" style="background-color:rgba(255,255,255,1.00);border-bottom-color:rgba(216,216,216,1.00)"></div></div><div class="css-g5y9jx r-633pao" style="height:0px"></div><div class="css-g5y9jx r-1oszu61 r-13awgt0 r-18u37iz r-12vffkv"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1h0z5md r-12vffkv" style="margin-left:0px"></div><div class="css-g5y9jx r-1777fci r-12vffkv" style="max-width:-32px;margin-right:16px;margin-left:16px"><h1 dir="auto" aria-level="1" role="heading" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1i10wst" style="color:rgba(28,28,30,1.00);font-family:system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-weight:500">Modal</h1></div><div class="css-g5y9jx r-1awozwy r-18u37iz r-17s6mgv r-1iusvr4 r-16y2uox r-12vffkv" style="margin-right:0px"></div></div></div></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-1awozwy r-13awgt0 r-1777fci r-1pcd2l5" style="background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-1ui5ee8 r-vw2c0b r-37tt59" style="color:rgba(17,24,28,1.00)">This is a modal</div><a href="/" dir="auto" role="link" class="css-146c3p1 r-19h5ruw r-1d7mnkm r-1loqt21"><span class="css-1jxf684 r-1v78gzs r-ubezar r-17rnw9f">Go to home screen</span></a></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-
|
|
438
|
+
@keyframes r-t2lo5v{0%{opacity:1;}100%{opacity:0;}}</style><script type="module">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script><link rel="icon" href="/favicon.ico" /></head><body><div id="root"><div class="css-g5y9jx r-13awgt0"><!--$--><div style="position:absolute;left:0;right:0;top:0;bottom:0;pointer-events:none;visibility:hidden"></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0 r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af" style="background-color:rgba(242,242,242,1.00);display:flex"><div class="css-g5y9jx r-184en5c r-12vffkv"><div class="css-g5y9jx r-12vffkv" style="height:64px"><div class="css-g5y9jx r-1p0dtai r-1d2f490 r-u8s1d r-zchlnj r-ipm5af r-12vffkv"><div class="css-g5y9jx r-qklmqi r-13awgt0 r-105ug2t" style="background-color:rgba(255,255,255,1.00);border-bottom-color:rgba(216,216,216,1.00)"></div></div><div class="css-g5y9jx r-633pao" style="height:0px"></div><div class="css-g5y9jx r-1oszu61 r-13awgt0 r-18u37iz r-12vffkv"><div class="css-g5y9jx r-1awozwy r-18u37iz r-1h0z5md r-12vffkv" style="margin-left:0px"></div><div class="css-g5y9jx r-1777fci r-12vffkv" style="max-width:-32px;margin-right:16px;margin-left:16px"><h1 dir="auto" aria-level="1" role="heading" class="css-146c3p1 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-1iln25a r-1i10wst" style="color:rgba(28,28,30,1.00);font-family:system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-weight:500">Modal</h1></div><div class="css-g5y9jx r-1awozwy r-18u37iz r-17s6mgv r-1iusvr4 r-16y2uox r-12vffkv" style="margin-right:0px"></div></div></div></div><div class="css-g5y9jx r-13awgt0"><div class="css-g5y9jx r-13awgt0"><!--$--><div class="css-g5y9jx r-1awozwy r-13awgt0 r-1777fci r-1pcd2l5" style="background-color:rgba(255,255,255,1.00)"><div dir="auto" class="css-146c3p1 r-1ui5ee8 r-vw2c0b r-37tt59" style="color:rgba(17,24,28,1.00)">This is a modal</div><a href="/" dir="auto" role="link" class="css-146c3p1 r-19h5ruw r-1d7mnkm r-1loqt21"><span class="css-1jxf684 r-1v78gzs r-ubezar r-17rnw9f">Go to home screen</span></a></div><!--/$--></div></div></div></div><!--/$--></div></div><script src="/_expo/static/js/web/entry-ff425ab85ad13c1920b8ee00abfae7dd.js" defer></script>
|
|
439
439
|
</body></html>
|
package/package.json
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
Suggested starting points:
|
|
2
2
|
{{targets_block}}
|
|
@@ -8415,7 +8415,7 @@ function buildExecutionGuidance(plan, targetPaths, requiredValidationSteps = [])
|
|
|
8415
8415
|
const lines = [];
|
|
8416
8416
|
const targets = normalizePathHints(targetPaths.length > 0 ? targetPaths : plan.scope.write_globs ?? []);
|
|
8417
8417
|
if (targets.length > 0) {
|
|
8418
|
-
lines.push("
|
|
8418
|
+
lines.push("Suggested starting points:");
|
|
8419
8419
|
for (const path of targets)
|
|
8420
8420
|
lines.push(`- ${path}`);
|
|
8421
8421
|
lines.push("Path handling:");
|
|
@@ -1432,6 +1432,37 @@ def _merge_usage_records(first: Any, second: Any) -> Dict[str, Any]:
|
|
|
1432
1432
|
return merged
|
|
1433
1433
|
|
|
1434
1434
|
|
|
1435
|
+
def _codex_changed_paths(repo: str, baseline_snapshot: List[str]) -> Tuple[List[str], List[str], List[str]]:
|
|
1436
|
+
changed_paths = summarize_git_changes(repo)
|
|
1437
|
+
delta = [p for p in changed_paths if p not in baseline_snapshot]
|
|
1438
|
+
effective = delta if delta else changed_paths
|
|
1439
|
+
return changed_paths, delta, effective
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
def _build_success_stdout(
|
|
1443
|
+
*,
|
|
1444
|
+
effective_paths: List[str],
|
|
1445
|
+
last_message: str,
|
|
1446
|
+
trace_excerpt: str,
|
|
1447
|
+
prefix: str = "",
|
|
1448
|
+
) -> str:
|
|
1449
|
+
stdout_parts: List[str] = []
|
|
1450
|
+
if prefix.strip():
|
|
1451
|
+
stdout_parts.append(prefix.strip())
|
|
1452
|
+
if last_message:
|
|
1453
|
+
stdout_parts.append(last_message)
|
|
1454
|
+
elif trace_excerpt:
|
|
1455
|
+
stdout_parts.append(trace_excerpt)
|
|
1456
|
+
if effective_paths:
|
|
1457
|
+
listed = "\n".join(f"- {path}" for path in effective_paths[:40])
|
|
1458
|
+
if len(effective_paths) > 40:
|
|
1459
|
+
listed += "\n- ..."
|
|
1460
|
+
stdout_parts.append(f"Changed files:\n{listed}")
|
|
1461
|
+
if not stdout_parts:
|
|
1462
|
+
stdout_parts.append("No modified files were detected after execution.")
|
|
1463
|
+
return "\n\n".join(stdout_parts)
|
|
1464
|
+
|
|
1465
|
+
|
|
1435
1466
|
def _augment_supplemental_guidance(supplemental_guidance: List[str]) -> List[str]:
|
|
1436
1467
|
normalized = [str(item or "").strip() for item in supplemental_guidance if str(item or "").strip()]
|
|
1437
1468
|
joined = "\n".join(normalized).lower()
|
|
@@ -1854,6 +1885,60 @@ def _run_codex_task(
|
|
|
1854
1885
|
log_git_status(repo, log)
|
|
1855
1886
|
|
|
1856
1887
|
if command_policy_rejection_loop:
|
|
1888
|
+
_, _, effective_paths = _codex_changed_paths(repo, baseline_snapshot)
|
|
1889
|
+
if effective_paths:
|
|
1890
|
+
policy_signal = _detect_codex_workaround_signal(last_message)
|
|
1891
|
+
if not policy_signal and not last_message.strip():
|
|
1892
|
+
policy_signal = _detect_codex_workaround_signal(stdout)
|
|
1893
|
+
if policy_signal:
|
|
1894
|
+
detail = (
|
|
1895
|
+
"Codex CLI is mandatory in this backend, but worker output suggests a workaround "
|
|
1896
|
+
f"instead of hard-failing: {policy_signal!r}. "
|
|
1897
|
+
"Return an explicit failure if Codex auth/execution is unavailable."
|
|
1898
|
+
)
|
|
1899
|
+
if last_message:
|
|
1900
|
+
detail = f"{detail}\nLast assistant message:\n{last_message}"
|
|
1901
|
+
if trace_excerpt:
|
|
1902
|
+
detail = f"{detail}\n{trace_excerpt}"
|
|
1903
|
+
return {
|
|
1904
|
+
"ok": False,
|
|
1905
|
+
"summary": "openai_codex policy violation: Codex CLI workaround detected",
|
|
1906
|
+
"stdout": _truncate(stdout),
|
|
1907
|
+
"stderr": _truncate(detail),
|
|
1908
|
+
"exitCode": 5,
|
|
1909
|
+
"usage": usage,
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
command_lines = (
|
|
1913
|
+
"\n".join(f"- {command}" for command in rejected_shell_wrappers[:6])
|
|
1914
|
+
if rejected_shell_wrappers
|
|
1915
|
+
else "- (no command details captured)"
|
|
1916
|
+
)
|
|
1917
|
+
log.warning(
|
|
1918
|
+
"Codex hit a shell-wrapper rejection loop after producing file changes; "
|
|
1919
|
+
"returning the patch to QualityGate instead of spending another Codex retry."
|
|
1920
|
+
)
|
|
1921
|
+
return {
|
|
1922
|
+
"ok": True,
|
|
1923
|
+
"summary": (
|
|
1924
|
+
"Executed task and modified "
|
|
1925
|
+
f"{len(effective_paths)} file(s) before shell-wrapper command rejections"
|
|
1926
|
+
),
|
|
1927
|
+
"stdout": _build_success_stdout(
|
|
1928
|
+
effective_paths=effective_paths,
|
|
1929
|
+
last_message=last_message,
|
|
1930
|
+
trace_excerpt=trace_excerpt,
|
|
1931
|
+
prefix=(
|
|
1932
|
+
"Codex produced file changes before hitting command-router shell-wrapper "
|
|
1933
|
+
"rejections. The patch is being handed to ValidationGate/CriticGate for "
|
|
1934
|
+
f"normal repair instead of restarting Codex.\nRejected commands:\n{command_lines}"
|
|
1935
|
+
),
|
|
1936
|
+
),
|
|
1937
|
+
"stderr": "",
|
|
1938
|
+
"exitCode": 0,
|
|
1939
|
+
"usage": usage,
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1857
1942
|
if wrapper_recovery_attempt < _MAX_WRAPPER_RECOVERY_ATTEMPTS:
|
|
1858
1943
|
hard_recovery = wrapper_recovery_attempt >= 1
|
|
1859
1944
|
recovery_guidance = _build_wrapper_recovery_guidance(
|
|
@@ -2018,34 +2103,29 @@ def _run_codex_task(
|
|
|
2018
2103
|
"usage": usage,
|
|
2019
2104
|
}
|
|
2020
2105
|
|
|
2021
|
-
|
|
2022
|
-
delta = [p for p in changed_paths if p not in baseline_snapshot]
|
|
2023
|
-
effective = delta if delta else changed_paths
|
|
2024
|
-
stdout_parts: List[str] = []
|
|
2025
|
-
if last_message:
|
|
2026
|
-
stdout_parts.append(last_message)
|
|
2027
|
-
elif trace_excerpt:
|
|
2028
|
-
stdout_parts.append(trace_excerpt)
|
|
2106
|
+
_, _, effective = _codex_changed_paths(repo, baseline_snapshot)
|
|
2029
2107
|
if effective:
|
|
2030
|
-
listed = "\n".join(f"- {path}" for path in effective[:40])
|
|
2031
|
-
if len(effective) > 40:
|
|
2032
|
-
listed += "\n- ..."
|
|
2033
|
-
stdout_parts.append(f"Changed files:\n{listed}")
|
|
2034
2108
|
return {
|
|
2035
2109
|
"ok": True,
|
|
2036
2110
|
"summary": f"Executed task and modified {len(effective)} file(s)",
|
|
2037
|
-
"stdout":
|
|
2111
|
+
"stdout": _build_success_stdout(
|
|
2112
|
+
effective_paths=effective,
|
|
2113
|
+
last_message=last_message,
|
|
2114
|
+
trace_excerpt=trace_excerpt,
|
|
2115
|
+
),
|
|
2038
2116
|
"stderr": "",
|
|
2039
2117
|
"exitCode": 0,
|
|
2040
2118
|
"usage": usage,
|
|
2041
2119
|
}
|
|
2042
2120
|
|
|
2043
|
-
if not stdout_parts:
|
|
2044
|
-
stdout_parts.append("No modified files were detected after execution.")
|
|
2045
2121
|
return {
|
|
2046
2122
|
"ok": True,
|
|
2047
2123
|
"summary": "Executed task via openai_codex (no file changes detected)",
|
|
2048
|
-
"stdout":
|
|
2124
|
+
"stdout": _build_success_stdout(
|
|
2125
|
+
effective_paths=[],
|
|
2126
|
+
last_message=last_message,
|
|
2127
|
+
trace_excerpt=trace_excerpt,
|
|
2128
|
+
),
|
|
2049
2129
|
"stderr": "",
|
|
2050
2130
|
"exitCode": 0,
|
|
2051
2131
|
"usage": usage,
|
|
@@ -450,6 +450,79 @@ class OpenAICodexRuntimeConfigTests(unittest.TestCase):
|
|
|
450
450
|
self.assertIn("# wrapper bootstrap test", guidance)
|
|
451
451
|
self.assertNotIn("git diff --output=leak.txt", guidance)
|
|
452
452
|
|
|
453
|
+
def test_run_codex_task_hands_changed_worktree_to_gates_after_wrapper_loop(self) -> None:
|
|
454
|
+
with tempfile.TemporaryDirectory(prefix="pushpals-codex-wrapper-changed-") as temp_dir:
|
|
455
|
+
repo = Path(temp_dir) / "repo"
|
|
456
|
+
repo.mkdir(parents=True, exist_ok=True)
|
|
457
|
+
(repo / "README.md").write_text("# wrapper changed test\n", encoding="utf-8")
|
|
458
|
+
subprocess.run(["git", "init"], cwd=repo, check=True, capture_output=True, text=True)
|
|
459
|
+
subprocess.run(
|
|
460
|
+
["git", "config", "user.name", "PushPals Test"],
|
|
461
|
+
cwd=repo,
|
|
462
|
+
check=True,
|
|
463
|
+
capture_output=True,
|
|
464
|
+
text=True,
|
|
465
|
+
)
|
|
466
|
+
subprocess.run(
|
|
467
|
+
["git", "config", "user.email", "pushpals-tests@example.com"],
|
|
468
|
+
cwd=repo,
|
|
469
|
+
check=True,
|
|
470
|
+
capture_output=True,
|
|
471
|
+
text=True,
|
|
472
|
+
)
|
|
473
|
+
subprocess.run(["git", "add", "README.md"], cwd=repo, check=True, capture_output=True, text=True)
|
|
474
|
+
subprocess.run(
|
|
475
|
+
["git", "commit", "-m", "chore: seed wrapper changed repo"],
|
|
476
|
+
cwd=repo,
|
|
477
|
+
check=True,
|
|
478
|
+
capture_output=True,
|
|
479
|
+
text=True,
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
stub_path = Path(temp_dir) / "fake_codex_wrapper_changed.py"
|
|
483
|
+
stub_path.write_text(
|
|
484
|
+
"\n".join(
|
|
485
|
+
[
|
|
486
|
+
"from pathlib import Path",
|
|
487
|
+
"import sys",
|
|
488
|
+
"import time",
|
|
489
|
+
"",
|
|
490
|
+
"sys.stdin.read()",
|
|
491
|
+
"Path('src').mkdir(exist_ok=True)",
|
|
492
|
+
"Path('src/change.txt').write_text('changed before wrapper loop\\n', encoding='utf-8')",
|
|
493
|
+
"for line in (",
|
|
494
|
+
" 'error=exec_command failed for `/bin/bash -lc pwd`: CreateProcess { message: \"Rejected\" }',",
|
|
495
|
+
" 'error=exec_command failed for `/bin/bash -lc \\'git status --porcelain\\'`: CreateProcess { message: \"Rejected\" }',",
|
|
496
|
+
" 'error=exec_command failed for `/bin/bash -lc \\'sed -n 1,40p README.md\\'`: CreateProcess { message: \"Rejected\" }',",
|
|
497
|
+
"):",
|
|
498
|
+
" print(line, file=sys.stderr, flush=True)",
|
|
499
|
+
"time.sleep(10)",
|
|
500
|
+
]
|
|
501
|
+
),
|
|
502
|
+
encoding="utf-8",
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
env_overrides = {
|
|
506
|
+
"PUSHPALS_OPENAI_CODEX_BIN_JSON": json.dumps([sys.executable, str(stub_path)]),
|
|
507
|
+
"PUSHPALS_OPENAI_CODEX_AUTH_MODE": "api_key",
|
|
508
|
+
"OPENAI_API_KEY": "pushpals-wrapper-changed-test-key",
|
|
509
|
+
"WORKERPALS_OPENAI_CODEX_TIMEOUT_S": "10",
|
|
510
|
+
"WORKERPALS_OPENAI_CODEX_PROGRESS_LOG_INTERVAL_S": "1",
|
|
511
|
+
}
|
|
512
|
+
with mock.patch.dict(os.environ, env_overrides, clear=False):
|
|
513
|
+
result = _run_codex_task(
|
|
514
|
+
str(repo),
|
|
515
|
+
"Create a small file and inspect the repo.",
|
|
516
|
+
[],
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
self.assertTrue(result.get("ok"), result)
|
|
520
|
+
self.assertEqual(result.get("exitCode"), 0)
|
|
521
|
+
self.assertIn("before shell-wrapper command rejections", str(result.get("summary") or ""))
|
|
522
|
+
self.assertIn("ValidationGate/CriticGate", str(result.get("stdout") or ""))
|
|
523
|
+
self.assertIn("src/", str(result.get("stdout") or ""))
|
|
524
|
+
self.assertNotIn("Recovered after Codex attempts", str(result.get("stdout") or ""))
|
|
525
|
+
|
|
453
526
|
def test_run_codex_task_escalates_wrapper_recovery_and_recovers(self) -> None:
|
|
454
527
|
with tempfile.TemporaryDirectory(prefix="pushpals-codex-wrapper-recovery-") as temp_dir:
|
|
455
528
|
repo = Path(temp_dir) / "repo"
|
|
@@ -351,11 +351,11 @@ def _build_path_handling_message(target_paths: List[str], repo: str) -> str:
|
|
|
351
351
|
"- The current working directory is the repository root.\n"
|
|
352
352
|
"- Prefer the repo-relative paths for shell commands.\n"
|
|
353
353
|
"- If FileEditor rejects a repo-relative path, retry with the matching absolute path.\n"
|
|
354
|
-
"-
|
|
354
|
+
"- Start with these concrete paths before broad scans; expand discovery when the behavior lives elsewhere.\n"
|
|
355
355
|
"- These paths are starting points, not hard write boundaries; edit other behavior-owning files when needed and explain why.\n"
|
|
356
|
-
"
|
|
356
|
+
"Suggested starting points (repo-relative):\n"
|
|
357
357
|
f"{listed_rel}\n"
|
|
358
|
-
"
|
|
358
|
+
"Suggested starting points (absolute):\n"
|
|
359
359
|
f"{listed_abs}"
|
|
360
360
|
)
|
|
361
361
|
|
|
@@ -763,6 +763,7 @@ function captureValidationStream(
|
|
|
763
763
|
}
|
|
764
764
|
|
|
765
765
|
const DEFAULT_BROWSER_VALIDATION_FAILURE_IDLE_MS = 15_000;
|
|
766
|
+
const DEFAULT_BROWSER_VALIDATION_SUCCESS_IDLE_MS = 1_000;
|
|
766
767
|
|
|
767
768
|
function browserValidationFailureIdleMs(env: Record<string, string>): number {
|
|
768
769
|
const configured = Number(env.PUSHPALS_VALIDATION_FAILURE_IDLE_MS ?? "");
|
|
@@ -772,6 +773,14 @@ function browserValidationFailureIdleMs(env: Record<string, string>): number {
|
|
|
772
773
|
return DEFAULT_BROWSER_VALIDATION_FAILURE_IDLE_MS;
|
|
773
774
|
}
|
|
774
775
|
|
|
776
|
+
function browserValidationSuccessIdleMs(env: Record<string, string>): number {
|
|
777
|
+
const configured = Number(env.PUSHPALS_VALIDATION_SUCCESS_IDLE_MS ?? "");
|
|
778
|
+
if (Number.isFinite(configured) && configured >= 250) {
|
|
779
|
+
return Math.min(120_000, Math.trunc(configured));
|
|
780
|
+
}
|
|
781
|
+
return DEFAULT_BROWSER_VALIDATION_SUCCESS_IDLE_MS;
|
|
782
|
+
}
|
|
783
|
+
|
|
775
784
|
function hasBrowserValidationFailureSignal(output: string): boolean {
|
|
776
785
|
const text = String(output ?? "");
|
|
777
786
|
if (!text.trim()) return false;
|
|
@@ -797,6 +806,17 @@ function hasBrowserValidationFailureSignal(output: string): boolean {
|
|
|
797
806
|
return patterns.some((pattern) => pattern.test(text));
|
|
798
807
|
}
|
|
799
808
|
|
|
809
|
+
function hasBrowserValidationSuccessSignal(output: string): boolean {
|
|
810
|
+
const text = String(output ?? "");
|
|
811
|
+
if (!text.trim()) return false;
|
|
812
|
+
const patterns = [
|
|
813
|
+
/\bWeb end-to-end smoke test completed successfully\./i,
|
|
814
|
+
/\bWeb smoke test completed successfully\./i,
|
|
815
|
+
/\bBrowser smoke test completed successfully\./i,
|
|
816
|
+
];
|
|
817
|
+
return patterns.some((pattern) => pattern.test(text));
|
|
818
|
+
}
|
|
819
|
+
|
|
800
820
|
export async function runValidationArgv(
|
|
801
821
|
repo: string,
|
|
802
822
|
command: string,
|
|
@@ -823,6 +843,7 @@ export async function runValidationArgv(
|
|
|
823
843
|
const stderrCapture = captureValidationStream(proc.stderr, noteOutput);
|
|
824
844
|
let timedOut = false;
|
|
825
845
|
let stoppedAfterFailureSignal = false;
|
|
846
|
+
let stoppedAfterSuccessSignal = false;
|
|
826
847
|
const timeout = Math.max(1_000, timeoutMs);
|
|
827
848
|
let timeoutTimer: ReturnType<typeof setTimeout> | null = null;
|
|
828
849
|
const timeoutPromise = new Promise<{ type: "timeout" }>((resolveTimeout) => {
|
|
@@ -832,18 +853,27 @@ export async function runValidationArgv(
|
|
|
832
853
|
}, timeout);
|
|
833
854
|
});
|
|
834
855
|
|
|
835
|
-
let
|
|
836
|
-
const
|
|
837
|
-
? new Promise<{ type: "failure-signal" }>((
|
|
856
|
+
let browserSignalTimer: ReturnType<typeof setInterval> | null = null;
|
|
857
|
+
const browserSignalPromise = isLongRunningBrowserValidationCommand(command)
|
|
858
|
+
? new Promise<{ type: "failure-signal" | "success-signal" }>((resolveBrowserSignal) => {
|
|
838
859
|
const idleMs = browserValidationFailureIdleMs(env);
|
|
839
|
-
|
|
860
|
+
const successIdleMs = browserValidationSuccessIdleMs(env);
|
|
861
|
+
browserSignalTimer = setInterval(() => {
|
|
840
862
|
const combinedOutput = `${stdoutCapture.text()}\n${stderrCapture.text()}`;
|
|
841
863
|
if (
|
|
842
864
|
hasBrowserValidationFailureSignal(combinedOutput) &&
|
|
843
865
|
Date.now() - lastOutputAt >= idleMs
|
|
844
866
|
) {
|
|
845
867
|
stoppedAfterFailureSignal = true;
|
|
846
|
-
|
|
868
|
+
resolveBrowserSignal({ type: "failure-signal" });
|
|
869
|
+
return;
|
|
870
|
+
}
|
|
871
|
+
if (
|
|
872
|
+
hasBrowserValidationSuccessSignal(combinedOutput) &&
|
|
873
|
+
Date.now() - lastOutputAt >= successIdleMs
|
|
874
|
+
) {
|
|
875
|
+
stoppedAfterSuccessSignal = true;
|
|
876
|
+
resolveBrowserSignal({ type: "success-signal" });
|
|
847
877
|
}
|
|
848
878
|
}, 250);
|
|
849
879
|
})
|
|
@@ -854,12 +884,12 @@ export async function runValidationArgv(
|
|
|
854
884
|
const exitOrTimeout = await Promise.race([
|
|
855
885
|
proc.exited.then((code) => ({ type: "exit" as const, code })),
|
|
856
886
|
timeoutPromise,
|
|
857
|
-
|
|
887
|
+
browserSignalPromise,
|
|
858
888
|
]);
|
|
859
889
|
if (timeoutTimer) clearTimeout(timeoutTimer);
|
|
860
|
-
if (
|
|
890
|
+
if (browserSignalTimer) clearInterval(browserSignalTimer);
|
|
861
891
|
|
|
862
|
-
if (timedOut || stoppedAfterFailureSignal) {
|
|
892
|
+
if (timedOut || stoppedAfterFailureSignal || stoppedAfterSuccessSignal) {
|
|
863
893
|
await terminateValidationProcessTree(proc);
|
|
864
894
|
}
|
|
865
895
|
|
|
@@ -868,9 +898,11 @@ export async function runValidationArgv(
|
|
|
868
898
|
? 124
|
|
869
899
|
: exitOrTimeout.type === "failure-signal"
|
|
870
900
|
? 1
|
|
901
|
+
: exitOrTimeout.type === "success-signal"
|
|
902
|
+
? 0
|
|
871
903
|
: exitOrTimeout.code;
|
|
872
904
|
|
|
873
|
-
if (!timedOut && !stoppedAfterFailureSignal) {
|
|
905
|
+
if (!timedOut && !stoppedAfterFailureSignal && !stoppedAfterSuccessSignal) {
|
|
874
906
|
await Promise.race([
|
|
875
907
|
Promise.all([stdoutCapture.promise, stderrCapture.promise]),
|
|
876
908
|
Bun.sleep(1_000),
|
|
@@ -1394,6 +1426,15 @@ export function classifyValidationFailureScope(
|
|
|
1394
1426
|
.flatMap((run) => [run.stdout, run.stderr])
|
|
1395
1427
|
.filter(Boolean)
|
|
1396
1428
|
.join("\n");
|
|
1429
|
+
if (
|
|
1430
|
+
failedRuns.some(
|
|
1431
|
+
(run) =>
|
|
1432
|
+
isLongRunningBrowserValidationCommand(run.command) &&
|
|
1433
|
+
isBrowserAssertionDigest([run.stdout, run.stderr].filter(Boolean).join("\n")),
|
|
1434
|
+
)
|
|
1435
|
+
) {
|
|
1436
|
+
return "task_scope";
|
|
1437
|
+
}
|
|
1397
1438
|
const lowerCombined = combined.toLowerCase().replace(/\\/g, "/");
|
|
1398
1439
|
for (const hint of scopeHints) {
|
|
1399
1440
|
const normalized = literalScopePrefix(hint);
|
|
@@ -2791,6 +2832,19 @@ export function buildQualityRevisionHint(
|
|
|
2791
2832
|
const lines: string[] = [];
|
|
2792
2833
|
lines.push("Quality revision required before completion.");
|
|
2793
2834
|
const focusedBrowserRepair = Boolean(browserRepairPacket);
|
|
2835
|
+
const validationAlreadyPassed =
|
|
2836
|
+
validationRuns.length > 0 && validationRuns.every((run) => run.ok);
|
|
2837
|
+
if (validationAlreadyPassed && !focusedBrowserRepair) {
|
|
2838
|
+
lines.push(
|
|
2839
|
+
"Validation-preserving cleanup mode: the previous ValidationGate pass succeeded. Treat the validated patch and browser path as frozen; address only the listed ScopeGate/CriticGate cleanup with the smallest possible diff.",
|
|
2840
|
+
);
|
|
2841
|
+
lines.push(
|
|
2842
|
+
"Do not rewrite app behavior, route flow, browser smoke selectors, validation scripts, or unrelated tests unless the listed cleanup explicitly requires that exact change.",
|
|
2843
|
+
);
|
|
2844
|
+
lines.push(
|
|
2845
|
+
"After the cleanup, run fast focused checks if useful and let PushPals ValidationGate rerun the full required validation set.",
|
|
2846
|
+
);
|
|
2847
|
+
}
|
|
2794
2848
|
if (browserRepairPacket) {
|
|
2795
2849
|
lines.push("Primary ValidationGate repair objective:");
|
|
2796
2850
|
lines.push(`- Command: ${browserRepairPacket.command}`);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
Suggested starting points:
|
|
2
2
|
{{targets_block}}
|