@h-rig/runtime 0.0.6-alpha.2 → 0.0.6-alpha.21

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 (46) hide show
  1. package/dist/bin/rig-agent-dispatch.js +84 -313
  2. package/dist/bin/rig-agent.js +85 -27
  3. package/dist/src/control-plane/agent-wrapper.js +101 -27
  4. package/dist/src/control-plane/authority-files.js +12 -6
  5. package/dist/src/control-plane/harness-main.js +1357 -180
  6. package/dist/src/control-plane/hooks/completion-verification.js +1669 -329
  7. package/dist/src/control-plane/hooks/inject-context.js +2 -2
  8. package/dist/src/control-plane/hooks/submodule-branch.js +26 -3
  9. package/dist/src/control-plane/hooks/task-runtime-start.js +26 -3
  10. package/dist/src/control-plane/native/git-ops.js +134 -68
  11. package/dist/src/control-plane/native/harness-cli.js +1357 -180
  12. package/dist/src/control-plane/native/pr-automation.js +1532 -54
  13. package/dist/src/control-plane/native/pr-review-gate.js +1330 -0
  14. package/dist/src/control-plane/native/run-ops.js +35 -12
  15. package/dist/src/control-plane/native/task-ops.js +1274 -155
  16. package/dist/src/control-plane/native/validator.js +2 -2
  17. package/dist/src/control-plane/native/verifier.js +1274 -154
  18. package/dist/src/control-plane/native/workspace-ops.js +12 -6
  19. package/dist/src/control-plane/runtime/index.js +38 -9
  20. package/dist/src/control-plane/runtime/isolation/home.js +31 -6
  21. package/dist/src/control-plane/runtime/isolation/index.js +38 -9
  22. package/dist/src/control-plane/runtime/isolation/runner.js +31 -6
  23. package/dist/src/control-plane/runtime/isolation/shared.js +9 -6
  24. package/dist/src/control-plane/runtime/isolation.js +38 -9
  25. package/dist/src/control-plane/runtime/queue.js +38 -9
  26. package/dist/src/control-plane/tasks/source-aware-task-config-source.js +14 -2
  27. package/dist/src/control-plane/tasks/source-lifecycle.js +2 -2
  28. package/dist/src/index.js +27 -20
  29. package/dist/src/layout.js +12 -7
  30. package/dist/src/local-server.js +20 -14
  31. package/native/darwin-arm64/{bin/rig-git → rig-git} +0 -0
  32. package/native/darwin-arm64/rig-git.build-manifest.json +4 -0
  33. package/native/darwin-arm64/{bin/rig-shell → rig-shell} +0 -0
  34. package/native/darwin-arm64/rig-shell.build-manifest.json +4 -0
  35. package/native/darwin-arm64/{bin/rig-tools → rig-tools} +0 -0
  36. package/native/darwin-arm64/rig-tools.build-manifest.json +4 -0
  37. package/native/darwin-arm64/{lib/runtime-native.dylib → runtime-native.dylib} +0 -0
  38. package/package.json +6 -6
  39. package/native/darwin-arm64/lib/runtime-native-darwin-arm64.dylib +0 -0
  40. package/native/darwin-arm64/manifest.json +0 -1
  41. package/native/linux-x64/bin/rig-git +0 -0
  42. package/native/linux-x64/bin/rig-shell +0 -0
  43. package/native/linux-x64/bin/rig-tools +0 -0
  44. package/native/linux-x64/lib/runtime-native-linux-x64.so +0 -0
  45. package/native/linux-x64/lib/runtime-native.so +0 -0
  46. package/native/linux-x64/manifest.json +0 -1
@@ -198,6 +198,17 @@ async function readSourceAwareTaskStatus(projectRoot, taskId, options = {}) {
198
198
  return null;
199
199
  }
200
200
  }
201
+ function updateGithubIssueTaskBySourceIssueId(sourceIssueId, taskId, update, options = {}) {
202
+ const parsed = sourceIssueId?.trim().match(/^([^/]+)\/([^#]+)#(\d+)$/);
203
+ if (!parsed || parsed[3] !== taskId) {
204
+ return false;
205
+ }
206
+ applyGithubIssueUpdate(options.ghBinary ?? "gh", options.spawn ?? spawnSync, parsed[3], {
207
+ sourceIssueId: sourceIssueId.trim(),
208
+ taskSource: { kind: "github-issues", owner: parsed[1], repo: parsed[2] }
209
+ }, update);
210
+ return true;
211
+ }
201
212
  function updateSourceAwareTaskConfigTask(projectRoot, taskId, update, options = {}) {
202
213
  const configPath = options.configPath ?? resolve2(projectRoot, ".rig", "task-config.json");
203
214
  const rawEntry = readRawTaskEntry(configPath, taskId);
@@ -553,8 +564,8 @@ function ensureStatusLabel(bin, repo, spawnFn, label) {
553
564
  }
554
565
  }
555
566
  function selectedGitHubEnv() {
556
- const token = process.env.RIG_GITHUB_SELECTED_TOKEN?.trim() ?? "";
557
- return { GH_TOKEN: token, GITHUB_TOKEN: token };
567
+ const token = process.env.RIG_GITHUB_SELECTED_TOKEN?.trim() || process.env.RIG_GITHUB_TOKEN?.trim() || "";
568
+ return { GH_TOKEN: token, GITHUB_TOKEN: token, RIG_GITHUB_TOKEN: token };
558
569
  }
559
570
  function ghSpawnOptions() {
560
571
  return { encoding: "utf-8", env: { ...process.env, ...selectedGitHubEnv() } };
@@ -605,6 +616,7 @@ function isPlainRecord2(candidate) {
605
616
  }
606
617
  export {
607
618
  updateSourceAwareTaskConfigTask,
619
+ updateGithubIssueTaskBySourceIssueId,
608
620
  readSourceAwareTaskStatus,
609
621
  readMaterializedTaskMetadata,
610
622
  createSourceAwareTaskConfigRecordReader
@@ -884,8 +884,8 @@ function ensureStatusLabel(bin, repo, spawnFn, label) {
884
884
  }
885
885
  }
886
886
  function selectedGitHubEnv() {
887
- const token = process.env.RIG_GITHUB_SELECTED_TOKEN?.trim() ?? "";
888
- return { GH_TOKEN: token, GITHUB_TOKEN: token };
887
+ const token = process.env.RIG_GITHUB_SELECTED_TOKEN?.trim() || process.env.RIG_GITHUB_TOKEN?.trim() || "";
888
+ return { GH_TOKEN: token, GITHUB_TOKEN: token, RIG_GITHUB_TOKEN: token };
889
889
  }
890
890
  function ghSpawnOptions() {
891
891
  return { encoding: "utf-8", env: { ...process.env, ...selectedGitHubEnv() } };
package/dist/src/index.js CHANGED
@@ -12,22 +12,27 @@ var RIG_STATE_DIRNAME = ".rig";
12
12
  var RIG_ARTIFACTS_DIRNAME = "artifacts";
13
13
  function resolveNearestRigProjectRoot(startDir) {
14
14
  let current = resolve(startDir);
15
- let fallbackCandidate = null;
15
+ let weakMarkerCandidate = null;
16
16
  let projectCandidate = null;
17
17
  for (;; ) {
18
18
  const hasDefinition = existsSync(resolve(current, RIG_DEFINITION_DIRNAME));
19
19
  const hasState = existsSync(resolve(current, RIG_STATE_DIRNAME));
20
+ const hasTaskConfig = existsSync(resolve(current, RIG_STATE_DIRNAME, "task-config.json"));
20
21
  const hasConfig = existsSync(resolve(current, "rig.config.ts")) || existsSync(resolve(current, "rig.config.json"));
22
+ const hasGit = existsSync(resolve(current, ".git"));
21
23
  const hasControlPlane = existsSync(resolve(current, "packages", "cli", "bin", "rig.ts")) || existsSync(resolve(current, "packages", "server"));
22
- if (hasDefinition || hasState || hasConfig) {
23
- fallbackCandidate = current;
24
- if (hasControlPlane) {
25
- projectCandidate = current;
26
- }
24
+ if ((hasDefinition || hasState || hasConfig) && weakMarkerCandidate === null) {
25
+ weakMarkerCandidate = current;
26
+ }
27
+ if ((hasControlPlane || hasConfig || hasTaskConfig) && projectCandidate === null) {
28
+ projectCandidate = current;
29
+ }
30
+ if (hasGit) {
31
+ return projectCandidate ?? current;
27
32
  }
28
33
  const parent = resolve(current, "..");
29
34
  if (parent === current) {
30
- return projectCandidate ?? fallbackCandidate ?? resolve(startDir);
35
+ return projectCandidate ?? weakMarkerCandidate ?? resolve(startDir);
31
36
  }
32
37
  current = parent;
33
38
  }
@@ -619,6 +624,18 @@ async function waitForServerHealthy(baseUrl, authToken, timeoutMs) {
619
624
  }
620
625
  return false;
621
626
  }
627
+ function resolveRigServerSpawnPlan(projectRoot, host, authToken, which = (command) => Bun.which(command)) {
628
+ const binary = process.env.RIG_SERVER_BIN?.trim() || which("rig-server")?.trim();
629
+ const args = ["start", "--host", host, "--port", "0", "--auth-token", authToken];
630
+ if (binary) {
631
+ return { command: binary, args, cwd: projectRoot };
632
+ }
633
+ return {
634
+ command: "bun",
635
+ args: ["run", "packages/server/src/server.ts", ...args],
636
+ cwd: resolve5(import.meta.dir, "../../..")
637
+ };
638
+ }
622
639
  async function waitForPublishedServer(projectRoot, authToken, timeoutMs) {
623
640
  const deadline = Date.now() + timeoutMs;
624
641
  while (Date.now() < deadline) {
@@ -644,23 +661,13 @@ async function ensureLocalRigServerConnection(projectRoot, options = {}) {
644
661
  const host = options.host ?? "127.0.0.1";
645
662
  const startupTimeoutMs = options.startupTimeoutMs ?? 15000;
646
663
  const authToken = Buffer.from(crypto.getRandomValues(new Uint8Array(24))).toString("hex");
647
- const workspaceRoot = resolve5(import.meta.dir, "../../..");
648
664
  const bootstrapLogPath = resolveRigServerLogPath(projectRoot);
649
665
  mkdirSync2(resolveRigServerPaths(projectRoot).logsDir, { recursive: true });
650
666
  const bootstrapLogFd = openSync(bootstrapLogPath, "w");
651
667
  clearPublishedRigServerState(projectRoot);
652
- const child = spawn("bun", [
653
- "run",
654
- "packages/server/src/server.ts",
655
- "start",
656
- "--host",
657
- host,
658
- "--port",
659
- "0",
660
- "--auth-token",
661
- authToken
662
- ], {
663
- cwd: workspaceRoot,
668
+ const spawnPlan = resolveRigServerSpawnPlan(projectRoot, host, authToken);
669
+ const child = spawn(spawnPlan.command, [...spawnPlan.args], {
670
+ cwd: spawnPlan.cwd,
664
671
  env: {
665
672
  ...process.env,
666
673
  PROJECT_RIG_ROOT: projectRoot
@@ -7,22 +7,27 @@ var RIG_STATE_DIRNAME = ".rig";
7
7
  var RIG_ARTIFACTS_DIRNAME = "artifacts";
8
8
  function resolveNearestRigProjectRoot(startDir) {
9
9
  let current = resolve(startDir);
10
- let fallbackCandidate = null;
10
+ let weakMarkerCandidate = null;
11
11
  let projectCandidate = null;
12
12
  for (;; ) {
13
13
  const hasDefinition = existsSync(resolve(current, RIG_DEFINITION_DIRNAME));
14
14
  const hasState = existsSync(resolve(current, RIG_STATE_DIRNAME));
15
+ const hasTaskConfig = existsSync(resolve(current, RIG_STATE_DIRNAME, "task-config.json"));
15
16
  const hasConfig = existsSync(resolve(current, "rig.config.ts")) || existsSync(resolve(current, "rig.config.json"));
17
+ const hasGit = existsSync(resolve(current, ".git"));
16
18
  const hasControlPlane = existsSync(resolve(current, "packages", "cli", "bin", "rig.ts")) || existsSync(resolve(current, "packages", "server"));
17
- if (hasDefinition || hasState || hasConfig) {
18
- fallbackCandidate = current;
19
- if (hasControlPlane) {
20
- projectCandidate = current;
21
- }
19
+ if ((hasDefinition || hasState || hasConfig) && weakMarkerCandidate === null) {
20
+ weakMarkerCandidate = current;
21
+ }
22
+ if ((hasControlPlane || hasConfig || hasTaskConfig) && projectCandidate === null) {
23
+ projectCandidate = current;
24
+ }
25
+ if (hasGit) {
26
+ return projectCandidate ?? current;
22
27
  }
23
28
  const parent = resolve(current, "..");
24
29
  if (parent === current) {
25
- return projectCandidate ?? fallbackCandidate ?? resolve(startDir);
30
+ return projectCandidate ?? weakMarkerCandidate ?? resolve(startDir);
26
31
  }
27
32
  current = parent;
28
33
  }
@@ -134,6 +134,18 @@ async function waitForServerHealthy(baseUrl, authToken, timeoutMs) {
134
134
  }
135
135
  return false;
136
136
  }
137
+ function resolveRigServerSpawnPlan(projectRoot, host, authToken, which = (command) => Bun.which(command)) {
138
+ const binary = process.env.RIG_SERVER_BIN?.trim() || which("rig-server")?.trim();
139
+ const args = ["start", "--host", host, "--port", "0", "--auth-token", authToken];
140
+ if (binary) {
141
+ return { command: binary, args, cwd: projectRoot };
142
+ }
143
+ return {
144
+ command: "bun",
145
+ args: ["run", "packages/server/src/server.ts", ...args],
146
+ cwd: resolve2(import.meta.dir, "../../..")
147
+ };
148
+ }
137
149
  async function waitForPublishedServer(projectRoot, authToken, timeoutMs) {
138
150
  const deadline = Date.now() + timeoutMs;
139
151
  while (Date.now() < deadline) {
@@ -159,23 +171,13 @@ async function ensureLocalRigServerConnection(projectRoot, options = {}) {
159
171
  const host = options.host ?? "127.0.0.1";
160
172
  const startupTimeoutMs = options.startupTimeoutMs ?? 15000;
161
173
  const authToken = Buffer.from(crypto.getRandomValues(new Uint8Array(24))).toString("hex");
162
- const workspaceRoot = resolve2(import.meta.dir, "../../..");
163
174
  const bootstrapLogPath = resolveRigServerLogPath(projectRoot);
164
175
  mkdirSync(resolveRigServerPaths(projectRoot).logsDir, { recursive: true });
165
176
  const bootstrapLogFd = openSync(bootstrapLogPath, "w");
166
177
  clearPublishedRigServerState(projectRoot);
167
- const child = spawn("bun", [
168
- "run",
169
- "packages/server/src/server.ts",
170
- "start",
171
- "--host",
172
- host,
173
- "--port",
174
- "0",
175
- "--auth-token",
176
- authToken
177
- ], {
178
- cwd: workspaceRoot,
178
+ const spawnPlan = resolveRigServerSpawnPlan(projectRoot, host, authToken);
179
+ const child = spawn(spawnPlan.command, [...spawnPlan.args], {
180
+ cwd: spawnPlan.cwd,
179
181
  env: {
180
182
  ...process.env,
181
183
  PROJECT_RIG_ROOT: projectRoot
@@ -195,8 +197,12 @@ ${bootstrapLog}` : ` No bootstrap log was written.`;
195
197
  }
196
198
  return toLocalServerConnection(ready);
197
199
  }
200
+ var __testOnly = {
201
+ resolveRigServerSpawnPlan
202
+ };
198
203
  export {
199
204
  readPublishedRigServerStateSync,
200
205
  readPublishedRigServerState,
201
- ensureLocalRigServerConnection
206
+ ensureLocalRigServerConnection,
207
+ __testOnly
202
208
  };
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-git-darwin-arm64\",\"sourceDigest\":\"67ef79af508d46b1134d48b315c236cad8225f53ef1959d3e0bd09801c7884c4\"}"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-shell-darwin-arm64\",\"sourceDigest\":\"3b73710b3e4cdfb76d959e92d37049234cf54b2d8deee683aba9f342be4f3597\"}"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": 1,
3
+ "buildKey": "{\"version\":1,\"sourcePath\":\"/var/folders/zr/6js4xbjs3bgf46v76j145mlw0000gn/T/rig-native/rig-tools-darwin-arm64\",\"sourceDigest\":\"9bf9381cca81f26d1b3ddcad28a0a6211a090ec2905471d6c25a9d89fb20c496\"}"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h-rig/runtime",
3
- "version": "0.0.6-alpha.2",
3
+ "version": "0.0.6-alpha.21",
4
4
  "type": "module",
5
5
  "description": "Rig package",
6
6
  "license": "UNLICENSED",
@@ -64,11 +64,11 @@
64
64
  "module": "./dist/src/index.js",
65
65
  "dependencies": {
66
66
  "@libsql/client": "^0.17.2",
67
- "@rig/contracts": "npm:@h-rig/contracts@0.0.6-alpha.2",
68
- "@rig/core": "npm:@h-rig/core@0.0.6-alpha.2",
69
- "@rig/hook-kit": "npm:@h-rig/hook-kit@0.0.6-alpha.2",
70
- "@rig/shared": "npm:@h-rig/shared@0.0.6-alpha.2",
71
- "@rig/validator-kit": "npm:@h-rig/validator-kit@0.0.6-alpha.2",
67
+ "@rig/contracts": "npm:@h-rig/contracts@0.0.6-alpha.21",
68
+ "@rig/core": "npm:@h-rig/core@0.0.6-alpha.21",
69
+ "@rig/hook-kit": "npm:@h-rig/hook-kit@0.0.6-alpha.21",
70
+ "@rig/shared": "npm:@h-rig/shared@0.0.6-alpha.21",
71
+ "@rig/validator-kit": "npm:@h-rig/validator-kit@0.0.6-alpha.21",
72
72
  "effect": "4.0.0-beta.78",
73
73
  "smol-toml": "^1.6.0"
74
74
  }
@@ -1 +0,0 @@
1
- {"platform":"darwin-arm64","suffix":"dylib","builtAt":"2026-06-07T22:55:24Z"}
Binary file
Binary file
Binary file
@@ -1 +0,0 @@
1
- {"platform":"linux-x64","suffix":"so","builtAt":"2026-06-07T22:56:41Z"}