@a5c-ai/babysitter-sdk 5.1.1-staging.fee05906043b → 6.0.0

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 (100) hide show
  1. package/dist/cli/commands/detectExistingRun.d.ts.map +1 -1
  2. package/dist/cli/commands/detectExistingRun.js +32 -15
  3. package/dist/cli/commands/plugin/marketplaceCommands.js +3 -3
  4. package/dist/cli/commands/runIterate.d.ts +12 -0
  5. package/dist/cli/commands/runIterate.d.ts.map +1 -1
  6. package/dist/cli/commands/runIterate.js +27 -1
  7. package/dist/cli/main/argFlagParsers.d.ts.map +1 -1
  8. package/dist/cli/main/argFlagParsers.js +16 -1
  9. package/dist/cli/main/argPositionals.d.ts.map +1 -1
  10. package/dist/cli/main/argPositionals.js +1 -0
  11. package/dist/cli/main/dispatchHarness.d.ts.map +1 -1
  12. package/dist/cli/main/dispatchHarness.js +1 -0
  13. package/dist/cli/main/dispatchRunSession.d.ts.map +1 -1
  14. package/dist/cli/main/dispatchRunSession.js +5 -3
  15. package/dist/cli/main/program.js +2 -2
  16. package/dist/cli/main/runCommands.d.ts +1 -1
  17. package/dist/cli/main/runCommands.d.ts.map +1 -1
  18. package/dist/cli/main/runCommands.js +2 -1
  19. package/dist/cli/main/runCreate.d.ts +10 -0
  20. package/dist/cli/main/runCreate.d.ts.map +1 -1
  21. package/dist/cli/main/runCreate.js +93 -0
  22. package/dist/cli/main/taskCommands.d.ts.map +1 -1
  23. package/dist/cli/main/taskCommands.js +35 -1
  24. package/dist/cli/main/types.d.ts +3 -0
  25. package/dist/cli/main/types.d.ts.map +1 -1
  26. package/dist/cli/main/usage.d.ts.map +1 -1
  27. package/dist/cli/main/usage.js +4 -3
  28. package/dist/config/envContract.d.ts +12 -0
  29. package/dist/config/envContract.d.ts.map +1 -1
  30. package/dist/config/envContract.js +12 -0
  31. package/dist/config/executionPolicy.d.ts +26 -0
  32. package/dist/config/executionPolicy.d.ts.map +1 -0
  33. package/dist/config/executionPolicy.js +40 -0
  34. package/dist/config/index.d.ts +1 -0
  35. package/dist/config/index.d.ts.map +1 -1
  36. package/dist/config/index.js +6 -1
  37. package/dist/harness/adapterFallbackMetadata.d.ts.map +1 -1
  38. package/dist/harness/adapterFallbackMetadata.js +18 -0
  39. package/dist/harness/adapterMetadata.d.ts.map +1 -1
  40. package/dist/harness/adapterMetadata.js +12 -0
  41. package/dist/harness/adapters/genty.d.ts +12 -0
  42. package/dist/harness/adapters/genty.d.ts.map +1 -0
  43. package/dist/harness/adapters/genty.js +41 -0
  44. package/dist/harness/adapters/hermes.d.ts +7 -0
  45. package/dist/harness/adapters/hermes.d.ts.map +1 -0
  46. package/dist/harness/adapters/hermes.js +32 -0
  47. package/dist/harness/adapters/index.d.ts +2 -0
  48. package/dist/harness/adapters/index.d.ts.map +1 -1
  49. package/dist/harness/adapters/index.js +5 -1
  50. package/dist/harness/adapters/pi.js +5 -5
  51. package/dist/harness/hooks/stopHookHandler.js +1 -1
  52. package/dist/harness/index.d.ts +1 -0
  53. package/dist/harness/index.d.ts.map +1 -1
  54. package/dist/harness/index.js +3 -1
  55. package/dist/harness/install.d.ts.map +1 -1
  56. package/dist/harness/install.js +16 -4
  57. package/dist/harness/registry.d.ts +2 -0
  58. package/dist/harness/registry.d.ts.map +1 -1
  59. package/dist/harness/registry.js +33 -2
  60. package/dist/harness/types.d.ts +2 -0
  61. package/dist/harness/types.d.ts.map +1 -1
  62. package/dist/index.d.ts +1 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +1 -0
  65. package/dist/processLibrary/forkJoin.d.ts +51 -0
  66. package/dist/processLibrary/forkJoin.d.ts.map +1 -0
  67. package/dist/processLibrary/forkJoin.js +63 -0
  68. package/dist/processLibrary/versioning.d.ts +56 -0
  69. package/dist/processLibrary/versioning.d.ts.map +1 -0
  70. package/dist/processLibrary/versioning.js +142 -0
  71. package/dist/prompts/templates/commands/blueprints.md +2 -2
  72. package/dist/runtime/intrinsics/breakpoint.d.ts.map +1 -1
  73. package/dist/runtime/intrinsics/breakpoint.js +17 -1
  74. package/dist/runtime/runArchival.d.ts +32 -0
  75. package/dist/runtime/runArchival.d.ts.map +1 -0
  76. package/dist/runtime/runArchival.js +148 -0
  77. package/dist/runtime/runDiff.d.ts +44 -0
  78. package/dist/runtime/runDiff.d.ts.map +1 -0
  79. package/dist/runtime/runDiff.js +71 -0
  80. package/dist/runtime/runForking.d.ts +44 -0
  81. package/dist/runtime/runForking.d.ts.map +1 -0
  82. package/dist/runtime/runForking.js +50 -0
  83. package/dist/storage/createRunDir.d.ts.map +1 -1
  84. package/dist/storage/createRunDir.js +1 -0
  85. package/dist/storage/types.d.ts +8 -0
  86. package/dist/storage/types.d.ts.map +1 -1
  87. package/dist/tasks/fetchProcessor.d.ts +44 -0
  88. package/dist/tasks/fetchProcessor.d.ts.map +1 -0
  89. package/dist/tasks/fetchProcessor.js +114 -0
  90. package/dist/tasks/index.d.ts +1 -0
  91. package/dist/tasks/index.d.ts.map +1 -1
  92. package/dist/tasks/index.js +1 -0
  93. package/dist/tasks/jsRepl.d.ts +29 -0
  94. package/dist/tasks/jsRepl.d.ts.map +1 -0
  95. package/dist/tasks/jsRepl.js +110 -0
  96. package/dist/tasks/structuredOutput.d.ts +42 -0
  97. package/dist/tasks/structuredOutput.d.ts.map +1 -0
  98. package/dist/tasks/structuredOutput.js +137 -0
  99. package/dist/utils/compressContext.js +2 -2
  100. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"detectExistingRun.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/detectExistingRun.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0B9E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAiB3E"}
1
+ {"version":3,"file":"detectExistingRun.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/detectExistingRun.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAsC9E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,CAiB3E"}
@@ -38,32 +38,49 @@ exports.formatExistingRunBlock = formatExistingRunBlock;
38
38
  const node_fs_1 = require("node:fs");
39
39
  const path = __importStar(require("node:path"));
40
40
  const config_1 = require("../../config");
41
+ /**
42
+ * How many of the most-recent runs to inspect. Because we now skip completed
43
+ * and cross-project runs, the first parseable match may not be the very latest
44
+ * directory, so we scan a window rather than only the top entry.
45
+ */
46
+ const SCAN_WINDOW = 25;
41
47
  async function detectExistingRun() {
42
48
  try {
43
49
  const runsDir = (0, config_1.resolveRunsDir)();
50
+ const currentCwd = path.resolve(process.cwd());
44
51
  const entries = await node_fs_1.promises.readdir(runsDir, { withFileTypes: true });
45
52
  const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort().reverse();
46
- for (const runId of dirs.slice(0, 5)) {
53
+ for (const runId of dirs.slice(0, SCAN_WINDOW)) {
47
54
  const runFile = path.join(runsDir, runId, "run.json");
55
+ let meta;
48
56
  try {
49
- const raw = await node_fs_1.promises.readFile(runFile, "utf8");
50
- const meta = JSON.parse(raw);
51
- const entrypoint = meta["entrypoint"];
52
- const processId = meta["processId"] ?? "";
53
- const isBareRun = entrypoint?.importPath === "bare-run";
54
- return {
55
- runId,
56
- runDir: path.join(runsDir, runId),
57
- processId,
58
- isBareRun,
59
- entrypoint: { importPath: entrypoint?.importPath ?? "", exportName: entrypoint?.exportName },
60
- completionProof: meta["completionProof"]
61
- ?? meta["metadata"]?.["completionProof"],
62
- };
57
+ meta = JSON.parse(await node_fs_1.promises.readFile(runFile, "utf8"));
63
58
  }
64
59
  catch {
65
60
  continue;
66
61
  }
62
+ // A run that already carries a completion proof is finished — it is never
63
+ // an "existing run to resume", so it must not be surfaced as overlap state.
64
+ const completionProof = meta["completionProof"]
65
+ ?? meta["metadata"]?.["completionProof"];
66
+ if (completionProof)
67
+ continue;
68
+ // Project scoping: when the run recorded the cwd it was created in, only
69
+ // surface it if that matches the current working directory. Runs from
70
+ // other projects/worktrees share the global runs dir and must not leak in.
71
+ const recordedCwd = meta["cwd"];
72
+ if (recordedCwd && path.resolve(recordedCwd) !== currentCwd)
73
+ continue;
74
+ const entrypoint = meta["entrypoint"];
75
+ const processId = meta["processId"] ?? "";
76
+ const isBareRun = entrypoint?.importPath === "bare-run";
77
+ return {
78
+ runId,
79
+ runDir: path.join(runsDir, runId),
80
+ processId,
81
+ isBareRun,
82
+ entrypoint: { importPath: entrypoint?.importPath ?? "", exportName: entrypoint?.exportName },
83
+ };
67
84
  }
68
85
  }
69
86
  catch { /* no runs dir */ }
@@ -86,14 +86,14 @@ async function handlePluginUpdateMarketplace(args) {
86
86
  async function handlePluginListPlugins(args) {
87
87
  const { scope, json } = args;
88
88
  let { marketplaceName } = args;
89
- if (!(0, shared_1.requireScope)(scope, 'plugin:list-plugins', json)) {
89
+ if (!(0, shared_1.requireScope)(scope, 'plugin:list-blueprints', json)) {
90
90
  return 1;
91
91
  }
92
92
  const projectDir = (0, shared_1.getProjectDir)(scope);
93
93
  if (!marketplaceName) {
94
94
  marketplaceName = await (0, shared_1.autoResolveMarketplace)(scope, projectDir) ?? undefined;
95
95
  }
96
- const name = (0, shared_1.requireArg)(marketplaceName, '--marketplace-name', 'plugin:list-plugins', json);
96
+ const name = (0, shared_1.requireArg)(marketplaceName, '--marketplace-name', 'plugin:list-blueprints', json);
97
97
  if (!name) {
98
98
  return 1;
99
99
  }
@@ -109,6 +109,6 @@ async function handlePluginListPlugins(args) {
109
109
  }
110
110
  catch (error) {
111
111
  const message = error instanceof Error ? error.message : String(error);
112
- return emitError('plugin:list-plugins', json, 'list_failed', message);
112
+ return emitError('plugin:list-blueprints', json, 'list_failed', message);
113
113
  }
114
114
  }
@@ -10,6 +10,18 @@
10
10
  * The command does NOT loop - it handles exactly one iteration.
11
11
  */
12
12
  import type { EffectAction } from "../../runtime/types";
13
+ /**
14
+ * Pin the active harness adapter to the harness recorded in run.json so that
15
+ * run:iterate honors the run's recorded harness instead of re-detecting it from
16
+ * the ambient environment (issue #949). Re-detection is unreliable: a run
17
+ * created with `--harness claude-code` could otherwise resolve a different
18
+ * harness (e.g. one whose caller env vars happen to be set), then hard-fail on
19
+ * adapter resolution. Falls through to the existing env-based detection when no
20
+ * harness is recorded or the recorded harness is unknown to the registry.
21
+ *
22
+ * @returns true when the active adapter was pinned to the recorded harness.
23
+ */
24
+ export declare function pinActiveAdapterToRecordedHarness(harness: string | undefined): boolean;
13
25
  export interface RunIterateOptions {
14
26
  runDir: string;
15
27
  iteration?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"runIterate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/runIterate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAe/E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAChD,8FAA8F;IAC9F,wBAAwB,CAAC,EAAE;QACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,UAAU,EAAE,YAAY,EAAE,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkQtF"}
1
+ {"version":3,"file":"runIterate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/runIterate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,qBAAqB,CAAC;AAgB/E;;;;;;;;;;GAUG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMtF;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAChD,8FAA8F;IAC9F,wBAAwB,CAAC,EAAE;QACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,UAAU,EAAE,YAAY,EAAE,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuQtF"}
@@ -11,6 +11,7 @@
11
11
  * The command does NOT loop - it handles exactly one iteration.
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.pinActiveAdapterToRecordedHarness = pinActiveAdapterToRecordedHarness;
14
15
  exports.runIterate = runIterate;
15
16
  const runFiles_1 = require("../../storage/runFiles");
16
17
  const journal_1 = require("../../storage/journal");
@@ -23,11 +24,36 @@ const config_1 = require("../../config");
23
24
  const processCodeHash_1 = require("../../runtime/processCodeHash");
24
25
  const runIterateHelpers_1 = require("./runIterateHelpers");
25
26
  const externalAgentEffect_1 = require("../../harness/hooks/externalAgentEffect");
27
+ const harness_1 = require("../../harness");
28
+ /**
29
+ * Pin the active harness adapter to the harness recorded in run.json so that
30
+ * run:iterate honors the run's recorded harness instead of re-detecting it from
31
+ * the ambient environment (issue #949). Re-detection is unreliable: a run
32
+ * created with `--harness claude-code` could otherwise resolve a different
33
+ * harness (e.g. one whose caller env vars happen to be set), then hard-fail on
34
+ * adapter resolution. Falls through to the existing env-based detection when no
35
+ * harness is recorded or the recorded harness is unknown to the registry.
36
+ *
37
+ * @returns true when the active adapter was pinned to the recorded harness.
38
+ */
39
+ function pinActiveAdapterToRecordedHarness(harness) {
40
+ if (!harness)
41
+ return false;
42
+ const adapter = (0, harness_1.getAdapterByName)(harness);
43
+ if (!adapter)
44
+ return false;
45
+ (0, harness_1.setAdapter)(adapter);
46
+ return true;
47
+ }
26
48
  async function runIterate(options) {
27
49
  const { runDir, verbose } = options;
28
50
  // Read run metadata
29
51
  const metadata = await (0, runFiles_1.readRunMetadata)(runDir);
30
52
  const runId = metadata.runId;
53
+ // Honor the harness recorded at run-creation time over ambient env detection
54
+ // (issue #949). Without this, orchestrateIteration's lazy getAdapter() could
55
+ // resolve a different harness from the environment and hard-fail.
56
+ pinActiveAdapterToRecordedHarness(metadata.harness);
31
57
  // Determine iteration number from state cache or journal
32
58
  const iterationCount = await (0, runIterateHelpers_1.detectIterationCount)(runDir);
33
59
  const iteration = options.iteration ?? (iterationCount + 1);
@@ -60,7 +86,7 @@ async function runIterate(options) {
60
86
  runDir,
61
87
  ...(subprocessSupport ? { subprocessSupport } : {}),
62
88
  });
63
- if (iterationResult.status === "waiting") {
89
+ if (iterationResult.status === "waiting" && (0, config_1.crossSubagentsEnabled)()) {
64
90
  const externalResolution = await (0, externalAgentEffect_1.resolveExternalAgentEffectsForRun)({
65
91
  runDir,
66
92
  workspace: projectRoot,
@@ -1 +1 @@
1
- {"version":3,"file":"argFlagParsers.d.ts","sourceRoot":"","sources":["../../../src/cli/main/argFlagParsers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AA6ChF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAoTnD,CAAC"}
1
+ {"version":3,"file":"argFlagParsers.d.ts","sourceRoot":"","sources":["../../../src/cli/main/argFlagParsers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AA6ChF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAmUnD,CAAC"}
@@ -68,6 +68,14 @@ exports.FLAG_PARSERS = {
68
68
  parsed.patchEffect = expectFlagValue(args, index + 1, "--patch-effect");
69
69
  return index + 1;
70
70
  },
71
+ "--final-status": (parsed, args, index) => {
72
+ const value = expectFlagValue(args, index + 1, "--final-status").toLowerCase();
73
+ if (value !== "completed" && value !== "failed") {
74
+ throw new Error(`--final-status must be "completed" or "failed" (received: ${value})`);
75
+ }
76
+ parsed.haltFinalStatus = value;
77
+ return index + 1;
78
+ },
71
79
  "--status": (parsed, args, index) => {
72
80
  parsed.taskStatus = parseStatus(expectFlagValue(args, index + 1, "--status"));
73
81
  return index + 1;
@@ -163,6 +171,10 @@ exports.FLAG_PARSERS = {
163
171
  parsed.workspace = expectFlagValue(args, index + 1, "--workspace");
164
172
  return index + 1;
165
173
  },
174
+ "--tag": (parsed, args, index) => {
175
+ parsed.tag = expectFlagValue(args, index + 1, "--tag");
176
+ return index + 1;
177
+ },
166
178
  "--daemon-dir": (parsed, args, index) => {
167
179
  parsed.daemonDir = expectFlagValue(args, index + 1, "--daemon-dir");
168
180
  return index + 1;
@@ -324,7 +336,10 @@ exports.FLAG_PARSERS = {
324
336
  return index + 1;
325
337
  },
326
338
  "--reason": (parsed, args, index) => {
327
- parsed.cancelReason = expectFlagValue(args, index + 1, "--reason");
339
+ const value = expectFlagValue(args, index + 1, "--reason");
340
+ // Shared by task:cancel (cancelReason) and run:halt (haltReason).
341
+ parsed.cancelReason = value;
342
+ parsed.haltReason = value;
328
343
  return index + 1;
329
344
  },
330
345
  "--action": (parsed, args, index) => {
@@ -1 +1 @@
1
- {"version":3,"file":"argPositionals.d.ts","sourceRoot":"","sources":["../../../src/cli/main/argPositionals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAkG5E"}
1
+ {"version":3,"file":"argPositionals.d.ts","sourceRoot":"","sources":["../../../src/cli/main/argPositionals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAmG5E"}
@@ -21,6 +21,7 @@ function applyPositionalArgs(parsed, positionals) {
21
21
  case "run:rebuild-state":
22
22
  case "run:repair-journal":
23
23
  case "run:recover-process-error":
24
+ case "run:halt":
24
25
  [parsed.runDirArg] = positionals;
25
26
  return;
26
27
  case "configure":
@@ -1 +1 @@
1
- {"version":3,"file":"dispatchHarness.d.ts","sourceRoot":"","sources":["../../../src/cli/main/dispatchHarness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAe1C,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA0DhG"}
1
+ {"version":3,"file":"dispatchHarness.d.ts","sourceRoot":"","sources":["../../../src/cli/main/dispatchHarness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAe1C,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2DhG"}
@@ -63,6 +63,7 @@ async function executeHarnessInfraCommand(parsed) {
63
63
  return await (0, install_1.handleHarnessInstallPlugin)({
64
64
  harnessName: parsed.positional?.[0],
65
65
  workspace: parsed.workspace,
66
+ tag: parsed.tag,
66
67
  json: parsed.json,
67
68
  dryRun: parsed.dryRun,
68
69
  verbose: parsed.verbose,
@@ -1 +1 @@
1
- {"version":3,"file":"dispatchRunSession.d.ts","sourceRoot":"","sources":["../../../src/cli/main/dispatchRunSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAqD1C,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM9F"}
1
+ {"version":3,"file":"dispatchRunSession.d.ts","sourceRoot":"","sources":["../../../src/cli/main/dispatchRunSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAsD1C,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAM9F"}
@@ -74,6 +74,8 @@ async function executeRunTaskCommand(parsed) {
74
74
  return await (0, runCommands_1.handleRunRepairJournal)(parsed);
75
75
  case "run:recover-process-error":
76
76
  return await (0, runCommands_1.handleRunRecoverProcessError)(parsed);
77
+ case "run:halt":
78
+ return await (0, runCommands_1.handleRunHalt)(parsed);
77
79
  case "run:status":
78
80
  return await (0, runCommands_1.handleRunStatus)(parsed);
79
81
  case "run:iterate":
@@ -301,7 +303,7 @@ async function executeSupportCommand(parsed) {
301
303
  return await (0, plugin_1.handlePluginAddMarketplace)(args);
302
304
  case "plugin:update-marketplace":
303
305
  return await (0, plugin_1.handlePluginUpdateMarketplace)(args);
304
- case "plugin:list-plugins":
306
+ case "plugin:list-blueprints":
305
307
  return await (0, plugin_1.handlePluginListPlugins)(args);
306
308
  case "plugin:install":
307
309
  return await (0, plugin_1.handlePluginInstall)(args);
@@ -325,7 +327,7 @@ function normalizeBlueprintCommand(command) {
325
327
  switch (command) {
326
328
  case "blueprints:list":
327
329
  case "blueprints:marketplace":
328
- return "plugin:list-plugins";
330
+ return "plugin:list-blueprints";
329
331
  case "blueprints:add-marketplace":
330
332
  return "plugin:add-marketplace";
331
333
  case "blueprints:update-marketplace":
@@ -345,7 +347,7 @@ function normalizeBlueprintCommand(command) {
345
347
  }
346
348
  function toBlueprintCommand(command) {
347
349
  switch (command) {
348
- case "plugin:list-plugins":
350
+ case "plugin:list-blueprints":
349
351
  return "blueprints:list";
350
352
  case "plugin:add-marketplace":
351
353
  return "blueprints:add-marketplace";
@@ -51,7 +51,7 @@ exports.HARNESS_INSTALL_COMMANDS = [
51
51
  "harness:install-plugin",
52
52
  ];
53
53
  const SHARED_VALID_COMMANDS = [
54
- "run:create", "run:assign-process", "run:status", "run:iterate", "run:events", "run:rebuild-state", "run:repair-journal", "run:recover-process-error",
54
+ "run:create", "run:assign-process", "run:status", "run:iterate", "run:events", "run:rebuild-state", "run:repair-journal", "run:recover-process-error", "run:halt",
55
55
  "task:post", "task:cancel", "task:list", "task:show",
56
56
  "log", "hook:log", "hook:run", "skill:discover", "skill:fetch-remote",
57
57
  "process-library:clone", "process-library:update", "process-library:use", "process-library:active",
@@ -60,7 +60,7 @@ const SHARED_VALID_COMMANDS = [
60
60
  "blueprints:list-installed", "blueprints:marketplace", "blueprints:add-marketplace", "blueprints:update-marketplace",
61
61
  "blueprints:update-registry", "blueprints:remove-from-registry",
62
62
  "plugin:install", "plugin:uninstall", "plugin:update", "plugin:configure", "plugin:list-installed",
63
- "plugin:list-plugins", "plugin:add-marketplace", "plugin:update-marketplace", "plugin:update-registry",
63
+ "plugin:list-blueprints", "plugin:add-marketplace", "plugin:update-marketplace", "plugin:update-registry",
64
64
  "plugin:remove-from-registry", "instructions:babysit-skill", "instructions:process-create", "instructions:orchestrate",
65
65
  "instructions:breakpoint-handling", "health", "configure", "tokens:stats", "compression:status", "compression:toggle",
66
66
  "compression:set", "compression:reset", "compress-output", "breakpoint:approve-rule", "breakpoint:remove-rule",
@@ -1,4 +1,4 @@
1
- export { handleRunCreate, handleRunRebuildState, handleRunRecoverProcessError, handleRunRepairJournal, } from "./runCreate";
1
+ export { handleRunCreate, handleRunRebuildState, handleRunRecoverProcessError, handleRunRepairJournal, handleRunHalt, } from "./runCreate";
2
2
  export { handleRunAssignProcess } from "./runAssignProcess";
3
3
  export { handleRunEvents, handleRunIterate, handleRunStatus } from "./runInspection";
4
4
  //# sourceMappingURL=runCommands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/main/runCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"runCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/main/runCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handleRunStatus = exports.handleRunIterate = exports.handleRunEvents = exports.handleRunAssignProcess = exports.handleRunRepairJournal = exports.handleRunRecoverProcessError = exports.handleRunRebuildState = exports.handleRunCreate = void 0;
3
+ exports.handleRunStatus = exports.handleRunIterate = exports.handleRunEvents = exports.handleRunAssignProcess = exports.handleRunHalt = exports.handleRunRepairJournal = exports.handleRunRecoverProcessError = exports.handleRunRebuildState = exports.handleRunCreate = void 0;
4
4
  var runCreate_1 = require("./runCreate");
5
5
  Object.defineProperty(exports, "handleRunCreate", { enumerable: true, get: function () { return runCreate_1.handleRunCreate; } });
6
6
  Object.defineProperty(exports, "handleRunRebuildState", { enumerable: true, get: function () { return runCreate_1.handleRunRebuildState; } });
7
7
  Object.defineProperty(exports, "handleRunRecoverProcessError", { enumerable: true, get: function () { return runCreate_1.handleRunRecoverProcessError; } });
8
8
  Object.defineProperty(exports, "handleRunRepairJournal", { enumerable: true, get: function () { return runCreate_1.handleRunRepairJournal; } });
9
+ Object.defineProperty(exports, "handleRunHalt", { enumerable: true, get: function () { return runCreate_1.handleRunHalt; } });
9
10
  var runAssignProcess_1 = require("./runAssignProcess");
10
11
  Object.defineProperty(exports, "handleRunAssignProcess", { enumerable: true, get: function () { return runAssignProcess_1.handleRunAssignProcess; } });
11
12
  var runInspection_1 = require("./runInspection");
@@ -3,4 +3,14 @@ export declare function handleRunCreate(parsed: ParsedArgs): Promise<number>;
3
3
  export declare function handleRunRebuildState(parsed: ParsedArgs): Promise<number>;
4
4
  export declare function handleRunRepairJournal(parsed: ParsedArgs): Promise<number>;
5
5
  export declare function handleRunRecoverProcessError(parsed: ParsedArgs): Promise<number>;
6
+ /**
7
+ * run:halt — operator-driven seal of a divergent run.
8
+ *
9
+ * Writes a synthetic terminal event (RUN_COMPLETED or RUN_FAILED) with the
10
+ * correct seq + ulid, copies the completionProof from run.json, records the
11
+ * --reason for audit (manual_seal_reason), and rebuilds the state cache so the
12
+ * run reaches a clean terminal state without hand-crafting journal files.
13
+ * See issue #880.
14
+ */
15
+ export declare function handleRunHalt(parsed: ParsedArgs): Promise<number>;
6
16
  //# sourceMappingURL=runCreate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runCreate.d.ts","sourceRoot":"","sources":["../../../src/cli/main/runCreate.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA0NzE;AA2BD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC/E;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGhF;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFtF"}
1
+ {"version":3,"file":"runCreate.d.ts","sourceRoot":"","sources":["../../../src/cli/main/runCreate.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA0NzE;AA2BD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC/E;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiGhF;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFtF;AAID;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFvE"}
@@ -37,6 +37,7 @@ exports.handleRunCreate = handleRunCreate;
37
37
  exports.handleRunRebuildState = handleRunRebuildState;
38
38
  exports.handleRunRepairJournal = handleRunRepairJournal;
39
39
  exports.handleRunRecoverProcessError = handleRunRecoverProcessError;
40
+ exports.handleRunHalt = handleRunHalt;
40
41
  const crypto = __importStar(require("node:crypto"));
41
42
  const node_fs_1 = require("node:fs");
42
43
  const path = __importStar(require("node:path"));
@@ -496,6 +497,98 @@ async function handleRunRecoverProcessError(parsed) {
496
497
  }
497
498
  return 0;
498
499
  }
500
+ const TERMINAL_EVENT_TYPES = new Set(["RUN_COMPLETED", "RUN_FAILED", "RUN_HALTED"]);
501
+ /**
502
+ * run:halt — operator-driven seal of a divergent run.
503
+ *
504
+ * Writes a synthetic terminal event (RUN_COMPLETED or RUN_FAILED) with the
505
+ * correct seq + ulid, copies the completionProof from run.json, records the
506
+ * --reason for audit (manual_seal_reason), and rebuilds the state cache so the
507
+ * run reaches a clean terminal state without hand-crafting journal files.
508
+ * See issue #880.
509
+ */
510
+ async function handleRunHalt(parsed) {
511
+ if (!parsed.runDirArg) {
512
+ console.error(usage_1.USAGE);
513
+ return 1;
514
+ }
515
+ const runDir = (0, args_1.resolveRunDir)(parsed.runsDir, parsed.runDirArg);
516
+ const reason = parsed.haltReason ?? "manual_halt";
517
+ const finalStatus = parsed.haltFinalStatus ?? "completed";
518
+ const eventType = finalStatus === "completed" ? "RUN_COMPLETED" : "RUN_FAILED";
519
+ (0, runSupport_1.logVerbose)("run:halt", parsed, { runDir, reason, finalStatus, dryRun: parsed.dryRun, json: parsed.json });
520
+ const metadata = await (0, runState_1.readRunMetadataSafe)(runDir, "run:halt");
521
+ if (!metadata)
522
+ return 1;
523
+ const completionProof = typeof metadata.completionProof === "string" ? metadata.completionProof : null;
524
+ // Detect whether the run is already sealed (audit only — halting is a
525
+ // deliberate operator override, so an existing terminal event does not block).
526
+ let alreadyTerminal = null;
527
+ try {
528
+ const events = await (0, journal_1.loadJournal)(runDir);
529
+ for (let i = events.length - 1; i >= 0; i -= 1) {
530
+ if (TERMINAL_EVENT_TYPES.has(events[i].type)) {
531
+ alreadyTerminal = events[i].type;
532
+ break;
533
+ }
534
+ }
535
+ }
536
+ catch {
537
+ // No/again-unreadable journal — proceed; appendEvent will create it.
538
+ }
539
+ if (parsed.dryRun) {
540
+ const plan = { dryRun: true, runDir, plan: "halt_run", eventType, finalStatus, reason, completionProof, alreadyTerminal };
541
+ if (parsed.json) {
542
+ console.log(JSON.stringify(plan, null, 2));
543
+ }
544
+ else {
545
+ console.log(`[run:halt] dry-run runDir=${runDir} eventType=${eventType} reason=${reason}` + (alreadyTerminal ? ` (already ${alreadyTerminal})` : ""));
546
+ }
547
+ return 0;
548
+ }
549
+ try {
550
+ const eventData = { manual_seal_reason: reason, completionProof };
551
+ if (finalStatus === "failed") {
552
+ eventData.error = { name: "ManualHalt", message: reason };
553
+ }
554
+ const appended = await (0, journal_1.appendEvent)({ runDir, eventType, event: eventData });
555
+ const snapshot = await (0, stateCache_1.rebuildStateCache)(runDir, { reason: "manual_halt" });
556
+ const metadataOut = {
557
+ pendingEffectsByKind: snapshot.pendingEffectsByKind,
558
+ stateVersion: snapshot.stateVersion,
559
+ journalHead: snapshot.journalHead ?? null,
560
+ stateRebuilt: true,
561
+ stateRebuildReason: snapshot.rebuildReason ?? undefined,
562
+ };
563
+ const formatted = (0, runState_1.formatIterationMetadata)(metadataOut);
564
+ const summary = {
565
+ runDir,
566
+ halted: true,
567
+ finalStatus,
568
+ reason,
569
+ completionProof,
570
+ alreadyTerminal,
571
+ event: { seq: appended.seq, ulid: appended.ulid, type: eventType, recordedAt: appended.recordedAt },
572
+ metadata: formatted.jsonMetadata ?? null,
573
+ };
574
+ if (parsed.json) {
575
+ console.log(JSON.stringify(summary, null, 2));
576
+ }
577
+ else {
578
+ const suffix = formatted.textParts.length ? ` ${formatted.textParts.join(" ")}` : "";
579
+ console.log(`[run:halt] halted runDir=${runDir} finalStatus=${finalStatus} seq=${appended.seq} reason=${reason}${suffix}`);
580
+ }
581
+ return 0;
582
+ }
583
+ catch (error) {
584
+ const message = error instanceof Error ? error.message : String(error);
585
+ console.error(`[run:halt] ${message}`);
586
+ if (parsed.json) {
587
+ console.log(JSON.stringify({ error: "HALT_FAILED", message }, null, 2));
588
+ }
589
+ return 1;
590
+ }
591
+ }
499
592
  function findLatestProcessRuntimeError(events) {
500
593
  for (let index = events.length - 1; index >= 0; index -= 1) {
501
594
  if (events[index].type === "PROCESS_RUNTIME_ERROR")
@@ -1 +1 @@
1
- {"version":3,"file":"taskCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/main/taskCommands.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAqF1C,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwIxE;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B1E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCxE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDxE"}
1
+ {"version":3,"file":"taskCommands.d.ts","sourceRoot":"","sources":["../../../src/cli/main/taskCommands.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAqH1C,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwIxE;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA4B1E;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCxE;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDxE"}
@@ -95,6 +95,40 @@ async function readJsonFile(runDir, filename) {
95
95
  const trimmed = raw.trim();
96
96
  return trimmed.length ? JSON.parse(trimmed) : undefined;
97
97
  }
98
+ /**
99
+ * Read the `--error` file for `task:post --status error`.
100
+ *
101
+ * #936: callers (notably genty's in-process DefaultOrchestrationProvider) may
102
+ * write a bare, NON-JSON error string (e.g. `Error: Effect failed`) into this
103
+ * file. JSON.parsing it unguarded produced the cryptic
104
+ * `Unexpected token 'E', "Error: Effect failed" is not valid JSON`
105
+ * SyntaxError categorized as an internal "please report as a bug" failure, and
106
+ * — because the post then exited non-zero — spun the orchestration loop to its
107
+ * 80-minute timeout. Here we tolerate a plain-text error: if the file is not
108
+ * valid JSON, wrap it as a structured `{ name, message }` error payload so the
109
+ * failure surfaces the real message and the run can fail promptly. Valid JSON
110
+ * (a structured error) still round-trips unchanged.
111
+ */
112
+ async function readErrorFile(runDir, filename) {
113
+ if (!filename)
114
+ return undefined;
115
+ const raw = filename === "-"
116
+ ? await (0, runSupport_1.readStdinUtf8)()
117
+ : await node_fs_1.promises.readFile(resolveMaybeRunRelative(runDir, filename), "utf8");
118
+ const trimmed = raw.trim();
119
+ if (!trimmed.length)
120
+ return undefined;
121
+ try {
122
+ return JSON.parse(trimmed);
123
+ }
124
+ catch {
125
+ // Not JSON — treat the file contents as the error message itself. Strip a
126
+ // leading "Error: " prefix (the result of String(new Error(message))) so
127
+ // the surfaced message is the underlying failure, not doubled.
128
+ const message = trimmed.replace(/^Error:\s*/, "");
129
+ return { name: "Error", message };
130
+ }
131
+ }
98
132
  function readInlineJson(raw) {
99
133
  if (!raw)
100
134
  return undefined;
@@ -164,7 +198,7 @@ async function handleTaskPost(parsed) {
164
198
  const stdout = parsed.stdoutFile ? await readTextFile(runDir, parsed.stdoutFile) : undefined;
165
199
  const stderr = parsed.stderrFile ? await readTextFile(runDir, parsed.stderrFile) : undefined;
166
200
  const errorPayload = parsed.taskStatus === "error"
167
- ? (await readJsonFile(runDir, parsed.errorPath)) ?? { name: "Error", message: "Task reported failure" }
201
+ ? (await readErrorFile(runDir, parsed.errorPath)) ?? { name: "Error", message: "Task reported failure" }
168
202
  : undefined;
169
203
  const value = parsed.taskStatus === "ok"
170
204
  ? parsed.valueInline
@@ -89,6 +89,7 @@ export interface ParsedArgs {
89
89
  costRunId?: string;
90
90
  positional?: string[];
91
91
  workspace?: string;
92
+ tag?: string;
92
93
  model?: string;
93
94
  interactive?: boolean;
94
95
  retrospectAll?: boolean;
@@ -104,6 +105,8 @@ export interface ParsedArgs {
104
105
  breakpointExpert?: string;
105
106
  cancelReason?: string;
106
107
  patchEffect?: string;
108
+ haltReason?: string;
109
+ haltFinalStatus?: "completed" | "failed";
107
110
  verbosity?: string;
108
111
  tuiFlag?: boolean;
109
112
  daemonDir?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/main/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/main/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/cli/main/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AA8I1D,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,UAAyB,GAAG,MAAM,CAa5F;AAED,eAAO,MAAM,WAAW,QAAqC,CAAC;AAC9D,eAAO,MAAM,WAAW,QAAqC,CAAC;AAC9D,eAAO,MAAM,KAAK,QAAc,CAAC"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../../src/cli/main/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AA+I1D,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,UAAyB,GAAG,MAAM,CAa5F;AAED,eAAO,MAAM,WAAW,QAAqC,CAAC;AAC9D,eAAO,MAAM,WAAW,QAAqC,CAAC;AAC9D,eAAO,MAAM,KAAK,QAAc,CAAC"}
@@ -11,6 +11,7 @@ function coreAgentUsage(commandName) {
11
11
  ${commandName} run:rebuild-state <runDir> [--json] [--dry-run]
12
12
  ${commandName} run:repair-journal <runDir> [--json] [--dry-run]
13
13
  ${commandName} run:recover-process-error <runDir> [--patch-effect <effectId>:<jsonPath>=<json>] [--json] [--dry-run]
14
+ ${commandName} run:halt <runDir> [--reason <text>] [--final-status completed|failed] [--json] [--dry-run]
14
15
  ${commandName} run:iterate <runDir> [--json] [--verbose] [--iteration <n>]
15
16
  ${commandName} task:post <runDir> <effectId> --status <ok|error> [--json] [--dry-run] [--value <file>] [--value-inline <json>] [--error <file>] [--stdout-ref <ref>] [--stderr-ref <ref>] [--stdout-file <file>] [--stderr-file <file>] [--started-at <iso8601>] [--finished-at <iso8601>] [--metadata <file>] [--invocation-key <key>]
16
17
  ${commandName} task:list <runDir> [--pending] [--kind <kind>] [--json]
@@ -33,7 +34,7 @@ function coreAgentUsage(commandName) {
33
34
  ${commandName} profile:render --user|--project [--dir <dir>] [--json]
34
35
  ${commandName} instructions:babysit-skill [--harness <name>] [--interactive|--no-interactive] [--json]
35
36
  ${commandName} harness:install <name> [--workspace <dir>] [--json] [--dry-run] [--verbose]
36
- ${commandName} harness:install-plugin <name> [--workspace <dir>] [--json] [--dry-run] [--verbose]`;
37
+ ${commandName} harness:install-plugin <name> [--workspace <dir>] [--tag <dist-tag>] [--json] [--dry-run] [--verbose]`;
37
38
  }
38
39
  function coreHumanUsage(commandName) {
39
40
  return ` ${commandName} log --type <process|hook|cli> --message <msg> [--run-id <id>] [--label <label>] [--level <level>] [--source <src>] [--json]
@@ -64,14 +65,14 @@ function coreHumanUsage(commandName) {
64
65
  ${commandName} blueprints:update-marketplace --marketplace-name <name> [--marketplace-branch <ref>] [--global|--project] [--json] [--verbose]
65
66
  ${commandName} blueprints:update-registry [<name>] [--plugin-name <name>] [--plugin-version <ver>] [--global|--project] [--json] [--verbose]
66
67
  ${commandName} blueprints:remove-from-registry [<name>] [--plugin-name <name>] [--global|--project] [--json] [--verbose]
67
- Deprecated aliases: plugin:install, plugin:uninstall, plugin:update, plugin:configure, plugin:list-installed, plugin:list-plugins, plugin:add-marketplace, plugin:update-marketplace, plugin:update-registry, plugin:remove-from-registry.
68
+ Deprecated aliases: plugin:install, plugin:uninstall, plugin:update, plugin:configure, plugin:list-installed, plugin:list-blueprints, plugin:add-marketplace, plugin:update-marketplace, plugin:update-registry, plugin:remove-from-registry.
68
69
  ${commandName} tokens:stats [runId] [--all] [--json]
69
70
  ${commandName} compression:status [--json]
70
71
  ${commandName} compression:toggle <layer> <on|off> [--json]
71
72
  ${commandName} compression:set <layer.key> <value> [--json]
72
73
  ${commandName} compression:reset [--json]
73
74
  ${commandName} harness:install <name> [--workspace <dir>] [--json] [--dry-run] [--verbose]
74
- ${commandName} harness:install-plugin <name> [--workspace <dir>] [--json] [--dry-run] [--verbose]
75
+ ${commandName} harness:install-plugin <name> [--workspace <dir>] [--tag <dist-tag>] [--json] [--dry-run] [--verbose]
75
76
  ${commandName} instructions:process-create [--harness <name>] [--interactive|--no-interactive] [--json]
76
77
  ${commandName} instructions:orchestrate [--harness <name>] [--interactive|--no-interactive] [--json]
77
78
  ${commandName} instructions:breakpoint-handling [--harness <name>] [--interactive|--no-interactive] [--json]
@@ -61,6 +61,18 @@ export declare const ENV_VAR_CONTRACTS: {
61
61
  readonly scope: "external-input";
62
62
  readonly description: "Overrides node task timeout at process startup.";
63
63
  };
64
+ readonly crossSubagents: {
65
+ readonly name: "BABYSITTER_CROSS_SUBAGENTS";
66
+ readonly valueType: "boolean";
67
+ readonly scope: "external-input";
68
+ readonly description: "Enables cross-harness agent/skill auto-dispatch (default OFF).";
69
+ };
70
+ readonly executeTasks: {
71
+ readonly name: "BABYSITTER_EXECUTE_TASKS";
72
+ readonly valueType: "boolean";
73
+ readonly scope: "external-input";
74
+ readonly description: "Enables shell/node task auto-execution (default OFF).";
75
+ };
64
76
  };
65
77
  readonly azureOpenAi: {
66
78
  readonly apiKey: {