@fitlab-ai/agent-infra 0.9.13 → 0.9.14

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 (280) hide show
  1. package/bin/cli.ts +26 -9
  2. package/dist/bin/cli.js +173 -157
  3. package/dist/bin/internal-cli.js +42 -21
  4. package/dist/lib/agent-client.js +5 -0
  5. package/dist/lib/internal/agent-client.js +5 -2
  6. package/dist/lib/internal/cli-route-inventory.js +152 -0
  7. package/dist/lib/internal/codex-lifecycle.js +9 -6
  8. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  9. package/dist/lib/internal/git-workflow.js +10 -6
  10. package/dist/lib/internal/platform-checks.js +16 -4
  11. package/dist/lib/internal/platform-comment.js +16 -4
  12. package/dist/lib/internal/platform-context.js +4 -1
  13. package/dist/lib/internal/platform-issue.js +12 -4
  14. package/dist/lib/internal/platform-metadata.js +88 -0
  15. package/dist/lib/internal/platform-pr-review.js +16 -3
  16. package/dist/lib/internal/platform-pr.js +24 -10
  17. package/dist/lib/internal/platform-release-notes.js +6 -3
  18. package/dist/lib/internal/platform-security.js +93 -0
  19. package/dist/lib/internal/pr-review-grade.js +14 -3
  20. package/dist/lib/internal/release-workflow.js +19 -5
  21. package/dist/lib/internal/sandbox-control.js +22 -5
  22. package/dist/lib/internal/task-activity.js +13 -4
  23. package/dist/lib/internal/task-artifact.js +186 -27
  24. package/dist/lib/internal/task-context.js +4 -1
  25. package/dist/lib/internal/task-create.js +48 -15
  26. package/dist/lib/internal/task-delivery.js +4 -1
  27. package/dist/lib/internal/task-event.js +4 -1
  28. package/dist/lib/internal/task-finalization.js +4 -1
  29. package/dist/lib/internal/task-invalidation.js +4 -1
  30. package/dist/lib/internal/task-ledger.js +12 -1
  31. package/dist/lib/internal/task-lifecycle.js +4 -1
  32. package/dist/lib/internal/task-operation-registry.js +421 -0
  33. package/dist/lib/internal/task-orchestration.js +12 -0
  34. package/dist/lib/internal/task-override.js +10 -3
  35. package/dist/lib/internal/task-qualification.js +90 -0
  36. package/dist/lib/internal/task-review.js +4 -1
  37. package/dist/lib/internal/task-short-id.js +11 -1
  38. package/dist/lib/internal/task-snapshot.js +4 -1
  39. package/dist/lib/internal/task-validate.js +7 -2
  40. package/dist/lib/internal/task-verify.js +5 -1
  41. package/dist/lib/internal/task-warning.js +8 -1
  42. package/dist/lib/platform/comment-safety.js +226 -0
  43. package/dist/lib/platform/github-provider.js +233 -6
  44. package/dist/lib/platform/issue-comments.js +146 -34
  45. package/dist/lib/platform/pr-change-report.js +6 -12
  46. package/dist/lib/platform/pr-summary.js +28 -7
  47. package/dist/lib/platform/provider-contract.d.ts +67 -1
  48. package/dist/lib/platform/provider-contract.js +6 -2
  49. package/dist/lib/platform/provider-validation.js +76 -3
  50. package/dist/lib/platform/pull-requests.js +115 -170
  51. package/dist/lib/platform/repository-metadata.js +377 -0
  52. package/dist/lib/platform/security-alerts.js +155 -0
  53. package/dist/lib/platform/verification-sync.js +33 -26
  54. package/dist/lib/process-data/index.js +7 -0
  55. package/dist/lib/run/index.js +5 -0
  56. package/dist/lib/sandbox/commands/control-status.js +22 -0
  57. package/dist/lib/sandbox/commands/create.js +32 -6
  58. package/dist/lib/sandbox/commands/ls.js +5 -0
  59. package/dist/lib/sandbox/commands/rm.js +827 -120
  60. package/dist/lib/sandbox/commands/show.js +16 -0
  61. package/dist/lib/sandbox/control/client.js +83 -9
  62. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  63. package/dist/lib/sandbox/control/container-identity.js +28 -31
  64. package/dist/lib/sandbox/control/executor.js +149 -14
  65. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  66. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  67. package/dist/lib/sandbox/control/server.js +305 -35
  68. package/dist/lib/sandbox/control/state.js +5 -3
  69. package/dist/lib/sandbox/control/task-view.js +183 -0
  70. package/dist/lib/sandbox/engines/authority.js +289 -0
  71. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  72. package/dist/lib/sandbox/index.js +5 -0
  73. package/dist/lib/sandbox/recovery.js +21 -1
  74. package/dist/lib/sandbox/workspace-view.js +2 -1
  75. package/dist/lib/sandbox/worktree-safety.js +4 -1
  76. package/dist/lib/server/index.js +8 -0
  77. package/dist/lib/task/artifact-lifecycle.js +42 -13
  78. package/dist/lib/task/artifact-operations.js +520 -0
  79. package/dist/lib/task/artifact-repair-intent.js +59 -0
  80. package/dist/lib/task/artifact-schema.js +135 -0
  81. package/dist/lib/task/capabilities.js +72 -1
  82. package/dist/lib/task/control-authority.js +4 -0
  83. package/dist/lib/task/create-service.js +103 -4
  84. package/dist/lib/task/create.js +25 -0
  85. package/dist/lib/task/events.js +186 -67
  86. package/dist/lib/task/index.js +11 -3
  87. package/dist/lib/task/local-artifact-finalization.js +75 -150
  88. package/dist/lib/task/orchestration.js +192 -52
  89. package/dist/lib/task/qualification-audit.js +490 -0
  90. package/dist/lib/task/qualification-confirmation.js +109 -0
  91. package/dist/lib/task/qualification-intents.js +148 -0
  92. package/dist/lib/task/review-artifacts.js +22 -23
  93. package/dist/lib/task/review-finalization.js +121 -4
  94. package/dist/lib/task/sections.js +6 -4
  95. package/dist/lib/task/verification-config.js +11 -0
  96. package/dist/lib/task/verification-engine.js +54 -4
  97. package/dist/lifecycle-build-manifest.json +3 -3
  98. package/lib/agent-client.ts +9 -0
  99. package/lib/internal/agent-client.ts +4 -2
  100. package/lib/internal/cli-route-inventory.ts +140 -0
  101. package/lib/internal/codex-lifecycle.ts +8 -6
  102. package/lib/internal/codex-sandbox-controller.ts +7 -2
  103. package/lib/internal/git-workflow.ts +9 -6
  104. package/lib/internal/platform-checks.ts +12 -4
  105. package/lib/internal/platform-comment.ts +12 -4
  106. package/lib/internal/platform-context.ts +3 -1
  107. package/lib/internal/platform-issue.ts +11 -4
  108. package/lib/internal/platform-metadata.ts +70 -0
  109. package/lib/internal/platform-pr-review.ts +14 -3
  110. package/lib/internal/platform-pr.ts +23 -10
  111. package/lib/internal/platform-release-notes.ts +5 -3
  112. package/lib/internal/platform-security.ts +83 -0
  113. package/lib/internal/pr-review-grade.ts +10 -3
  114. package/lib/internal/release-workflow.ts +17 -5
  115. package/lib/internal/sandbox-control.ts +19 -5
  116. package/lib/internal/task-activity.ts +12 -4
  117. package/lib/internal/task-artifact.ts +164 -25
  118. package/lib/internal/task-context.ts +3 -1
  119. package/lib/internal/task-create.ts +76 -15
  120. package/lib/internal/task-delivery.ts +3 -1
  121. package/lib/internal/task-event.ts +3 -1
  122. package/lib/internal/task-finalization.ts +3 -1
  123. package/lib/internal/task-invalidation.ts +3 -1
  124. package/lib/internal/task-ledger.ts +11 -1
  125. package/lib/internal/task-lifecycle.ts +3 -1
  126. package/lib/internal/task-operation-registry.ts +482 -0
  127. package/lib/internal/task-orchestration.ts +12 -0
  128. package/lib/internal/task-override.ts +9 -3
  129. package/lib/internal/task-qualification.ts +61 -0
  130. package/lib/internal/task-review.ts +3 -1
  131. package/lib/internal/task-short-id.ts +10 -1
  132. package/lib/internal/task-snapshot.ts +3 -1
  133. package/lib/internal/task-validate.ts +6 -2
  134. package/lib/internal/task-verify.ts +4 -1
  135. package/lib/internal/task-warning.ts +7 -1
  136. package/lib/platform/comment-safety.ts +250 -0
  137. package/lib/platform/github-provider.ts +229 -7
  138. package/lib/platform/issue-comments.ts +160 -35
  139. package/lib/platform/pr-change-report.ts +6 -12
  140. package/lib/platform/pr-summary.ts +27 -6
  141. package/lib/platform/provider-contract.ts +78 -3
  142. package/lib/platform/provider-validation.ts +85 -3
  143. package/lib/platform/pull-requests.ts +126 -178
  144. package/lib/platform/repository-metadata.ts +453 -0
  145. package/lib/platform/security-alerts.ts +191 -0
  146. package/lib/platform/verification-sync.ts +32 -28
  147. package/lib/process-data/index.ts +7 -0
  148. package/lib/run/index.ts +5 -0
  149. package/lib/sandbox/commands/control-status.ts +26 -0
  150. package/lib/sandbox/commands/create.ts +46 -6
  151. package/lib/sandbox/commands/ls.ts +7 -0
  152. package/lib/sandbox/commands/rm.ts +1000 -87
  153. package/lib/sandbox/commands/show.ts +16 -0
  154. package/lib/sandbox/control/client.ts +103 -9
  155. package/lib/sandbox/control/completed-reentry.ts +98 -0
  156. package/lib/sandbox/control/container-identity.ts +27 -43
  157. package/lib/sandbox/control/executor.ts +177 -12
  158. package/lib/sandbox/control/lifecycle.ts +629 -17
  159. package/lib/sandbox/control/native-file-lock.ts +209 -0
  160. package/lib/sandbox/control/protocol.ts +5 -2
  161. package/lib/sandbox/control/server.ts +319 -37
  162. package/lib/sandbox/control/state.ts +6 -3
  163. package/lib/sandbox/control/task-view.ts +240 -0
  164. package/lib/sandbox/engines/authority.ts +365 -0
  165. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  166. package/lib/sandbox/index.ts +7 -0
  167. package/lib/sandbox/recovery.ts +21 -1
  168. package/lib/sandbox/workspace-view.ts +9 -3
  169. package/lib/sandbox/worktree-safety.ts +4 -1
  170. package/lib/server/index.ts +10 -0
  171. package/lib/task/artifact-lifecycle.ts +38 -16
  172. package/lib/task/artifact-operations.ts +626 -0
  173. package/lib/task/artifact-repair-intent.ts +71 -0
  174. package/lib/task/artifact-schema.ts +192 -0
  175. package/lib/task/capabilities.ts +70 -1
  176. package/lib/task/control-authority.ts +11 -1
  177. package/lib/task/create-service.ts +131 -6
  178. package/lib/task/create.ts +27 -0
  179. package/lib/task/events.ts +161 -65
  180. package/lib/task/index.ts +16 -3
  181. package/lib/task/local-artifact-finalization.ts +87 -218
  182. package/lib/task/orchestration.ts +172 -49
  183. package/lib/task/qualification-audit.ts +599 -0
  184. package/lib/task/qualification-confirmation.ts +117 -0
  185. package/lib/task/qualification-intents.ts +150 -0
  186. package/lib/task/review-artifacts.ts +21 -22
  187. package/lib/task/review-finalization.ts +133 -4
  188. package/lib/task/sections.ts +6 -4
  189. package/lib/task/verification-config.ts +12 -0
  190. package/lib/task/verification-engine.ts +55 -4
  191. package/package.json +6 -1
  192. package/templates/.agents/rules/README.en.md +2 -0
  193. package/templates/.agents/rules/README.zh-CN.md +2 -0
  194. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  195. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  196. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  197. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  198. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  199. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  200. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  201. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  202. package/templates/.agents/rules/security-alerts.en.md +8 -8
  203. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  204. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  205. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  206. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  207. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  208. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  209. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  210. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  211. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  212. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  213. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  214. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  215. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  216. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  217. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  218. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  219. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  220. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  221. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  222. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  223. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  224. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +5 -1
  225. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
  226. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  227. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  228. package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
  229. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
  230. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  231. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  232. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  233. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  234. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  235. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  236. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  237. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  238. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  239. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  240. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  241. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  242. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  243. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  244. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  245. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  246. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  247. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  248. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  249. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  250. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  251. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  252. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  253. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  254. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  255. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  256. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  257. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  258. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  259. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  260. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  261. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  262. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  263. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  264. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  265. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  266. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -1
  267. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
  268. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  269. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  270. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  271. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  272. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  273. package/templates/.agents/templates/task.en.md +6 -0
  274. package/templates/.agents/templates/task.zh-CN.md +6 -0
  275. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  276. package/templates/.agents/scripts/security-alerts.sh +0 -31
  277. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  278. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  279. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  280. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -7,9 +7,7 @@ import { resolvePlatformProviderContext } from "./context.ts";
7
7
  import { hasCheckedRequirement, resolveRequirementSection } from "./issue-metadata.ts";
8
8
  import { requirementSectionAnchors } from "./issues.ts";
9
9
  import { taskTypeLabel } from "./metadata-labels.ts";
10
- import { planInLabelUpdate, validateInLabelMapping, validateRepositoryLabelPayload } from "./in-label-sync.ts";
11
- import { inspectGitHubPullRequest } from "./pull-requests.ts";
12
- import { createGitHubClient } from "./github-client.ts";
10
+ import { planInLabelUpdate, validateInLabelMapping } from "./in-label-sync.ts";
13
11
  import { readPrDeliveryFact } from "../task/pr-delivery-fact.ts";
14
12
  import { providerError, providerOperationContext, resourceIdentityNumber, unsupportedProviderOperation } from "./provider-bridge.ts";
15
13
  import { taskIssueIdentity } from "./task-identities.ts";
@@ -200,7 +198,6 @@ async function buildSyncContext({ taskDir, config, artifactFile }: any): Promise
200
198
  prIdentity,
201
199
  issueNumber,
202
200
  prNumber,
203
- upstreamRepo: platformContext.platform.repository,
204
201
  repoOwnerType: String(loaded.ok ? loaded.value.snapshot.metadata?.ownerType || "unknown" : "unknown"),
205
202
  hasTriage: platformContext.capabilities.triage,
206
203
  hasPush: platformContext.capabilities.push,
@@ -314,6 +311,27 @@ async function fetchRemoteData(context: any): Promise<any> {
314
311
  prComments = listed.value.map((comment: { id: string; body: string }) => ({ id: comment.id, body: comment.body }));
315
312
  }
316
313
  const changeRequest = facts.value.changeRequest;
314
+ let inLabelMapping: Record<string, string[]> = {};
315
+ let repositoryLabels: string[] = [];
316
+ if (context.config.verify_in_labels_computed && context.hasTriage) {
317
+ const mapping = loadInLabelMapping();
318
+ if (!mapping.ok) return { earlyReturn: failResult(CHECK_TYPE, mapping.message, "check_failed") };
319
+ inLabelMapping = mapping.value;
320
+ if (Object.keys(inLabelMapping).length > 0) {
321
+ const labels = provider?.issues?.listLabels
322
+ ? await provider.issues.listLabels({ context: operationContext })
323
+ : unsupportedProviderOperation(provider, "issues.listLabels");
324
+ if (!labels.ok) {
325
+ const error = providerError(labels.error, "PLATFORM_PROVIDER_OPERATION_FAILED");
326
+ return {
327
+ earlyReturn: error.retryable
328
+ ? blockedResult(CHECK_TYPE, `${error.code}: ${error.message}`, "network_error")
329
+ : failResult(CHECK_TYPE, `${error.code}: ${error.message}`, "check_failed")
330
+ };
331
+ }
332
+ repositoryLabels = labels.value;
333
+ }
334
+ }
317
335
  return {
318
336
  issue,
319
337
  comments: facts.value.comments.map((comment: { id: string; body: string }) => ({ id: comment.id, body: comment.body })),
@@ -327,7 +345,9 @@ async function fetchRemoteData(context: any): Promise<any> {
327
345
  ? (changeRequest.milestone ? { title: changeRequest.milestone } : null)
328
346
  : undefined,
329
347
  prAssignees: changeRequest?.assignees,
330
- prHeadSha: changeRequest?.headSha
348
+ prHeadSha: changeRequest?.headSha,
349
+ inLabelMapping,
350
+ repositoryLabels
331
351
  };
332
352
  }
333
353
 
@@ -605,7 +625,7 @@ function checkInLabelsComputed(context: any, remoteData: any): any {
605
625
  return null;
606
626
  }
607
627
 
608
- const expectedInLabels = computeExpectedInLabels(context.taskDir, context.upstreamRepo);
628
+ const expectedInLabels = computeExpectedInLabels(context.taskDir, remoteData.repositoryLabels, remoteData.inLabelMapping);
609
629
  if (!expectedInLabels.ok) {
610
630
  return expectedInLabels.type === "check_failed"
611
631
  ? failResult(CHECK_TYPE, expectedInLabels.message, expectedInLabels.type)
@@ -1015,7 +1035,7 @@ function formatLabelList(labels: any): any {
1015
1035
  return labels.length > 0 ? labels.join(", ") : "none";
1016
1036
  }
1017
1037
 
1018
- function computeExpectedInLabels(taskDir: any, repository: any): any {
1038
+ function computeExpectedInLabels(taskDir: any, repositoryLabels: string[] = [], mappingOverride?: Record<string, string[]>): any {
1019
1039
  const task = loadTask(taskDir);
1020
1040
  if (!task.ok) {
1021
1041
  return task;
@@ -1034,32 +1054,16 @@ function computeExpectedInLabels(taskDir: any, repository: any): any {
1034
1054
  .map((value) => value.trim())
1035
1055
  .filter(Boolean);
1036
1056
 
1037
- const mapping = loadInLabelMapping();
1038
- if (!mapping.ok) {
1039
- return mapping;
1040
- }
1041
-
1042
- if (Object.keys(mapping.value ?? {}).length === 0) {
1057
+ const mapping = mappingOverride ?? {};
1058
+ if (Object.keys(mapping).length === 0) {
1043
1059
  return { ok: true, labels: [], mode: "mapped" };
1044
1060
  }
1045
1061
 
1046
- const client = createGitHubClient();
1047
- const repoLabelsResult = withRetry(() => client.json([
1048
- "api", "--paginate", "--slurp", `repos/${repository}/labels?per_page=100`
1049
- ], { cwd: taskDir }));
1050
- if (!repoLabelsResult.ok) {
1051
- return repoLabelsResult;
1052
- }
1053
-
1054
- const repositoryLabels = validateRepositoryLabelPayload(repoLabelsResult.value);
1055
- if (!repositoryLabels.ok) {
1056
- return { ok: false, type: "check_failed", message: repositoryLabels.error.message };
1057
- }
1058
1062
  const planned = planInLabelUpdate({
1059
1063
  changedFiles,
1060
1064
  currentLabels: [],
1061
- mapping: mapping.value ?? {},
1062
- repositoryLabels: new Set(repositoryLabels.value)
1065
+ mapping,
1066
+ repositoryLabels: new Set(repositoryLabels)
1063
1067
  });
1064
1068
  if (planned.error) {
1065
1069
  return { ok: false, type: "check_failed", message: planned.error.message };
@@ -1084,7 +1088,7 @@ function loadInLabelMapping(): any {
1084
1088
  }
1085
1089
  }
1086
1090
 
1087
- // === GitHub API ===
1091
+ // === Git working tree ===
1088
1092
 
1089
1093
  function gitText(args: any, cwd: any): any {
1090
1094
  try {
@@ -10,6 +10,7 @@ import { readAppliedOverlays, repairSnapshot } from './repair.ts';
10
10
  import { collectGitHubBoundary, resolveGitHubRepository } from './sources.ts';
11
11
  import { canonicalJsonBytes, createObjectStore, findSnapshot, publishSnapshotV2, verifySnapshot } from './store.ts';
12
12
  import { createGitHubClient } from '../platform/github-client.ts';
13
+ import { PUBLIC_CLI_ROUTE_SELECTORS } from '../internal/cli-route-inventory.ts';
13
14
 
14
15
  import type { NormalizedRecord } from './types.ts';
15
16
 
@@ -22,6 +23,7 @@ Commands:
22
23
  repair <snapshot-id> [--root <dir>] [--apply]
23
24
  export <snapshot-id> [--root <dir>] [--repairs none|applied] [--as-of <ISO>] [--output <file|->]
24
25
  `;
26
+ const DATA_OPERATIONS = PUBLIC_CLI_ROUTE_SELECTORS.data;
25
27
 
26
28
  type ParsedArgs = { positionals: string[]; options: Map<string, string | true> };
27
29
 
@@ -256,6 +258,11 @@ async function cmdData(args: string[]): Promise<number> {
256
258
  return command ? 0 : 1;
257
259
  }
258
260
  try {
261
+ if (!DATA_OPERATIONS.includes(command as typeof DATA_OPERATIONS[number])) {
262
+ process.stderr.write(`Unknown data command: ${command}\n`);
263
+ process.stdout.write(USAGE);
264
+ return 1;
265
+ }
259
266
  switch (command) {
260
267
  case 'capture': return capture(rest);
261
268
  case 'verify': return verify(rest);
package/lib/run/index.ts CHANGED
@@ -7,6 +7,7 @@ import { loadShortIdByTaskId, normalizeShortIdInput } from '../task/short-id.ts'
7
7
  import { buildTuiCommand, renderPrompt, selectTui } from './tui.ts';
8
8
  import { getSkillRunSpec } from './skills.ts';
9
9
  import { runHostCommand, type RunProcessResult } from './host.ts';
10
+ import { PUBLIC_CLI_ROUTE_SELECTORS } from '../internal/cli-route-inventory.ts';
10
11
 
11
12
  export type ParsedRunArgs = {
12
13
  skill: string;
@@ -107,6 +108,10 @@ export function parseRunArgs(args: string[]): ParsedRunArgs {
107
108
  if (!skill) throw new Error("option '--skill' is required");
108
109
  const spec = getSkillRunSpec(skill);
109
110
  if (!spec) throw new Error(`Unknown skill '${skill}'`);
111
+ const routeSelector = spec.kind === 'create' ? 'create-task' : recreate ? 'recreate' : 'task-skill';
112
+ if (!PUBLIC_CLI_ROUTE_SELECTORS.run.includes(routeSelector as typeof PUBLIC_CLI_ROUTE_SELECTORS.run[number])) {
113
+ throw new Error(`Unsupported run route '${routeSelector}'`);
114
+ }
110
115
  if (spec.kind === 'create') {
111
116
  if (taskRef !== null) throw new Error("create-task does not accept '--task'");
112
117
  if (recreate) throw new Error('--recreate is only valid for sandbox task runs');
@@ -0,0 +1,26 @@
1
+ import type { SandboxConfig } from '../config.ts';
2
+ import { readSandboxControlStatus } from '../control/state.ts';
3
+ import type { SandboxControlStatus } from '../control/protocol.ts';
4
+ import { sandboxControlPaths } from '../workspace-view.ts';
5
+ import type { SandboxRow } from './list-running.ts';
6
+
7
+ export function readSandboxControlStatusForRow(
8
+ config: SandboxConfig,
9
+ row: Pick<SandboxRow, 'name' | 'workspaceMode' | 'taskId'>
10
+ ): SandboxControlStatus | null {
11
+ if (!row.workspaceMode || row.workspaceMode === 'legacy-invalid') return null;
12
+ const identity = row.workspaceMode === 'task-bound' && row.taskId
13
+ ? { mode: 'task-bound' as const, taskId: row.taskId }
14
+ : { mode: 'branch-only' as const };
15
+ const control = sandboxControlPaths({
16
+ base: config.controlBase,
17
+ project: config.project,
18
+ container: row.name,
19
+ identity
20
+ });
21
+ try {
22
+ return readSandboxControlStatus(control.statusDir);
23
+ } catch {
24
+ return null;
25
+ }
26
+ }
@@ -92,6 +92,12 @@ import {
92
92
  } from '../workspace-view.ts';
93
93
  import { clipboardHostDir, CONTAINER_CLIPBOARD_MOUNT } from '../clipboard/paths.ts';
94
94
  import { validateSelinuxDisableEnv } from '../engines/selinux.ts';
95
+ import {
96
+ captureSandboxAuthority,
97
+ commandForSandboxAuthority,
98
+ verifySandboxAuthority,
99
+ type SandboxAuthorityEvidenceV1
100
+ } from '../engines/authority.ts';
95
101
  import { dotfilesCacheDir, materializeDotfiles } from '../dotfiles.ts';
96
102
  import { ensureSandboxDiscoveryReadmes } from '../readme-scaffold.ts';
97
103
  import { removeDirRecursive } from '../../remove-dir.ts';
@@ -923,6 +929,24 @@ function runEngineTaskCommand(engine: string, cmd: string, args: string[], opts:
923
929
  return runTaskCommand(command.cmd, command.args, opts);
924
930
  }
925
931
 
932
+ function runSandboxAuthorityTaskCommand(
933
+ authority: SandboxAuthorityEvidenceV1,
934
+ cmd: string,
935
+ args: string[],
936
+ opts: { cwd?: string } = {}
937
+ ): string {
938
+ const command = commandForSandboxAuthority(authority, cmd, args);
939
+ return runTaskCommand(command.cmd, command.args, opts);
940
+ }
941
+
942
+ function runSandboxAuthoritySafeCommand(
943
+ authority: SandboxAuthorityEvidenceV1,
944
+ args: string[]
945
+ ): string {
946
+ const command = commandForSandboxAuthority(authority, 'docker', args);
947
+ return runSafe(command.cmd, command.args);
948
+ }
949
+
926
950
  // `docker run` args for mounting a tool's containerMount as an in-container
927
951
  // tmpfs. containerMount is an in-container path, so it is NOT engine-converted.
928
952
  export function buildTmpfsRunArgs(containerMount: string, tmpfs: { size?: string }): string[] {
@@ -1481,8 +1505,11 @@ export async function create(args: string[]): Promise<void> {
1481
1505
  const tzFlags = hostTz ? ['-e', `TZ=${hostTz}`] : [];
1482
1506
 
1483
1507
  let createdContainerRef: string | null = null;
1508
+ let creationAuthority: SandboxAuthorityEvidenceV1 | null = null;
1484
1509
  try {
1485
- const dockerRunId = runEngineTaskCommand(engine, 'docker', [
1510
+ creationAuthority = captureSandboxAuthority(engine);
1511
+ commandForSandboxAuthority(creationAuthority, 'docker');
1512
+ const dockerRunId = runSandboxAuthorityTaskCommand(creationAuthority, 'docker', [
1486
1513
  'run',
1487
1514
  '-d',
1488
1515
  '--init',
@@ -1537,11 +1564,11 @@ export async function create(args: string[]): Promise<void> {
1537
1564
  effectiveConfig.imageName
1538
1565
  ]);
1539
1566
  createdContainerRef = dockerRunId.trim();
1540
- const containerId = runEngineTaskCommand(engine, 'docker', [
1567
+ const containerId = runSandboxAuthorityTaskCommand(creationAuthority, 'docker', [
1541
1568
  'inspect', '--format', '{{.Id}}', dockerRunId.trim()
1542
1569
  ]).trim();
1543
1570
  if (!containerId) throw new Error('SANDBOX_CONTROL_CONTAINER_ID_INVALID');
1544
- const rawContainerLabels = runEngineTaskCommand(engine, 'docker', [
1571
+ const rawContainerLabels = runSandboxAuthorityTaskCommand(creationAuthority, 'docker', [
1545
1572
  'inspect', '--format', '{{json .Config.Labels}}', containerId
1546
1573
  ]).trim();
1547
1574
  let inspectedLabels: unknown;
@@ -1566,10 +1593,18 @@ export async function create(args: string[]): Promise<void> {
1566
1593
  for (const [key, expected] of Object.entries(expectedLabels)) {
1567
1594
  if (labels[key] !== expected) throw new Error('SANDBOX_CONTROL_CONTAINER_IDENTITY_MISMATCH');
1568
1595
  }
1596
+ const authorityEvidence = captureSandboxAuthority(engine, {
1597
+ route: creationAuthority,
1598
+ lockDomain: creationAuthority.lockDomain
1599
+ });
1600
+ if (verifySandboxAuthority(creationAuthority, authorityEvidence).state !== 'verified') {
1601
+ throw new Error('SANDBOX_AUTHORITY_DRIFT_DURING_CREATE');
1602
+ }
1569
1603
  finalizeSandboxControlManifest(control, {
1570
1604
  engine,
1571
1605
  id: containerId,
1572
- labels: expectedLabels
1606
+ labels: expectedLabels,
1607
+ authorityEvidence
1573
1608
  });
1574
1609
  replacementLease.clearQuiescing();
1575
1610
  await startSandboxControlBroker(effectiveConfig.repoRoot, control.manifestPath);
@@ -1580,8 +1615,13 @@ export async function create(args: string[]): Promise<void> {
1580
1615
  createdTmpfsSeedPlan = tmpfsSeedPlan;
1581
1616
  } catch (error) {
1582
1617
  if (createdContainerRef) {
1583
- runSafeEngine(engine, 'docker', ['stop', createdContainerRef]);
1584
- runSafeEngine(engine, 'docker', ['rm', createdContainerRef]);
1618
+ if (creationAuthority) {
1619
+ runSandboxAuthoritySafeCommand(creationAuthority, ['stop', createdContainerRef]);
1620
+ runSandboxAuthoritySafeCommand(creationAuthority, ['rm', createdContainerRef]);
1621
+ } else {
1622
+ runSafeEngine(engine, 'docker', ['stop', createdContainerRef]);
1623
+ runSafeEngine(engine, 'docker', ['rm', createdContainerRef]);
1624
+ }
1585
1625
  }
1586
1626
  if (!hadExistingControlRoot) removeDirRecursive(control.root);
1587
1627
  if (replacementCutover) {
@@ -11,6 +11,7 @@ import { detectEngine } from '../engine.ts';
11
11
  import { formatTable } from '../../table.ts';
12
12
  import { loadShortIdByTaskId } from '../../task/short-id.ts';
13
13
  import { fetchSandboxRows } from './list-running.ts';
14
+ import { readSandboxControlStatusForRow } from './control-status.ts';
14
15
 
15
16
  export { containerListFormat, parseLabels } from './list-running.ts';
16
17
 
@@ -88,6 +89,12 @@ export function ls(args: string[] = []): void {
88
89
  process.stdout.write(` ${line}\n`);
89
90
  }
90
91
  process.stdout.write(` Total: ${ordered.length} containers\n`);
92
+ for (const row of ordered) {
93
+ const controlStatus = readSandboxControlStatusForRow(config, row);
94
+ process.stdout.write(
95
+ ` ${row.name}: health=${controlStatus?.state ?? 'unavailable'} task-view=${controlStatus?.taskView.state ?? 'unavailable'}\n`
96
+ );
97
+ }
91
98
  if (tableRows.some((r) => r.shortId === '-')) {
92
99
  process.stdout.write(
93
100
  ` SHORT '-' = no active task bound; that sandbox is free to remove with 'ai sandbox rm <branch>'.\n`