@on-par/factory-cli 0.9.11-next.2 → 0.9.11-next.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/cli/base-health-ci.d.ts +4 -0
  2. package/dist/cli/base-health-ci.d.ts.map +1 -0
  3. package/dist/cli/base-health-ci.js +9 -0
  4. package/dist/cli/base-health-ci.js.map +1 -0
  5. package/dist/cli/base-hold.d.ts +14 -11
  6. package/dist/cli/base-hold.d.ts.map +1 -1
  7. package/dist/cli/base-hold.js +43 -20
  8. package/dist/cli/base-hold.js.map +1 -1
  9. package/dist/cli/daemon.d.ts.map +1 -1
  10. package/dist/cli/daemon.js +4 -11
  11. package/dist/cli/daemon.js.map +1 -1
  12. package/dist/cli/index.d.ts +5 -16
  13. package/dist/cli/index.d.ts.map +1 -1
  14. package/dist/cli/index.js +16 -25
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/land-pr.d.ts.map +1 -1
  17. package/dist/cli/land-pr.js +5 -0
  18. package/dist/cli/land-pr.js.map +1 -1
  19. package/dist/cli/lane-environment-pause-error.d.ts +19 -0
  20. package/dist/cli/lane-environment-pause-error.d.ts.map +1 -0
  21. package/dist/cli/lane-environment-pause-error.js +24 -0
  22. package/dist/cli/lane-environment-pause-error.js.map +1 -0
  23. package/dist/cli/logs.d.ts +10 -0
  24. package/dist/cli/logs.d.ts.map +1 -1
  25. package/dist/cli/logs.js +41 -3
  26. package/dist/cli/logs.js.map +1 -1
  27. package/dist/cli/program-observe.d.ts.map +1 -1
  28. package/dist/cli/program-observe.js +5 -2
  29. package/dist/cli/program-observe.js.map +1 -1
  30. package/dist/cli/queue-list.d.ts +5 -4
  31. package/dist/cli/queue-list.d.ts.map +1 -1
  32. package/dist/cli/queue-list.js +6 -1
  33. package/dist/cli/queue-list.js.map +1 -1
  34. package/dist/cli/run-branch.d.ts +24 -0
  35. package/dist/cli/run-branch.d.ts.map +1 -0
  36. package/dist/cli/run-branch.js +38 -0
  37. package/dist/cli/run-branch.js.map +1 -0
  38. package/dist/cli/run-lane.d.ts.map +1 -1
  39. package/dist/cli/run-lane.js +5 -2
  40. package/dist/cli/run-lane.js.map +1 -1
  41. package/dist/cli/run.d.ts.map +1 -1
  42. package/dist/cli/run.js +3 -3
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/cli/self-update-stop.d.ts +7 -0
  45. package/dist/cli/self-update-stop.d.ts.map +1 -0
  46. package/dist/cli/self-update-stop.js +27 -0
  47. package/dist/cli/self-update-stop.js.map +1 -0
  48. package/dist/cli/ship-run-state.d.ts +5 -0
  49. package/dist/cli/ship-run-state.d.ts.map +1 -0
  50. package/dist/cli/ship-run-state.js +12 -0
  51. package/dist/cli/ship-run-state.js.map +1 -0
  52. package/dist/cli/ship-steps.d.ts +1 -1
  53. package/dist/cli/ship-steps.d.ts.map +1 -1
  54. package/dist/cli/ship-steps.js +4 -2
  55. package/dist/cli/ship-steps.js.map +1 -1
  56. package/dist/cli/ship.d.ts.map +1 -1
  57. package/dist/cli/ship.js +24 -21
  58. package/dist/cli/ship.js.map +1 -1
  59. package/dist/cli/status-json.d.ts +8 -0
  60. package/dist/cli/status-json.d.ts.map +1 -1
  61. package/dist/cli/status-json.js +1 -0
  62. package/dist/cli/status-json.js.map +1 -1
  63. package/dist/cli/status.d.ts.map +1 -1
  64. package/dist/cli/status.js +3 -1
  65. package/dist/cli/status.js.map +1 -1
  66. package/package.json +3 -3
package/dist/cli/index.js CHANGED
@@ -6,12 +6,14 @@ import { createRequire } from 'node:module';
6
6
  import { arch, hostname as osHostname, release, platform, userInfo } from 'node:os';
7
7
  import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
8
8
  import { promisify, styleText } from 'node:util';
9
+ import { LaneEnvironmentPauseError } from './lane-environment-pause-error.js';
9
10
  import { INVALID_BRANCH_PREFIX_MESSAGE, resolveBranchPrefixOption } from './branch-prefix.js';
10
11
  import { sweepLaneClaims, warnQueueDiagnostics } from './queue-startup.js';
11
12
  import { proposeTriageQueue } from './triage-open-prs.js';
12
13
  import { acquirePortLease, aggregateCosts, appendKpiHistoryLine, applyRepoConfig, buildPhase, checkPhase, clearProxyState, computeHealthKpis, ConstitutionLoader, createDefaultWorkSourceRegistry, createLogger, createLaneProxy, defaultFindPortListeners, describeEffectiveConfig, detectPostMergeDefects, diagnoseModels, probeDeclaredHarnesses, estimateTrailingSpend, fetchDefectSources, fetchSubscriptionUsage, formatUsageReport, getConstitutionsDir, getFactoryPaths, GITHUB_ISSUE_SOURCE, hasUnresolvedPark, InvalidArtifactsDirError, InvalidWorkRequestInputError, InvalidWorkspaceError, isCommandAvailable, isProxyRunning, kpiBranchPrefixes, kpisToHistoryRecord, laneBaseUrl, laneEnv, laneHostLabel, loadFactoryConfigForRepo, loadModelsConfig, loadRepoConfig, loadRoutesConfig, LOCAL_BRIEF_SOURCE, joinClassifierOutcomes, mergeClassifierOutcomes, parseClassifierOutcomes, summarizeClassifierOutcomes, formatClassifierReport, mergedPrRefs, ModelRegistry, ModelRouter, parkReasonFor, parseKpiHistory, parseQueue, planPhase, readEvents, readPortLeases, readQueue, readUsage, reapOrphanProcesses, reconstructKpiEvents, recordLeasePgid, releasePortLease, renderKpiReport, renderKpiTrend, resolveDefectWindowDays, parseSizeGateMode, parseMaxSlices, SIZE_GATE_MODES, resolveEffectiveModelPins, resolveEnvironmentProxy, resolveArtifactsDir, resolveLocalOnlyPolicy, resolveMergePolicy, resolveSkipCI, resolveTimeouts, resolveUsageCap, resolveWatchdogPolicy, runAutoIngest, shipPhase, formatCostTotal, validateQueue, watchUsage, writeLocalRunReport, writeProxyState, } from '@on-par/factory-core';
13
- import { acquirePidFile, createCheckResumeStore, findSlicePlanComment, upsertSlicePlanComment, withSliceState, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, fetchHumanEventSourcesCached, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, pollBlockedParks, readCosts, readGithubQueueSnapshot, reapCleanShipWorktree, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, resolveExperimental, resolveLocalOnly, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, parseTriageCandidates, recordLocalAuthFailure, laneSlug, } from '@on-par/factory-core/internal';
14
+ import { acquirePidFile, createCheckResumeStore, findSlicePlanComment, upsertSlicePlanComment, withSliceState, DEFAULT_GARDEN_MAX_CLUSTERS, DEFAULT_GARDEN_SINCE, capGardenClusters, clusterGarden, dedupGardenClusters, filterGardenOnlyNew, filterGardenWindow, markGardenTrackingUnknown, parseGardenDuration, readHarvestEvents, renderGardenJson, renderGardenReport, laneWorktreePath, migrateRepoConfigToYaml, REPO_CONFIG_YAML_HEADER, claudeConfigDirOverride, claudeKeychainService, cleanupWorktree, createDaemonLogSink, factoryBranchIssue, factoryBranchPrefixes, createFactorydServer, createRunRuntime, createShipExecutor, createGithubQueue, createLocalSmallDryRun, createOctokitFilingClient, createOctokitGreenPrClient, createOctokitQueueClient, daemonRuntimePaths, defaultRegistryPath, ensureDir, fetchHumanEventSourcesCached, FACTORY_RUNTIME_CONFIG_KEYS, findUnmergedGreenPrs, formatGcReport, gitFetch, listMicroVms, listOrphanContainers, logCost, logEvent, planQueueMigration, pollBlockedParks, readCosts, readGithubQueueSnapshot, reapCleanShipWorktree, reapLaneWorktree, reapOrphanContainers, reapOrphanMicroVm, releaseRuntimeFiles, releaseStaleClaims, resolveBranchPrefix, resolveEffectiveConfig, resolveExperimental, resolveLocalOnly, resolvePrClassifierPolicy, resolveReviewFloorRules, RunLockHeldError, runOvernightQueue, parseRemoteSlug, setupWorktree, shellEscape, listBuiltInCheckers, sweepWorktrees, watchChecks, withFileLock, withGitLock, withRunLock, writePortFile, buildTriagePrompt, parseTriageCandidates, recordLocalAuthFailure, laneSlug, formatStopMarker, readStopMarker, } from '@on-par/factory-core/internal';
14
15
  import { runTui } from '@on-par/factory-tui';
16
+ import { clearSelfUpdateStop } from './self-update-stop.js';
15
17
  import { admissionStateReaderFor, runQueueReconcile } from './admission.js';
16
18
  import { cmdClassifierBacktest, ClassifierBacktestInputError, } from './classifier-backtest.js';
17
19
  import { runHarnessCheckCommand } from './harness-check.js';
@@ -338,7 +340,7 @@ setShipRuntime(() => ({
338
340
  IssueSkippedError,
339
341
  IssueDecomposedError,
340
342
  }));
341
- export { shipIssue };
343
+ export { LaneEnvironmentPauseError, shipIssue };
342
344
  export function hasGitHubToken(env = process.env, tryToken) {
343
345
  if (env.GITHUB_TOKEN || env.GH_TOKEN)
344
346
  return true;
@@ -1366,24 +1368,6 @@ export class LaneParkError extends Error {
1366
1368
  return this.outcome.failingChecks;
1367
1369
  }
1368
1370
  }
1369
- /** CHECK found every failing checker also failing on the base SHA (#1928): the issue is
1370
- * released to queued (not parked) and the lane pauses. */
1371
- export class LaneEnvironmentPauseError extends Error {
1372
- baseSha;
1373
- failingChecks;
1374
- failureSignature;
1375
- /** BUILD output was kept for `factory resume --from check` (#2564); runLane must not reap it. */
1376
- buildPreserved;
1377
- constructor(message, failure) {
1378
- super(message);
1379
- if (failure.buildPreserved !== undefined)
1380
- this.buildPreserved = failure.buildPreserved;
1381
- this.baseSha = failure.baseSha;
1382
- this.failingChecks = failure.failingChecks;
1383
- if (failure.failureSignature !== undefined)
1384
- this.failureSignature = failure.failureSignature;
1385
- }
1386
- }
1387
1371
  /** Resolves the stable lane URL a build/check agent should use, by probing whether
1388
1372
  * a factory proxy (started by `factory run`/`supervise` or `factory proxy`) is
1389
1373
  * currently alive for the configured domain. Never throws — an absent/dead proxy
@@ -2432,8 +2416,7 @@ async function cmdFactoryd(opts) {
2432
2416
  const previousUpdate = readUpdateState(updateFile);
2433
2417
  for (const stop of recoverStaleDrain(previousUpdate, (file) => {
2434
2418
  try {
2435
- unlinkSync(file);
2436
- return true;
2419
+ return clearSelfUpdateStop(file);
2437
2420
  }
2438
2421
  catch {
2439
2422
  return false;
@@ -2848,7 +2831,7 @@ export async function cmdResumeApproved(opts = {}) {
2848
2831
  }
2849
2832
  const USAGE_UNAVAILABLE_LINE = '[factory] supervise: usage signal unavailable — proceeding without resume gate (set FACTORY_USAGE_ESTIMATOR=1 to gate on the heuristic)';
2850
2833
  export async function superviseLoop(deps) {
2851
- const { cap, resumeAt, pollMs, watch = true, watchSource = 'default', repoConfigLabel, resumeAtSource = 'default', pollSource = 'default', estimator = false, stopFile, eventsFile, now, runQueue, readUsageFn = () => readUsage({ cap, estimator }), pathExists = existsSync, clearStop = (path) => rmSync(path, { force: true }), sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), emitEvent = logEvent, writeLine = (line) => console.log(line), ingest, } = deps;
2834
+ const { cap, resumeAt, pollMs, watch = true, watchSource = 'default', repoConfigLabel, resumeAtSource = 'default', pollSource = 'default', estimator = false, stopFile, eventsFile, now, runQueue, readUsageFn = () => readUsage({ cap, estimator }), pathExists = existsSync, clearStop = (path) => rmSync(path, { force: true }), readStopMarker: readMarker = readStopMarker, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), emitEvent = logEvent, writeLine = (line) => console.log(line), ingest, } = deps;
2852
2835
  let cycle = 0;
2853
2836
  if (resumeAtSource === 'flag') {
2854
2837
  const detail = 'usage watchdog threshold set by flag: --usage-threshold';
@@ -2896,7 +2879,15 @@ export async function superviseLoop(deps) {
2896
2879
  }
2897
2880
  }
2898
2881
  emitEvent(eventsFile, 'resumed', 'usage', `supervise cycle ${cycle}: trailing usage (${source}) at ${Math.round(pct * 100)}% of cap — starting run`);
2899
- clearStop(stopFile);
2882
+ const marker = readMarker(stopFile);
2883
+ if (marker?.source === 'usage-watchdog') {
2884
+ clearStop(stopFile);
2885
+ }
2886
+ else if (marker) {
2887
+ writeLine(`[factory] supervise: STOP set by ${marker.source}${marker.at ? ` at ${marker.at}` : ''}; waiting for factory resume`);
2888
+ while (pathExists(stopFile))
2889
+ await sleep(pollMs);
2890
+ }
2900
2891
  if (ingest) {
2901
2892
  const appended = await ingest();
2902
2893
  if (appended > 0)
@@ -2975,7 +2966,7 @@ function logEventQuietly(eventsFile, type, msg) {
2975
2966
  /** Creates the STOP file in one exclusive open (no check-then-write race). Returns false when it already existed. */
2976
2967
  function createStopFile(stopFile) {
2977
2968
  try {
2978
- writeFileSync(stopFile, '', { flag: 'wx' });
2969
+ writeFileSync(stopFile, formatStopMarker('manual'), { flag: 'wx' });
2979
2970
  return true;
2980
2971
  }
2981
2972
  catch (err) {