@rallycry/conveyor-agent 11.0.5 → 11.0.7
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/{boot-7XH4FFLO.js → boot-SQKXI5NY.js} +23 -333
- package/dist/{chunk-URYBO32C.js → chunk-43XITDZP.js} +2 -2
- package/dist/{chunk-SLUBOIYE.js → chunk-APP6Y2D7.js} +11 -1
- package/dist/{chunk-D57S4UR5.js → chunk-IBAIJY7V.js} +17 -1
- package/dist/{chunk-W6VILPQE.js → chunk-JG3VMWRQ.js} +1 -1
- package/dist/{chunk-J2NPWBVZ.js → chunk-NFNB2C35.js} +153 -8
- package/dist/chunk-SR66HQKB.js +464 -0
- package/dist/{chunk-EXQ6AHOY.js → chunk-TOTCEWJD.js} +18 -0
- package/dist/cli.js +9 -9
- package/dist/{client-IG6C5F2G.js → client-6AUPKKMV.js} +1 -1
- package/dist/index.d.ts +76 -0
- package/dist/index.js +5 -5
- package/dist/{serve-boot-B4BIZMNB.js → serve-boot-ESZKFN5M.js} +3 -3
- package/dist/{server-2Z5V3IPA.js → server-2IZBKD3Q.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-XORJ6SII.js +0 -46
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startWorkbenchServer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-IBAIJY7V.js";
|
|
4
4
|
import {
|
|
5
5
|
TOMBSTONE_MESSAGE,
|
|
6
6
|
isLegacyEntrypointLaunch
|
|
7
7
|
} from "./chunk-R3FDJQL6.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
cloneReferenceRepos,
|
|
10
|
+
computeGraphifyEnv,
|
|
11
|
+
readAgentVersion,
|
|
12
|
+
refreshSkillsAfterCheckout,
|
|
13
|
+
runPreReadyBinds
|
|
14
|
+
} from "./chunk-SR66HQKB.js";
|
|
15
|
+
import "./chunk-JG3VMWRQ.js";
|
|
12
16
|
import {
|
|
13
17
|
GitPrepJob,
|
|
14
18
|
defaultGit,
|
|
15
19
|
ensureDir,
|
|
16
|
-
redactToken,
|
|
17
20
|
reportBootMilestone
|
|
18
21
|
} from "./chunk-GL2DIQEQ.js";
|
|
19
22
|
import "./chunk-W4LZ7R6Z.js";
|
|
@@ -29,7 +32,7 @@ import {
|
|
|
29
32
|
|
|
30
33
|
// src/boot/index.ts
|
|
31
34
|
import { spawn } from "child_process";
|
|
32
|
-
import { statSync as
|
|
35
|
+
import { statSync as statSync3 } from "fs";
|
|
33
36
|
import { hostname as osHostname } from "os";
|
|
34
37
|
|
|
35
38
|
// src/boot/bundle.ts
|
|
@@ -159,32 +162,6 @@ function buildChildEnv(opts) {
|
|
|
159
162
|
return child;
|
|
160
163
|
}
|
|
161
164
|
|
|
162
|
-
// src/boot/graphify.ts
|
|
163
|
-
var USER_HOME_MOUNT = "/mnt/conveyor-users";
|
|
164
|
-
function computeGraphifyEnv(env, repoName, dirExists) {
|
|
165
|
-
if (env.CONVEYOR_GRAPHIFY_DISABLE === "1") {
|
|
166
|
-
return {};
|
|
167
|
-
}
|
|
168
|
-
const slug = env.CONVEYOR_GRAPHIFY_SLUG || repoName;
|
|
169
|
-
if (!slug) {
|
|
170
|
-
return {};
|
|
171
|
-
}
|
|
172
|
-
const primaryRoot = `${USER_HOME_MOUNT}/users/_shared/graphify`;
|
|
173
|
-
const legacyRoot = `${USER_HOME_MOUNT}/_shared/graphify`;
|
|
174
|
-
let sharedRoot = env.CONVEYOR_GRAPHIFY_SHARED_ROOT;
|
|
175
|
-
if (!sharedRoot) {
|
|
176
|
-
sharedRoot = dirExists(primaryRoot) || !dirExists(legacyRoot) ? primaryRoot : legacyRoot;
|
|
177
|
-
}
|
|
178
|
-
const dir = env.CONVEYOR_GRAPHIFY_DIR || `${sharedRoot}/${slug}/latest`;
|
|
179
|
-
const graph = env.CONVEYOR_GRAPHIFY_GRAPH || `${dir}/graph.json`;
|
|
180
|
-
return {
|
|
181
|
-
CONVEYOR_GRAPHIFY_SLUG: slug,
|
|
182
|
-
CONVEYOR_GRAPHIFY_SHARED_ROOT: sharedRoot,
|
|
183
|
-
CONVEYOR_GRAPHIFY_DIR: dir,
|
|
184
|
-
CONVEYOR_GRAPHIFY_GRAPH: graph
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
165
|
// src/boot/logger.ts
|
|
189
166
|
import { appendFileSync } from "fs";
|
|
190
167
|
var BOOTSTRAP_LOG_PATH = "/tmp/claudespace-bootstrap.log";
|
|
@@ -851,306 +828,10 @@ async function startWorkspaceSshd(exec, log, port = process.env.CONVEYOR_WORKSPA
|
|
|
851
828
|
}
|
|
852
829
|
}
|
|
853
830
|
|
|
854
|
-
// src/boot/workspace-extras.ts
|
|
855
|
-
import {
|
|
856
|
-
appendFileSync as appendFileSync3,
|
|
857
|
-
cpSync,
|
|
858
|
-
existsSync as existsSync3,
|
|
859
|
-
lstatSync as lstatSync2,
|
|
860
|
-
mkdirSync as mkdirSync3,
|
|
861
|
-
readdirSync as readdirSync2,
|
|
862
|
-
readFileSync as readFileSync2,
|
|
863
|
-
readlinkSync,
|
|
864
|
-
rmSync as rmSync2,
|
|
865
|
-
statSync as statSync3,
|
|
866
|
-
symlinkSync as symlinkSync2
|
|
867
|
-
} from "fs";
|
|
868
|
-
import { dirname as dirname2, join as join5 } from "path";
|
|
869
|
-
import { fileURLToPath } from "url";
|
|
870
|
-
function errText(err) {
|
|
871
|
-
return redactToken(err instanceof Error ? err.message : String(err));
|
|
872
|
-
}
|
|
873
|
-
function isDir2(path) {
|
|
874
|
-
try {
|
|
875
|
-
return statSync3(path).isDirectory();
|
|
876
|
-
} catch {
|
|
877
|
-
return false;
|
|
878
|
-
}
|
|
879
|
-
}
|
|
880
|
-
function isSymlink(path) {
|
|
881
|
-
try {
|
|
882
|
-
return lstatSync2(path).isSymbolicLink();
|
|
883
|
-
} catch {
|
|
884
|
-
return false;
|
|
885
|
-
}
|
|
886
|
-
}
|
|
887
|
-
var GRAPHIFY_BUNDLE_FILES = [
|
|
888
|
-
"graph.json",
|
|
889
|
-
"GRAPH_REPORT.md",
|
|
890
|
-
"manifest.json",
|
|
891
|
-
".graphify_analysis.json",
|
|
892
|
-
".graphify_labels.json",
|
|
893
|
-
"publish-manifest.json",
|
|
894
|
-
"cost.json"
|
|
895
|
-
];
|
|
896
|
-
function bindGraphifyBundle(workspace, graphifyEnv, log) {
|
|
897
|
-
const slug = graphifyEnv.CONVEYOR_GRAPHIFY_SLUG;
|
|
898
|
-
const sourceDir = graphifyEnv.CONVEYOR_GRAPHIFY_DIR;
|
|
899
|
-
const graphFile = graphifyEnv.CONVEYOR_GRAPHIFY_GRAPH;
|
|
900
|
-
if (!slug || !sourceDir || !graphFile) return;
|
|
901
|
-
if (!existsSync3(graphFile)) {
|
|
902
|
-
log.info(`[boot] Graphify bundle not found for '${slug}' at ${sourceDir}`);
|
|
903
|
-
return;
|
|
904
|
-
}
|
|
905
|
-
const targetDir = join5(workspace, "graphify-out");
|
|
906
|
-
try {
|
|
907
|
-
mkdirSync3(targetDir, { recursive: true });
|
|
908
|
-
} catch {
|
|
909
|
-
log.warn(`[boot] WARN: unable to create graphify-out at ${targetDir}`);
|
|
910
|
-
return;
|
|
911
|
-
}
|
|
912
|
-
for (const rel of GRAPHIFY_BUNDLE_FILES) {
|
|
913
|
-
const source = join5(sourceDir, rel);
|
|
914
|
-
const target = join5(targetDir, rel);
|
|
915
|
-
if (!existsSync3(source)) continue;
|
|
916
|
-
if (existsSync3(target) || isSymlink(target)) continue;
|
|
917
|
-
try {
|
|
918
|
-
symlinkSync2(source, target);
|
|
919
|
-
} catch {
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
log.info(`[boot] Bound graphify bundle '${slug}' into ${targetDir}`);
|
|
923
|
-
}
|
|
924
|
-
async function ensureGrimoireSubmodule(workspace, githubToken, git, log) {
|
|
925
|
-
try {
|
|
926
|
-
if (!existsSync3(join5(workspace, ".gitmodules"))) return;
|
|
927
|
-
let paths = "";
|
|
928
|
-
try {
|
|
929
|
-
({ stdout: paths } = await git(
|
|
930
|
-
["config", "--file", ".gitmodules", "--get-regexp", String.raw`submodule\..*\.path`],
|
|
931
|
-
{ cwd: workspace, timeoutMs: 1e4 }
|
|
932
|
-
));
|
|
933
|
-
} catch {
|
|
934
|
-
return;
|
|
935
|
-
}
|
|
936
|
-
if (!paths.split("\n").some((line) => line.trim().endsWith(".claude/grimoire"))) return;
|
|
937
|
-
if (isDir2(join5(workspace, ".claude", "grimoire", "skills"))) return;
|
|
938
|
-
if (!githubToken) {
|
|
939
|
-
log.warn("[boot] WARN: grimoire submodule absent and no token to fetch it");
|
|
940
|
-
return;
|
|
941
|
-
}
|
|
942
|
-
try {
|
|
943
|
-
await git(
|
|
944
|
-
[
|
|
945
|
-
"-c",
|
|
946
|
-
`url.https://x-access-token:${githubToken}@github.com/.insteadOf=https://github.com/`,
|
|
947
|
-
"submodule",
|
|
948
|
-
"update",
|
|
949
|
-
"--init",
|
|
950
|
-
".claude/grimoire"
|
|
951
|
-
],
|
|
952
|
-
{ cwd: workspace, timeoutMs: 3e5 }
|
|
953
|
-
);
|
|
954
|
-
log.info("[boot] Initialized grimoire submodule");
|
|
955
|
-
} catch (err) {
|
|
956
|
-
log.warn(
|
|
957
|
-
`[boot] WARN: grimoire submodule init failed (baked pods may lack rc-* skills): ${errText(err)}`
|
|
958
|
-
);
|
|
959
|
-
}
|
|
960
|
-
} catch (err) {
|
|
961
|
-
log.warn(`[boot] WARN: grimoire submodule check failed: ${errText(err)}`);
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
function excludeLinkedSkills(workspace, names, log) {
|
|
965
|
-
if (names.length === 0) return;
|
|
966
|
-
const infoDir = join5(workspace, ".git", "info");
|
|
967
|
-
if (!isDir2(join5(workspace, ".git"))) return;
|
|
968
|
-
try {
|
|
969
|
-
mkdirSync3(infoDir, { recursive: true });
|
|
970
|
-
const excludePath = join5(infoDir, "exclude");
|
|
971
|
-
const existing = existsSync3(excludePath) ? readFileSync2(excludePath, "utf8") : "";
|
|
972
|
-
const missing = names.map((name) => `.claude/skills/${name}`).filter((line) => !existing.split("\n").includes(line));
|
|
973
|
-
if (missing.length === 0) return;
|
|
974
|
-
const prefix = existing.length > 0 && !existing.endsWith("\n") ? "\n" : "";
|
|
975
|
-
appendFileSync3(excludePath, `${prefix}${missing.join("\n")}
|
|
976
|
-
`);
|
|
977
|
-
} catch (err) {
|
|
978
|
-
log.warn(`[boot] WARN: unable to exclude grimoire skill links: ${errText(err)}`);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
function symlinkTargetsGrimoire(path) {
|
|
982
|
-
try {
|
|
983
|
-
return readlinkSync(path).includes(join5("grimoire", "skills"));
|
|
984
|
-
} catch {
|
|
985
|
-
return false;
|
|
986
|
-
}
|
|
987
|
-
}
|
|
988
|
-
function linkGrimoireSkills(workspace, log) {
|
|
989
|
-
const sourceDir = join5(workspace, ".claude", "grimoire", "skills");
|
|
990
|
-
const targetDir = join5(workspace, ".claude", "skills");
|
|
991
|
-
if (!isDir2(sourceDir)) return;
|
|
992
|
-
try {
|
|
993
|
-
mkdirSync3(targetDir, { recursive: true });
|
|
994
|
-
} catch {
|
|
995
|
-
log.warn(`[boot] WARN: unable to create ${targetDir}; skipping grimoire skill links`);
|
|
996
|
-
return;
|
|
997
|
-
}
|
|
998
|
-
const linkedNames = [];
|
|
999
|
-
let names = [];
|
|
1000
|
-
try {
|
|
1001
|
-
names = readdirSync2(sourceDir);
|
|
1002
|
-
} catch {
|
|
1003
|
-
return;
|
|
1004
|
-
}
|
|
1005
|
-
for (const name of names) {
|
|
1006
|
-
if (!isDir2(join5(sourceDir, name))) continue;
|
|
1007
|
-
const target = join5(targetDir, name);
|
|
1008
|
-
if (existsSync3(target) && !isSymlink(target)) {
|
|
1009
|
-
log.warn(`[boot] WARN: ${target} exists and is not a symlink; skipping`);
|
|
1010
|
-
continue;
|
|
1011
|
-
}
|
|
1012
|
-
if (isSymlink(target) && !symlinkTargetsGrimoire(target)) continue;
|
|
1013
|
-
try {
|
|
1014
|
-
rmSync2(target, { force: true });
|
|
1015
|
-
symlinkSync2(join5("..", "grimoire", "skills", name), target);
|
|
1016
|
-
linkedNames.push(name);
|
|
1017
|
-
} catch {
|
|
1018
|
-
}
|
|
1019
|
-
}
|
|
1020
|
-
excludeLinkedSkills(workspace, linkedNames, log);
|
|
1021
|
-
log.info(`[boot] Linked ${linkedNames.length} grimoire skills into ${targetDir}`);
|
|
1022
|
-
}
|
|
1023
|
-
function bundledSkillsDir(moduleUrl = import.meta.url) {
|
|
1024
|
-
try {
|
|
1025
|
-
const dir = join5(dirname2(fileURLToPath(moduleUrl)), "..", "skills");
|
|
1026
|
-
return isDir2(dir) ? dir : null;
|
|
1027
|
-
} catch {
|
|
1028
|
-
return null;
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
function materializeBundledSkills(workspace, log, sourceDirOverride) {
|
|
1032
|
-
const sourceDir = sourceDirOverride === void 0 ? bundledSkillsDir() : sourceDirOverride;
|
|
1033
|
-
if (!sourceDir) {
|
|
1034
|
-
log.warn(
|
|
1035
|
-
"[boot] WARN: no bundled skills payload in this agent build. Cloud modes that invoke a skill will have no workflow to follow. This is a packaging fault (tsup copySkillsPayload did not run), not a workspace problem."
|
|
1036
|
-
);
|
|
1037
|
-
return;
|
|
1038
|
-
}
|
|
1039
|
-
const targetDir = join5(workspace, ".claude", "skills");
|
|
1040
|
-
try {
|
|
1041
|
-
mkdirSync3(targetDir, { recursive: true });
|
|
1042
|
-
} catch {
|
|
1043
|
-
log.warn(`[boot] WARN: unable to create ${targetDir}; skipping bundled skills`);
|
|
1044
|
-
return;
|
|
1045
|
-
}
|
|
1046
|
-
const copied = [];
|
|
1047
|
-
let names = [];
|
|
1048
|
-
try {
|
|
1049
|
-
names = readdirSync2(sourceDir);
|
|
1050
|
-
} catch {
|
|
1051
|
-
return;
|
|
1052
|
-
}
|
|
1053
|
-
for (const name of names) {
|
|
1054
|
-
if (!isDir2(join5(sourceDir, name))) continue;
|
|
1055
|
-
const target = join5(targetDir, name);
|
|
1056
|
-
if (existsSync3(target) || isSymlink(target)) continue;
|
|
1057
|
-
try {
|
|
1058
|
-
cpSync(join5(sourceDir, name), target, { recursive: true, dereference: true });
|
|
1059
|
-
copied.push(name);
|
|
1060
|
-
} catch {
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
excludeLinkedSkills(workspace, copied, log);
|
|
1064
|
-
log.info(`[boot] Materialized ${copied.length} bundled skills into ${targetDir}`);
|
|
1065
|
-
}
|
|
1066
|
-
async function neutralizeGrimoirePointer(workspace, git, log) {
|
|
1067
|
-
if (!existsSync3(join5(workspace, ".claude", "grimoire"))) return;
|
|
1068
|
-
try {
|
|
1069
|
-
await git(["update-index", "--assume-unchanged", ".claude/grimoire"], {
|
|
1070
|
-
cwd: workspace,
|
|
1071
|
-
timeoutMs: 1e4
|
|
1072
|
-
});
|
|
1073
|
-
log.info("[boot] Marked .claude/grimoire assume-unchanged (submodule pointer drift is noise)");
|
|
1074
|
-
} catch (err) {
|
|
1075
|
-
log.warn(`[boot] WARN: grimoire assume-unchanged failed: ${errText(err)}`);
|
|
1076
|
-
}
|
|
1077
|
-
}
|
|
1078
|
-
function parseReferenceRepos(refsJson) {
|
|
1079
|
-
let parsed;
|
|
1080
|
-
try {
|
|
1081
|
-
parsed = JSON.parse(refsJson);
|
|
1082
|
-
} catch {
|
|
1083
|
-
return [];
|
|
1084
|
-
}
|
|
1085
|
-
if (!Array.isArray(parsed)) return [];
|
|
1086
|
-
const refs = [];
|
|
1087
|
-
for (const entry of parsed) {
|
|
1088
|
-
if (typeof entry !== "object" || entry === null) continue;
|
|
1089
|
-
const raw = entry;
|
|
1090
|
-
const str = (key) => typeof raw[key] === "string" ? raw[key] : "";
|
|
1091
|
-
const ref = {
|
|
1092
|
-
slug: str("slug"),
|
|
1093
|
-
owner: str("owner"),
|
|
1094
|
-
name: str("name"),
|
|
1095
|
-
branch: str("branch") || "main",
|
|
1096
|
-
token: str("token")
|
|
1097
|
-
};
|
|
1098
|
-
if (ref.token && ref.slug && ref.owner && ref.name) refs.push(ref);
|
|
1099
|
-
}
|
|
1100
|
-
return refs;
|
|
1101
|
-
}
|
|
1102
|
-
async function runPreReadyBinds(workspace, bundle, git, log) {
|
|
1103
|
-
const graphifyEnv = computeGraphifyEnv(process.env, bundle.gitPlan.repoName, isDir2);
|
|
1104
|
-
bindGraphifyBundle(workspace, graphifyEnv, log);
|
|
1105
|
-
await ensureGrimoireSubmodule(workspace, bundle.githubToken ?? "", git, log);
|
|
1106
|
-
linkGrimoireSkills(workspace, log);
|
|
1107
|
-
materializeBundledSkills(workspace, log);
|
|
1108
|
-
await neutralizeGrimoirePointer(workspace, git, log);
|
|
1109
|
-
}
|
|
1110
|
-
async function cloneReferenceRepos(refsJson, git, log, referencesDir = "/workspaces/references") {
|
|
1111
|
-
if (!refsJson) return;
|
|
1112
|
-
const refs = parseReferenceRepos(refsJson);
|
|
1113
|
-
if (refs.length === 0) return;
|
|
1114
|
-
try {
|
|
1115
|
-
mkdirSync3(referencesDir, { recursive: true });
|
|
1116
|
-
} catch {
|
|
1117
|
-
return;
|
|
1118
|
-
}
|
|
1119
|
-
for (const ref of refs) {
|
|
1120
|
-
const dest = join5(referencesDir, ref.slug);
|
|
1121
|
-
if (existsSync3(join5(dest, ".git"))) continue;
|
|
1122
|
-
try {
|
|
1123
|
-
await git(
|
|
1124
|
-
[
|
|
1125
|
-
"clone",
|
|
1126
|
-
"--depth",
|
|
1127
|
-
"1",
|
|
1128
|
-
"--single-branch",
|
|
1129
|
-
"--branch",
|
|
1130
|
-
ref.branch,
|
|
1131
|
-
`https://x-access-token:${ref.token}@github.com/${ref.owner}/${ref.name}.git`,
|
|
1132
|
-
dest
|
|
1133
|
-
],
|
|
1134
|
-
{ timeoutMs: 6e5 }
|
|
1135
|
-
);
|
|
1136
|
-
try {
|
|
1137
|
-
await git(
|
|
1138
|
-
["remote", "set-url", "origin", `https://github.com/${ref.owner}/${ref.name}.git`],
|
|
1139
|
-
{ cwd: dest, timeoutMs: 1e4 }
|
|
1140
|
-
);
|
|
1141
|
-
} catch {
|
|
1142
|
-
}
|
|
1143
|
-
log.info(`[boot] cloned reference ${ref.slug} (${ref.owner}/${ref.name}@${ref.branch})`);
|
|
1144
|
-
} catch {
|
|
1145
|
-
log.warn(`[boot] WARN: reference clone failed: ${ref.slug}`);
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
831
|
// src/boot/workbench-boot-deps.ts
|
|
1151
832
|
var WORKSPACE_DIR = "/workspaces/repo";
|
|
1152
833
|
var HOME_DIR = "/home/conveyor";
|
|
1153
|
-
var
|
|
834
|
+
var USER_HOME_MOUNT = "/mnt/conveyor-users";
|
|
1154
835
|
function sleep(ms) {
|
|
1155
836
|
return new Promise((resolve) => {
|
|
1156
837
|
setTimeout(resolve, ms);
|
|
@@ -1183,6 +864,14 @@ function defaultWorkbenchBootDeps() {
|
|
|
1183
864
|
}),
|
|
1184
865
|
bindsBeforeReady: (ctx, bundle) => runPreReadyBinds(WORKSPACE_DIR, bundle, defaultGit, ctx.log),
|
|
1185
866
|
cloneReferences: (ctx, bundle) => cloneReferenceRepos(bundle.envVars?.REFERENCE_REPOS_JSON, defaultGit, ctx.log),
|
|
867
|
+
refreshSkills: async (ctx) => {
|
|
868
|
+
const { filled, shadowed, stale } = await refreshSkillsAfterCheckout(
|
|
869
|
+
WORKSPACE_DIR,
|
|
870
|
+
defaultGit,
|
|
871
|
+
ctx.log
|
|
872
|
+
);
|
|
873
|
+
return { t: "refreshSkills", filled, shadowed, stale };
|
|
874
|
+
},
|
|
1186
875
|
ensureWorkspaceDir: (ctx) => {
|
|
1187
876
|
ensureDir(WORKSPACE_DIR);
|
|
1188
877
|
ctx.log.info(`[boot] ensured workspace dir ${WORKSPACE_DIR}`);
|
|
@@ -1190,7 +879,7 @@ function defaultWorkbenchBootDeps() {
|
|
|
1190
879
|
wireHome: (ctx) => {
|
|
1191
880
|
void wireUserHome({
|
|
1192
881
|
home: HOME_DIR,
|
|
1193
|
-
userHomeMount:
|
|
882
|
+
userHomeMount: USER_HOME_MOUNT,
|
|
1194
883
|
userId: ctx.childEnv?.CONVEYOR_USER_ID,
|
|
1195
884
|
projectId: ctx.childEnv?.CONVEYOR_PROJECT_ID ?? ctx.childEnv?.PROJECT_ID,
|
|
1196
885
|
sharedDir: process.env.CONVEYOR_SHARED_DIR,
|
|
@@ -1239,6 +928,7 @@ async function runWorkbenchBoot(ctx, overrides = {}) {
|
|
|
1239
928
|
token: ctx.bootstrapToken,
|
|
1240
929
|
version: readAgentVersion() ?? "unknown",
|
|
1241
930
|
getGitStatus: () => toGitStatusFrame(job.status),
|
|
931
|
+
refreshSkills: () => deps.refreshSkills(ctx),
|
|
1242
932
|
oomWatchdog: oomWatchdogOptionsFromEnv(ctx.log)
|
|
1243
933
|
});
|
|
1244
934
|
ctx.log.info("[boot] step=startDaemon listen socket up (startupProbe gate open)");
|
|
@@ -1261,7 +951,7 @@ async function runWorkbenchBoot(ctx, overrides = {}) {
|
|
|
1261
951
|
|
|
1262
952
|
// src/boot/index.ts
|
|
1263
953
|
var HOME_DIR2 = "/home/conveyor";
|
|
1264
|
-
var
|
|
954
|
+
var USER_HOME_MOUNT2 = "/mnt/conveyor-users";
|
|
1265
955
|
function defaultBootDeps() {
|
|
1266
956
|
return {
|
|
1267
957
|
fetchFn: fetch,
|
|
@@ -1272,7 +962,7 @@ function defaultBootDeps() {
|
|
|
1272
962
|
exec: defaultExec,
|
|
1273
963
|
dirExists: (path) => {
|
|
1274
964
|
try {
|
|
1275
|
-
return
|
|
965
|
+
return statSync3(path).isDirectory();
|
|
1276
966
|
} catch {
|
|
1277
967
|
return false;
|
|
1278
968
|
}
|
|
@@ -1349,7 +1039,7 @@ function agentBootSteps(deps = defaultBootDeps(), signal = new AbortController()
|
|
|
1349
1039
|
if (ctx.bundle) {
|
|
1350
1040
|
void wireUserHome({
|
|
1351
1041
|
home: HOME_DIR2,
|
|
1352
|
-
userHomeMount:
|
|
1042
|
+
userHomeMount: USER_HOME_MOUNT2,
|
|
1353
1043
|
userId: ctx.childEnv?.CONVEYOR_USER_ID,
|
|
1354
1044
|
projectId: ctx.childEnv?.CONVEYOR_PROJECT_ID ?? ctx.childEnv?.PROJECT_ID,
|
|
1355
1045
|
sharedDir: process.env.CONVEYOR_SHARED_DIR,
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
readWorkspaceBytes,
|
|
6
6
|
statWorkspacePath,
|
|
7
7
|
workspacePathExists
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-APP6Y2D7.js";
|
|
9
9
|
import {
|
|
10
10
|
reportBootMilestone
|
|
11
11
|
} from "./chunk-GL2DIQEQ.js";
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-W4LZ7R6Z.js";
|
|
17
17
|
import {
|
|
18
18
|
getWorkbenchClient
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-TOTCEWJD.js";
|
|
20
20
|
import {
|
|
21
21
|
workbenchEnabled
|
|
22
22
|
} from "./chunk-KMB3BU4S.js";
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
import {
|
|
21
21
|
WorkbenchError,
|
|
22
22
|
getWorkbenchClient
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-TOTCEWJD.js";
|
|
24
24
|
import {
|
|
25
25
|
workbenchEnabled
|
|
26
26
|
} from "./chunk-KMB3BU4S.js";
|
|
@@ -287,6 +287,10 @@ var AgentConnection = class _AgentConnection {
|
|
|
287
287
|
// PTY relay (S5 terminal). Single-slot callbacks, set per PtySession run.
|
|
288
288
|
ptyInputCallback = null;
|
|
289
289
|
ptyResizeCallback = null;
|
|
290
|
+
/** Epoch ms of the last relayed keystroke, or null before any input. The
|
|
291
|
+
* question-grace expiry reads it to defer un-parking while a human is
|
|
292
|
+
* actively typing into the Connected-TUI (they may be mid-answer). */
|
|
293
|
+
_lastPtyInputAt = null;
|
|
290
294
|
constructor(config) {
|
|
291
295
|
this.config = config;
|
|
292
296
|
}
|
|
@@ -475,6 +479,7 @@ var AgentConnection = class _AgentConnection {
|
|
|
475
479
|
});
|
|
476
480
|
this.socket.on("pty:input", (data) => {
|
|
477
481
|
if (data.sessionId && data.sessionId !== this.config.sessionId) return;
|
|
482
|
+
this._lastPtyInputAt = Date.now();
|
|
478
483
|
this.ptyInputCallback?.(data.data);
|
|
479
484
|
});
|
|
480
485
|
this.socket.on("pty:resize", (data) => {
|
|
@@ -925,6 +930,10 @@ var AgentConnection = class _AgentConnection {
|
|
|
925
930
|
}).catch(() => {
|
|
926
931
|
});
|
|
927
932
|
}
|
|
933
|
+
/** Epoch ms of the last relayed TUI keystroke, or null before any. */
|
|
934
|
+
get lastPtyInputAt() {
|
|
935
|
+
return this._lastPtyInputAt;
|
|
936
|
+
}
|
|
928
937
|
/** Subscribe to relayed keystrokes. Returns an unsubscribe fn. */
|
|
929
938
|
onPtyInput(handler) {
|
|
930
939
|
this.ptyInputCallback = handler;
|
|
@@ -2539,6 +2548,7 @@ export {
|
|
|
2539
2548
|
statWorkspacePath,
|
|
2540
2549
|
workspacePathExists,
|
|
2541
2550
|
GIT_TIMEOUT_MS,
|
|
2551
|
+
git,
|
|
2542
2552
|
updateRemoteToken,
|
|
2543
2553
|
verifyGitCredential,
|
|
2544
2554
|
forceFreshMintBlocked,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadPtySpawn
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JG3VMWRQ.js";
|
|
4
4
|
import {
|
|
5
5
|
terminateProcessGroup
|
|
6
6
|
} from "./chunk-W4LZ7R6Z.js";
|
|
@@ -99,6 +99,19 @@ function handleConnection(socket, opts, liveOps) {
|
|
|
99
99
|
});
|
|
100
100
|
socket.on("data", (chunk) => reader.push(chunk));
|
|
101
101
|
}
|
|
102
|
+
async function runRefreshSkills(socket, opts) {
|
|
103
|
+
const empty = { t: "refreshSkills", filled: [], shadowed: [], stale: [] };
|
|
104
|
+
try {
|
|
105
|
+
writeFrame(socket, await opts.refreshSkills?.() ?? empty);
|
|
106
|
+
} catch (err) {
|
|
107
|
+
writeFrame(socket, {
|
|
108
|
+
t: "error",
|
|
109
|
+
message: err instanceof Error ? err.message : String(err),
|
|
110
|
+
code: errCode(err)
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
socket.end();
|
|
114
|
+
}
|
|
102
115
|
function dispatch(socket, req, sink, opts, liveOps) {
|
|
103
116
|
if (!req || typeof req !== "object" || !timingSafeTokenEqual(req.token ?? "", opts.token)) {
|
|
104
117
|
writeFrame(socket, { t: "error", message: "unauthorized", code: "unauthorized" });
|
|
@@ -114,6 +127,9 @@ function dispatch(socket, req, sink, opts, liveOps) {
|
|
|
114
127
|
writeFrame(socket, opts.getGitStatus?.() ?? { t: "gitStatus", state: "ready" });
|
|
115
128
|
socket.end();
|
|
116
129
|
return;
|
|
130
|
+
case "refreshSkills":
|
|
131
|
+
void runRefreshSkills(socket, opts);
|
|
132
|
+
return;
|
|
117
133
|
case "exec":
|
|
118
134
|
runExec(socket, req, sink, liveOps);
|
|
119
135
|
return;
|
|
@@ -200,7 +200,7 @@ async function loadPtySpawn() {
|
|
|
200
200
|
async function resolvePtySpawn() {
|
|
201
201
|
const { workbenchEnabled } = await import("./mode-ZJSOSLGU.js");
|
|
202
202
|
if (!workbenchEnabled()) return loadPtySpawn();
|
|
203
|
-
const { getWorkbenchClient } = await import("./client-
|
|
203
|
+
const { getWorkbenchClient } = await import("./client-6AUPKKMV.js");
|
|
204
204
|
return (file, args, options) => getWorkbenchClient().spawnPty(file, args, options);
|
|
205
205
|
}
|
|
206
206
|
function sessionTempBase() {
|