@h-rig/runtime 0.0.6-alpha.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 (176) hide show
  1. package/README.md +27 -0
  2. package/dist/bin/rig-agent-dispatch.js +9615 -0
  3. package/dist/bin/rig-agent.js +9512 -0
  4. package/dist/bin/rig-browser-tool.js +269 -0
  5. package/dist/src/agent-mode.js +48 -0
  6. package/dist/src/baked-secrets.js +121 -0
  7. package/dist/src/binary-build-worker.js +312 -0
  8. package/dist/src/binary-run.js +540 -0
  9. package/dist/src/boundaries.js +1 -0
  10. package/dist/src/build-time-config.js +25 -0
  11. package/dist/src/control-plane/agent-roles.js +27 -0
  12. package/dist/src/control-plane/agent-wrapper.js +9621 -0
  13. package/dist/src/control-plane/authority-files.js +582 -0
  14. package/dist/src/control-plane/browser-contract.js +135 -0
  15. package/dist/src/control-plane/controlled-bash.js +1111 -0
  16. package/dist/src/control-plane/errors.js +13 -0
  17. package/dist/src/control-plane/harness-main.js +10828 -0
  18. package/dist/src/control-plane/hook-materializer.js +75 -0
  19. package/dist/src/control-plane/hooks/audit-trail.js +353 -0
  20. package/dist/src/control-plane/hooks/completion-verification.js +7552 -0
  21. package/dist/src/control-plane/hooks/import-guard.js +890 -0
  22. package/dist/src/control-plane/hooks/inject-context.js +4189 -0
  23. package/dist/src/control-plane/hooks/post-edit-lint.js +43 -0
  24. package/dist/src/control-plane/hooks/safety-guard.js +910 -0
  25. package/dist/src/control-plane/hooks/scope-guard.js +907 -0
  26. package/dist/src/control-plane/hooks/shared.js +44 -0
  27. package/dist/src/control-plane/hooks/submodule-branch.js +7797 -0
  28. package/dist/src/control-plane/hooks/task-runtime-start.js +7799 -0
  29. package/dist/src/control-plane/hooks/test-integrity-guard.js +891 -0
  30. package/dist/src/control-plane/materialize-task-config.js +453 -0
  31. package/dist/src/control-plane/memory-sync/cli.js +2019 -0
  32. package/dist/src/control-plane/memory-sync/db.js +753 -0
  33. package/dist/src/control-plane/memory-sync/embed.js +281 -0
  34. package/dist/src/control-plane/memory-sync/index.js +2049 -0
  35. package/dist/src/control-plane/memory-sync/query.js +294 -0
  36. package/dist/src/control-plane/memory-sync/read.js +784 -0
  37. package/dist/src/control-plane/memory-sync/types.js +6 -0
  38. package/dist/src/control-plane/memory-sync/write.js +1547 -0
  39. package/dist/src/control-plane/native/git-native.js +490 -0
  40. package/dist/src/control-plane/native/git-ops.js +2860 -0
  41. package/dist/src/control-plane/native/harness-cli.js +9721 -0
  42. package/dist/src/control-plane/native/pr-automation.js +373 -0
  43. package/dist/src/control-plane/native/profile-ops.js +481 -0
  44. package/dist/src/control-plane/native/repo-ops.js +2342 -0
  45. package/dist/src/control-plane/native/root-resolver.js +66 -0
  46. package/dist/src/control-plane/native/run-ops.js +3281 -0
  47. package/dist/src/control-plane/native/runtime-native-sidecar.js +299 -0
  48. package/dist/src/control-plane/native/runtime-native.js +392 -0
  49. package/dist/src/control-plane/native/scope-rules.js +17 -0
  50. package/dist/src/control-plane/native/task-ops.js +6320 -0
  51. package/dist/src/control-plane/native/task-state.js +1512 -0
  52. package/dist/src/control-plane/native/utils.js +535 -0
  53. package/dist/src/control-plane/native/validator-binaries.js +889 -0
  54. package/dist/src/control-plane/native/validator.js +2197 -0
  55. package/dist/src/control-plane/native/verifier.js +3249 -0
  56. package/dist/src/control-plane/native/workspace-ops.js +1635 -0
  57. package/dist/src/control-plane/plugin-host-context.js +334 -0
  58. package/dist/src/control-plane/project-main-pre-run-sync.js +630 -0
  59. package/dist/src/control-plane/provider/claude-stream-records.js +158 -0
  60. package/dist/src/control-plane/provider/codex-app-server.js +885 -0
  61. package/dist/src/control-plane/provider/codex-exec-records.js +203 -0
  62. package/dist/src/control-plane/provider/rig-task-run-skill.js +39 -0
  63. package/dist/src/control-plane/provider/runtime-instructions.js +96 -0
  64. package/dist/src/control-plane/remote.js +854 -0
  65. package/dist/src/control-plane/repos/index.js +473 -0
  66. package/dist/src/control-plane/repos/layout.js +124 -0
  67. package/dist/src/control-plane/repos/mirror/bootstrap.js +268 -0
  68. package/dist/src/control-plane/repos/mirror/refresh.js +398 -0
  69. package/dist/src/control-plane/repos/mirror/state.js +167 -0
  70. package/dist/src/control-plane/repos/registry.js +77 -0
  71. package/dist/src/control-plane/repos/types.js +1 -0
  72. package/dist/src/control-plane/runtime/agent-mode.js +48 -0
  73. package/dist/src/control-plane/runtime/baked-secrets.js +120 -0
  74. package/dist/src/control-plane/runtime/claude-tool-router-binary.js +343 -0
  75. package/dist/src/control-plane/runtime/claude-tool-router.js +520 -0
  76. package/dist/src/control-plane/runtime/context.js +216 -0
  77. package/dist/src/control-plane/runtime/events.js +218 -0
  78. package/dist/src/control-plane/runtime/guard-types.js +6 -0
  79. package/dist/src/control-plane/runtime/guard.js +880 -0
  80. package/dist/src/control-plane/runtime/image/fingerprint-sidecar.js +1194 -0
  81. package/dist/src/control-plane/runtime/image/index.js +2255 -0
  82. package/dist/src/control-plane/runtime/image-fingerprint-sidecar.js +1191 -0
  83. package/dist/src/control-plane/runtime/image.js +2255 -0
  84. package/dist/src/control-plane/runtime/index.js +8511 -0
  85. package/dist/src/control-plane/runtime/isolation/discovery.js +599 -0
  86. package/dist/src/control-plane/runtime/isolation/home.js +1217 -0
  87. package/dist/src/control-plane/runtime/isolation/index.js +8193 -0
  88. package/dist/src/control-plane/runtime/isolation/runner.js +2651 -0
  89. package/dist/src/control-plane/runtime/isolation/shared.js +501 -0
  90. package/dist/src/control-plane/runtime/isolation/toolchain.js +1892 -0
  91. package/dist/src/control-plane/runtime/isolation/types.js +1 -0
  92. package/dist/src/control-plane/runtime/isolation/worktree.js +509 -0
  93. package/dist/src/control-plane/runtime/isolation.js +8193 -0
  94. package/dist/src/control-plane/runtime/overlay.js +67 -0
  95. package/dist/src/control-plane/runtime/plugin-mode.js +41 -0
  96. package/dist/src/control-plane/runtime/plugins.js +1131 -0
  97. package/dist/src/control-plane/runtime/provisioning-env.js +220 -0
  98. package/dist/src/control-plane/runtime/queue.js +8358 -0
  99. package/dist/src/control-plane/runtime/rig-shell.js +205 -0
  100. package/dist/src/control-plane/runtime/rig-tools.js +182 -0
  101. package/dist/src/control-plane/runtime/runner-context.js +1 -0
  102. package/dist/src/control-plane/runtime/runtime-paths.js +184 -0
  103. package/dist/src/control-plane/runtime/sandbox/backend-bwrap.js +311 -0
  104. package/dist/src/control-plane/runtime/sandbox/backend-none.js +21 -0
  105. package/dist/src/control-plane/runtime/sandbox/backend-seatbelt.js +268 -0
  106. package/dist/src/control-plane/runtime/sandbox/backend.js +1718 -0
  107. package/dist/src/control-plane/runtime/sandbox/orchestrator.js +1745 -0
  108. package/dist/src/control-plane/runtime/sandbox/utils.js +137 -0
  109. package/dist/src/control-plane/runtime/sandbox-backend-bwrap.js +311 -0
  110. package/dist/src/control-plane/runtime/sandbox-backend-none.js +21 -0
  111. package/dist/src/control-plane/runtime/sandbox-backend-seatbelt.js +268 -0
  112. package/dist/src/control-plane/runtime/sandbox-backend.js +1718 -0
  113. package/dist/src/control-plane/runtime/sandbox-orchestrator.js +1745 -0
  114. package/dist/src/control-plane/runtime/sandbox-utils.js +137 -0
  115. package/dist/src/control-plane/runtime/snapshot/index.js +454 -0
  116. package/dist/src/control-plane/runtime/snapshot/sidecar.js +502 -0
  117. package/dist/src/control-plane/runtime/snapshot/task-run.js +1578 -0
  118. package/dist/src/control-plane/runtime/snapshot-sidecar.js +498 -0
  119. package/dist/src/control-plane/runtime/snapshot.js +454 -0
  120. package/dist/src/control-plane/runtime/task-run-snapshot.js +1578 -0
  121. package/dist/src/control-plane/runtime/tool-gateway.js +422 -0
  122. package/dist/src/control-plane/runtime/tooling/browser-tools.js +32 -0
  123. package/dist/src/control-plane/runtime/tooling/claude-router-binary.js +343 -0
  124. package/dist/src/control-plane/runtime/tooling/claude-router.js +524 -0
  125. package/dist/src/control-plane/runtime/tooling/file-tools.js +182 -0
  126. package/dist/src/control-plane/runtime/tooling/gateway.js +422 -0
  127. package/dist/src/control-plane/runtime/tooling/index.js +1290 -0
  128. package/dist/src/control-plane/runtime/tooling/shell.js +205 -0
  129. package/dist/src/control-plane/runtime/types.js +1 -0
  130. package/dist/src/control-plane/setup-version.js +14 -0
  131. package/dist/src/control-plane/state-sync/index.js +1509 -0
  132. package/dist/src/control-plane/state-sync/read.js +856 -0
  133. package/dist/src/control-plane/state-sync/reconcile.js +260 -0
  134. package/dist/src/control-plane/state-sync/repo.js +302 -0
  135. package/dist/src/control-plane/state-sync/types.js +111 -0
  136. package/dist/src/control-plane/state-sync/write.js +1469 -0
  137. package/dist/src/control-plane/task-fields.js +38 -0
  138. package/dist/src/control-plane/task-source-bootstrap.js +46 -0
  139. package/dist/src/control-plane/task-source.js +30 -0
  140. package/dist/src/control-plane/tasks/legacy-task-config-source.js +130 -0
  141. package/dist/src/control-plane/tasks/plugin-task-source.js +103 -0
  142. package/dist/src/control-plane/tasks/source-aware-task-config-source.js +611 -0
  143. package/dist/src/control-plane/tasks/source-lifecycle.js +1093 -0
  144. package/dist/src/control-plane/tasks/task-record-reader.js +9 -0
  145. package/dist/src/control-plane/validators/boundary/public-apis.js +107 -0
  146. package/dist/src/control-plane/validators/integration/_shared.js +51 -0
  147. package/dist/src/control-plane/validators/integration/adm-audit-http.js +85 -0
  148. package/dist/src/control-plane/validators/integration/adm-auth-http.js +78 -0
  149. package/dist/src/control-plane/validators/integration/adm-issuer-http.js +80 -0
  150. package/dist/src/control-plane/validators/integration/adm-migration.js +78 -0
  151. package/dist/src/control-plane/validators/integration/adm-scaffold.js +78 -0
  152. package/dist/src/control-plane/validators/runtime-registration.js +64 -0
  153. package/dist/src/control-plane/validators/shared.js +683 -0
  154. package/dist/src/events.js +218 -0
  155. package/dist/src/execution.js +35 -0
  156. package/dist/src/index.js +1633 -0
  157. package/dist/src/layout.js +145 -0
  158. package/dist/src/local-server.js +202 -0
  159. package/dist/src/plugins.js +329 -0
  160. package/dist/src/remote-http.js +83 -0
  161. package/dist/src/runtime-context.js +216 -0
  162. package/dist/src/types.js +1 -0
  163. package/native/darwin-arm64/bin/rig-git +0 -0
  164. package/native/darwin-arm64/bin/rig-shell +0 -0
  165. package/native/darwin-arm64/bin/rig-tools +0 -0
  166. package/native/darwin-arm64/lib/runtime-native-darwin-arm64.dylib +0 -0
  167. package/native/darwin-arm64/lib/runtime-native.dylib +0 -0
  168. package/native/darwin-arm64/manifest.json +1 -0
  169. package/native/linux-x64/bin/rig-git +0 -0
  170. package/native/linux-x64/bin/rig-shell +0 -0
  171. package/native/linux-x64/bin/rig-tools +0 -0
  172. package/native/linux-x64/lib/runtime-native-linux-x64.so +0 -0
  173. package/native/linux-x64/lib/runtime-native.so +0 -0
  174. package/native/linux-x64/manifest.json +1 -0
  175. package/package.json +74 -0
  176. package/skills/rig-task-run.md +71 -0
@@ -0,0 +1,38 @@
1
+ // @bun
2
+ // packages/runtime/src/control-plane/task-fields.ts
3
+ function createTaskFieldRegistry(extensions) {
4
+ const byId = new Map;
5
+ for (const e of extensions) {
6
+ if (byId.has(e.id))
7
+ throw new Error(`task field extension already registered: ${e.id}`);
8
+ byId.set(e.id, e);
9
+ }
10
+ return {
11
+ get: (id) => byId.get(id),
12
+ list: () => Array.from(byId.values()),
13
+ fieldNames: () => Array.from(byId.values()).map((e) => e.fieldName),
14
+ validateTaskFields(task) {
15
+ const errors = [];
16
+ for (const ext of byId.values()) {
17
+ let schema;
18
+ try {
19
+ schema = JSON.parse(ext.schemaJson);
20
+ } catch {
21
+ errors.push(`task field "${ext.id}": schemaJson is not valid JSON`);
22
+ continue;
23
+ }
24
+ const isRequired = typeof schema === "object" && schema !== null && schema.required === true;
25
+ if (!isRequired)
26
+ continue;
27
+ const value = task[ext.fieldName];
28
+ if (value === undefined || value === null || value === "") {
29
+ errors.push(`task field "${ext.fieldName}" (from extension "${ext.id}") is required but missing`);
30
+ }
31
+ }
32
+ return errors.length === 0 ? { ok: true } : { ok: false, errors };
33
+ }
34
+ };
35
+ }
36
+ export {
37
+ createTaskFieldRegistry
38
+ };
@@ -0,0 +1,46 @@
1
+ // @bun
2
+ // packages/runtime/src/control-plane/task-source.ts
3
+ function createTaskSourceRegistry() {
4
+ const byId = new Map;
5
+ const order = [];
6
+ return {
7
+ register(s) {
8
+ if (byId.has(s.id))
9
+ throw new Error(`task source already registered: ${s.id}`);
10
+ byId.set(s.id, s);
11
+ order.push(s);
12
+ },
13
+ resolveById(id) {
14
+ const s = byId.get(id);
15
+ if (!s)
16
+ throw new Error(`task source not registered: ${id}`);
17
+ return s;
18
+ },
19
+ resolveByKind(kind) {
20
+ for (const s of order)
21
+ if (s.kind === kind)
22
+ return s;
23
+ throw new Error(`no task source registered for kind: ${kind}`);
24
+ },
25
+ list: () => order
26
+ };
27
+ }
28
+
29
+ // packages/runtime/src/control-plane/task-source-bootstrap.ts
30
+ function formatRegisteredKinds(pluginHost) {
31
+ const kinds = pluginHost ? pluginHost.listExecutableTaskSources().map((source) => source.kind) : [];
32
+ return kinds.length > 0 ? kinds.join(", ") : "none";
33
+ }
34
+ function buildTaskSourceRegistry(config, pluginHost) {
35
+ const registry = createTaskSourceRegistry();
36
+ const taskSourceConfig = config.taskSource;
37
+ const factory = pluginHost?.resolveTaskSourceFactoryByKind(taskSourceConfig.kind);
38
+ if (!factory) {
39
+ throw new Error(`No task source factory registered for kind "${taskSourceConfig.kind}". ` + `Registered kinds: ${formatRegisteredKinds(pluginHost)}. ` + "Load a plugin that contributes an executable task source factory for this kind.");
40
+ }
41
+ registry.register(factory.factory(taskSourceConfig));
42
+ return registry;
43
+ }
44
+ export {
45
+ buildTaskSourceRegistry
46
+ };
@@ -0,0 +1,30 @@
1
+ // @bun
2
+ // packages/runtime/src/control-plane/task-source.ts
3
+ function createTaskSourceRegistry() {
4
+ const byId = new Map;
5
+ const order = [];
6
+ return {
7
+ register(s) {
8
+ if (byId.has(s.id))
9
+ throw new Error(`task source already registered: ${s.id}`);
10
+ byId.set(s.id, s);
11
+ order.push(s);
12
+ },
13
+ resolveById(id) {
14
+ const s = byId.get(id);
15
+ if (!s)
16
+ throw new Error(`task source not registered: ${id}`);
17
+ return s;
18
+ },
19
+ resolveByKind(kind) {
20
+ for (const s of order)
21
+ if (s.kind === kind)
22
+ return s;
23
+ throw new Error(`no task source registered for kind: ${kind}`);
24
+ },
25
+ list: () => order
26
+ };
27
+ }
28
+ export {
29
+ createTaskSourceRegistry
30
+ };
@@ -0,0 +1,130 @@
1
+ // @bun
2
+ // packages/runtime/src/control-plane/tasks/legacy-task-config-source.ts
3
+ import { existsSync, readFileSync } from "fs";
4
+ import { resolve } from "path";
5
+
6
+ // packages/runtime/src/control-plane/tasks/task-record-reader.ts
7
+ async function findTaskById(reader, id) {
8
+ const tasks = await reader.listTasks();
9
+ return tasks.find((task) => task.id === id) ?? null;
10
+ }
11
+
12
+ // packages/runtime/src/control-plane/tasks/legacy-task-config-source.ts
13
+ class LegacyTaskConfigReadError extends Error {
14
+ code = "LEGACY_TASK_CONFIG_READ_FAILED";
15
+ projectRoot;
16
+ configPath;
17
+ cause;
18
+ constructor(input) {
19
+ super(input.message, { cause: input.cause });
20
+ this.name = "LegacyTaskConfigReadError";
21
+ this.projectRoot = input.projectRoot;
22
+ this.configPath = input.configPath;
23
+ this.cause = input.cause;
24
+ }
25
+ }
26
+ function createLegacyTaskConfigRecordReader(projectRoot, options = {}) {
27
+ const configPath = options.configPath ?? resolve(projectRoot, ".rig", "task-config.json");
28
+ const reader = {
29
+ async listTasks() {
30
+ return readLegacyTaskRecords(projectRoot, configPath);
31
+ },
32
+ async getTask(id) {
33
+ return findTaskById(reader, id);
34
+ }
35
+ };
36
+ return reader;
37
+ }
38
+ function readLegacyTaskRecords(projectRoot, configPath = resolve(projectRoot, ".rig", "task-config.json")) {
39
+ if (!existsSync(configPath)) {
40
+ return [];
41
+ }
42
+ const rawConfig = readLegacyTaskConfigJson(projectRoot, configPath);
43
+ return Object.entries(stripLegacyTaskConfigMetadata(rawConfig)).map(([id, entry]) => legacyTaskConfigEntryToRecord(id, entry)).filter((record) => record !== null);
44
+ }
45
+ function readLegacyTaskConfigJson(projectRoot, configPath) {
46
+ try {
47
+ const parsed = JSON.parse(readFileSync(configPath, "utf8"));
48
+ if (isPlainRecord(parsed)) {
49
+ return parsed;
50
+ }
51
+ throw new Error("task config root must be a JSON object");
52
+ } catch (cause) {
53
+ throw new LegacyTaskConfigReadError({
54
+ projectRoot,
55
+ configPath,
56
+ message: `Could not read legacy task config at ${configPath} for project ${projectRoot}: ${cause instanceof Error ? cause.message : String(cause)}`,
57
+ cause
58
+ });
59
+ }
60
+ }
61
+ function stripLegacyTaskConfigMetadata(raw) {
62
+ const { validation_descriptions: _legacyDescriptions, _meta, ...tasks } = raw;
63
+ return tasks;
64
+ }
65
+ function legacyTaskConfigEntryToRecord(id, entry) {
66
+ if (!isPlainRecord(entry)) {
67
+ return null;
68
+ }
69
+ const deps = firstStringList(entry.deps, entry.dependencies, entry.validation_deps, entry.validationDeps);
70
+ const validation = readStringList(entry.validation);
71
+ const validators = readStringList(entry.validators);
72
+ const scope = readStringList(entry.scope);
73
+ const status = typeof entry.status === "string" ? entry.status : "open";
74
+ const title = typeof entry.title === "string" ? entry.title : undefined;
75
+ const description = typeof entry.description === "string" ? entry.description : undefined;
76
+ const acceptanceCriteria = typeof entry.acceptance_criteria === "string" ? entry.acceptance_criteria : typeof entry.acceptanceCriteria === "string" ? entry.acceptanceCriteria : undefined;
77
+ return {
78
+ id,
79
+ deps,
80
+ status,
81
+ source: "legacy-task-config",
82
+ ...title ? { title } : {},
83
+ ...description ? { description } : {},
84
+ ...acceptanceCriteria ? { acceptanceCriteria } : {},
85
+ ...scope.length > 0 ? { scope } : {},
86
+ ...validation.length > 0 ? { validation } : {},
87
+ ...validators.length > 0 ? { validators } : {},
88
+ ...preservedLegacyFields(entry)
89
+ };
90
+ }
91
+ function preservedLegacyFields(entry) {
92
+ const preserved = {};
93
+ for (const key of [
94
+ "role",
95
+ "browser",
96
+ "repo_pins",
97
+ "criticality",
98
+ "queue_weight",
99
+ "creates_repo",
100
+ "auto_synced"
101
+ ]) {
102
+ if (entry[key] !== undefined) {
103
+ preserved[key] = entry[key];
104
+ }
105
+ }
106
+ return preserved;
107
+ }
108
+ function firstStringList(...candidates) {
109
+ for (const candidate of candidates) {
110
+ const list = readStringList(candidate);
111
+ if (list.length > 0) {
112
+ return list;
113
+ }
114
+ }
115
+ return [];
116
+ }
117
+ function readStringList(candidate) {
118
+ if (!Array.isArray(candidate)) {
119
+ return [];
120
+ }
121
+ return candidate.filter((value) => typeof value === "string");
122
+ }
123
+ function isPlainRecord(candidate) {
124
+ return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
125
+ }
126
+ export {
127
+ readLegacyTaskRecords,
128
+ createLegacyTaskConfigRecordReader,
129
+ LegacyTaskConfigReadError
130
+ };
@@ -0,0 +1,103 @@
1
+ // @bun
2
+ // packages/runtime/src/control-plane/tasks/task-record-reader.ts
3
+ async function findTaskById(reader, id) {
4
+ const tasks = await reader.listTasks();
5
+ return tasks.find((task) => task.id === id) ?? null;
6
+ }
7
+
8
+ // packages/runtime/src/control-plane/tasks/plugin-task-source.ts
9
+ class TaskRecordSourceError extends Error {
10
+ code;
11
+ projectRoot;
12
+ sourceId;
13
+ sourceKind;
14
+ operation;
15
+ cause;
16
+ constructor(input) {
17
+ super(input.message, { cause: input.cause });
18
+ this.name = "TaskRecordSourceError";
19
+ this.code = input.code;
20
+ this.projectRoot = input.projectRoot;
21
+ this.operation = input.operation;
22
+ this.sourceId = input.sourceId ?? null;
23
+ this.sourceKind = input.sourceKind ?? null;
24
+ this.cause = input.cause;
25
+ }
26
+ }
27
+ function createPluginTaskRecordReader(context, options) {
28
+ const source = selectTaskSource(context.taskSourceRegistry, options);
29
+ return {
30
+ async listTasks() {
31
+ try {
32
+ return await source.list();
33
+ } catch (cause) {
34
+ throw readFailedError(source, options, "list", cause);
35
+ }
36
+ },
37
+ async getTask(id) {
38
+ try {
39
+ if (source.get) {
40
+ return await source.get(id) ?? null;
41
+ }
42
+ return findTaskById({
43
+ listTasks: () => source.list(),
44
+ getTask: async () => null
45
+ }, id);
46
+ } catch (cause) {
47
+ throw readFailedError(source, options, "get", cause);
48
+ }
49
+ }
50
+ };
51
+ }
52
+ function selectTaskSource(registry, options) {
53
+ try {
54
+ if (options.sourceId) {
55
+ return registry.resolveById(options.sourceId);
56
+ }
57
+ if (options.sourceKind) {
58
+ return registry.resolveByKind(options.sourceKind);
59
+ }
60
+ const [source] = registry.list();
61
+ if (source) {
62
+ return source;
63
+ }
64
+ } catch (cause) {
65
+ throw new TaskRecordSourceError({
66
+ code: "TASK_SOURCE_NOT_CONFIGURED",
67
+ message: taskSourceSelectionMessage(options),
68
+ projectRoot: options.projectRoot,
69
+ operation: "select",
70
+ sourceId: options.sourceId ?? null,
71
+ sourceKind: options.sourceKind ?? null,
72
+ cause
73
+ });
74
+ }
75
+ throw new TaskRecordSourceError({
76
+ code: "TASK_SOURCE_NOT_CONFIGURED",
77
+ message: taskSourceSelectionMessage(options),
78
+ projectRoot: options.projectRoot,
79
+ operation: "select",
80
+ sourceId: options.sourceId ?? null,
81
+ sourceKind: options.sourceKind ?? null
82
+ });
83
+ }
84
+ function taskSourceSelectionMessage(options) {
85
+ const selector = options.sourceId ? `id "${options.sourceId}"` : options.sourceKind ? `kind "${options.sourceKind}"` : "the configured plugin task source";
86
+ return `No task source registered for ${selector} in project ${options.projectRoot}. Check rig.config.ts taskSource and loaded plugins.`;
87
+ }
88
+ function readFailedError(source, options, operation, cause) {
89
+ const causeMessage = cause instanceof Error ? cause.message : String(cause);
90
+ return new TaskRecordSourceError({
91
+ code: "TASK_SOURCE_READ_FAILED",
92
+ message: `Task source ${source.kind} (${source.id}) failed to ${operation} tasks for project ${options.projectRoot}: ${causeMessage}`,
93
+ projectRoot: options.projectRoot,
94
+ operation,
95
+ sourceId: source.id,
96
+ sourceKind: source.kind,
97
+ cause
98
+ });
99
+ }
100
+ export {
101
+ createPluginTaskRecordReader,
102
+ TaskRecordSourceError
103
+ };