548d958f18
Build: Production / build (push) Failing after 12m39s
The fork's listRuntimeSkillEntries rematerialized every skill's files from the DB on every heartbeat run dispatch — fs.rm + fs.mkdir + per-file readFile/writeFile, sequentially per skill. With 24 configured skills and 5 concurrent agents, this saturated the Node event loop badly enough that executeRun continuations couldn't reach activeRunExecutions.add() within the orphan-reaper's 5-min threshold, causing reaper to false-positive runs as "process_lost". Upstream's listRuntimeSkillEntries calls resolveRuntimeSkillSource, which checks if the materialized directory already exists on disk and short- circuits when it does. Fixes the symptom at the root. Replaces these files with upstream/master content: - server/src/services/company-skills.ts - server/src/services/heartbeat.ts - server/src/services/workspace-runtime.ts - server/src/services/company-portability.ts - server/src/routes/company-skills.ts - server/src/routes/agents.ts - packages/adapter-utils/src/server-utils.ts Pulls in supporting upstream files: - server/src/services/catalog-provenance.ts - server/src/services/skills-catalog.ts - server/src/services/github-fetch.ts - server/src/services/portable-path.ts - packages/skills-catalog/ (new package) - packages/db document_annotation_* schema + migration 0091 - packages/shared document-annotation types/validators Drops fork features (to be re-evaluated later): - Gitea/Forgejo git skill sources (server/src/services/git-source.ts deleted) - PAT support for private skill repos - Fork-specific secret-export portability extensions Adds agentId: null to acquireRunLease test-probe call in routes/agents.ts to satisfy the fork's environment-runtime agentId requirement (kept). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
export const PORTABLE_CATALOG_PROVENANCE_STRING_KEYS = [
|
|
"sourceRef",
|
|
"originHash",
|
|
"catalogId",
|
|
"catalogKey",
|
|
"catalogKind",
|
|
"catalogCategory",
|
|
"catalogPath",
|
|
"packageName",
|
|
"packageVersion",
|
|
"originVersion",
|
|
"installedHash",
|
|
"userModifiedAt",
|
|
"updateHoldReason",
|
|
"auditVerdict",
|
|
"auditScannedAt",
|
|
"auditScanVersion",
|
|
] as const;
|
|
|
|
function asCatalogString(value: unknown) {
|
|
if (typeof value !== "string") return null;
|
|
const trimmed = value.trim();
|
|
return trimmed.length > 0 ? trimmed : null;
|
|
}
|
|
|
|
export function readCatalogStringList(value: unknown) {
|
|
if (!Array.isArray(value)) return null;
|
|
const entries = value.map((entry) => asCatalogString(entry)).filter((entry): entry is string => Boolean(entry));
|
|
return entries.length === value.length ? entries : null;
|
|
}
|
|
|
|
function isCatalogRecord(value: unknown): value is Record<string, unknown> {
|
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
}
|
|
|
|
export function readPortableCatalogProvenance(
|
|
metadata: Record<string, unknown> | null,
|
|
canonicalKey: string | null = null,
|
|
) {
|
|
const paperclip = isCatalogRecord(metadata?.paperclip) ? metadata.paperclip : null;
|
|
const catalog = isCatalogRecord(paperclip?.catalog) ? paperclip.catalog : null;
|
|
if (!catalog) return null;
|
|
|
|
const sourceRef = asCatalogString(catalog.sourceRef) ?? asCatalogString(catalog.originHash);
|
|
const normalized: Record<string, unknown> = {
|
|
...(canonicalKey ? { skillKey: canonicalKey } : {}),
|
|
sourceKind: "catalog",
|
|
};
|
|
const catalogSkillKey = asCatalogString(catalog.skillKey);
|
|
if (!canonicalKey && catalogSkillKey) normalized.skillKey = catalogSkillKey;
|
|
|
|
for (const key of PORTABLE_CATALOG_PROVENANCE_STRING_KEYS) {
|
|
if (key === "sourceRef") continue;
|
|
const value = asCatalogString(catalog[key]);
|
|
if (value) normalized[key] = value;
|
|
}
|
|
if (sourceRef && !normalized.originHash) normalized.originHash = sourceRef;
|
|
const auditCodes = readCatalogStringList(catalog.auditCodes);
|
|
if (auditCodes) normalized.auditCodes = auditCodes;
|
|
|
|
return {
|
|
sourceRef,
|
|
metadata: normalized,
|
|
};
|
|
}
|