@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.
- package/bin/cli.ts +26 -9
- package/dist/bin/cli.js +173 -157
- package/dist/bin/internal-cli.js +42 -21
- package/dist/lib/agent-client.js +5 -0
- package/dist/lib/internal/agent-client.js +5 -2
- package/dist/lib/internal/cli-route-inventory.js +152 -0
- package/dist/lib/internal/codex-lifecycle.js +9 -6
- package/dist/lib/internal/codex-sandbox-controller.js +8 -2
- package/dist/lib/internal/git-workflow.js +10 -6
- package/dist/lib/internal/platform-checks.js +16 -4
- package/dist/lib/internal/platform-comment.js +16 -4
- package/dist/lib/internal/platform-context.js +4 -1
- package/dist/lib/internal/platform-issue.js +12 -4
- package/dist/lib/internal/platform-metadata.js +88 -0
- package/dist/lib/internal/platform-pr-review.js +16 -3
- package/dist/lib/internal/platform-pr.js +24 -10
- package/dist/lib/internal/platform-release-notes.js +6 -3
- package/dist/lib/internal/platform-security.js +93 -0
- package/dist/lib/internal/pr-review-grade.js +14 -3
- package/dist/lib/internal/release-workflow.js +19 -5
- package/dist/lib/internal/sandbox-control.js +22 -5
- package/dist/lib/internal/task-activity.js +13 -4
- package/dist/lib/internal/task-artifact.js +186 -27
- package/dist/lib/internal/task-context.js +4 -1
- package/dist/lib/internal/task-create.js +48 -15
- package/dist/lib/internal/task-delivery.js +4 -1
- package/dist/lib/internal/task-event.js +4 -1
- package/dist/lib/internal/task-finalization.js +4 -1
- package/dist/lib/internal/task-invalidation.js +4 -1
- package/dist/lib/internal/task-ledger.js +12 -1
- package/dist/lib/internal/task-lifecycle.js +4 -1
- package/dist/lib/internal/task-operation-registry.js +421 -0
- package/dist/lib/internal/task-orchestration.js +12 -0
- package/dist/lib/internal/task-override.js +10 -3
- package/dist/lib/internal/task-qualification.js +90 -0
- package/dist/lib/internal/task-review.js +4 -1
- package/dist/lib/internal/task-short-id.js +11 -1
- package/dist/lib/internal/task-snapshot.js +4 -1
- package/dist/lib/internal/task-validate.js +7 -2
- package/dist/lib/internal/task-verify.js +5 -1
- package/dist/lib/internal/task-warning.js +8 -1
- package/dist/lib/platform/comment-safety.js +226 -0
- package/dist/lib/platform/github-provider.js +233 -6
- package/dist/lib/platform/issue-comments.js +146 -34
- package/dist/lib/platform/pr-change-report.js +6 -12
- package/dist/lib/platform/pr-summary.js +28 -7
- package/dist/lib/platform/provider-contract.d.ts +67 -1
- package/dist/lib/platform/provider-contract.js +6 -2
- package/dist/lib/platform/provider-validation.js +76 -3
- package/dist/lib/platform/pull-requests.js +115 -170
- package/dist/lib/platform/repository-metadata.js +377 -0
- package/dist/lib/platform/security-alerts.js +155 -0
- package/dist/lib/platform/verification-sync.js +33 -26
- package/dist/lib/process-data/index.js +7 -0
- package/dist/lib/run/index.js +5 -0
- package/dist/lib/sandbox/commands/control-status.js +22 -0
- package/dist/lib/sandbox/commands/create.js +32 -6
- package/dist/lib/sandbox/commands/ls.js +5 -0
- package/dist/lib/sandbox/commands/rm.js +827 -120
- package/dist/lib/sandbox/commands/show.js +16 -0
- package/dist/lib/sandbox/control/client.js +83 -9
- package/dist/lib/sandbox/control/completed-reentry.js +85 -0
- package/dist/lib/sandbox/control/container-identity.js +28 -31
- package/dist/lib/sandbox/control/executor.js +149 -14
- package/dist/lib/sandbox/control/lifecycle.js +621 -127
- package/dist/lib/sandbox/control/native-file-lock.js +177 -0
- package/dist/lib/sandbox/control/server.js +305 -35
- package/dist/lib/sandbox/control/state.js +5 -3
- package/dist/lib/sandbox/control/task-view.js +183 -0
- package/dist/lib/sandbox/engines/authority.js +289 -0
- package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
- package/dist/lib/sandbox/index.js +5 -0
- package/dist/lib/sandbox/recovery.js +21 -1
- package/dist/lib/sandbox/workspace-view.js +2 -1
- package/dist/lib/sandbox/worktree-safety.js +4 -1
- package/dist/lib/server/index.js +8 -0
- package/dist/lib/task/artifact-lifecycle.js +42 -13
- package/dist/lib/task/artifact-operations.js +520 -0
- package/dist/lib/task/artifact-repair-intent.js +59 -0
- package/dist/lib/task/artifact-schema.js +135 -0
- package/dist/lib/task/capabilities.js +72 -1
- package/dist/lib/task/control-authority.js +4 -0
- package/dist/lib/task/create-service.js +103 -4
- package/dist/lib/task/create.js +25 -0
- package/dist/lib/task/events.js +186 -67
- package/dist/lib/task/index.js +11 -3
- package/dist/lib/task/local-artifact-finalization.js +75 -150
- package/dist/lib/task/orchestration.js +192 -52
- package/dist/lib/task/qualification-audit.js +490 -0
- package/dist/lib/task/qualification-confirmation.js +109 -0
- package/dist/lib/task/qualification-intents.js +148 -0
- package/dist/lib/task/review-artifacts.js +22 -23
- package/dist/lib/task/review-finalization.js +121 -4
- package/dist/lib/task/sections.js +6 -4
- package/dist/lib/task/verification-config.js +11 -0
- package/dist/lib/task/verification-engine.js +54 -4
- package/dist/lifecycle-build-manifest.json +3 -3
- package/lib/agent-client.ts +9 -0
- package/lib/internal/agent-client.ts +4 -2
- package/lib/internal/cli-route-inventory.ts +140 -0
- package/lib/internal/codex-lifecycle.ts +8 -6
- package/lib/internal/codex-sandbox-controller.ts +7 -2
- package/lib/internal/git-workflow.ts +9 -6
- package/lib/internal/platform-checks.ts +12 -4
- package/lib/internal/platform-comment.ts +12 -4
- package/lib/internal/platform-context.ts +3 -1
- package/lib/internal/platform-issue.ts +11 -4
- package/lib/internal/platform-metadata.ts +70 -0
- package/lib/internal/platform-pr-review.ts +14 -3
- package/lib/internal/platform-pr.ts +23 -10
- package/lib/internal/platform-release-notes.ts +5 -3
- package/lib/internal/platform-security.ts +83 -0
- package/lib/internal/pr-review-grade.ts +10 -3
- package/lib/internal/release-workflow.ts +17 -5
- package/lib/internal/sandbox-control.ts +19 -5
- package/lib/internal/task-activity.ts +12 -4
- package/lib/internal/task-artifact.ts +164 -25
- package/lib/internal/task-context.ts +3 -1
- package/lib/internal/task-create.ts +76 -15
- package/lib/internal/task-delivery.ts +3 -1
- package/lib/internal/task-event.ts +3 -1
- package/lib/internal/task-finalization.ts +3 -1
- package/lib/internal/task-invalidation.ts +3 -1
- package/lib/internal/task-ledger.ts +11 -1
- package/lib/internal/task-lifecycle.ts +3 -1
- package/lib/internal/task-operation-registry.ts +482 -0
- package/lib/internal/task-orchestration.ts +12 -0
- package/lib/internal/task-override.ts +9 -3
- package/lib/internal/task-qualification.ts +61 -0
- package/lib/internal/task-review.ts +3 -1
- package/lib/internal/task-short-id.ts +10 -1
- package/lib/internal/task-snapshot.ts +3 -1
- package/lib/internal/task-validate.ts +6 -2
- package/lib/internal/task-verify.ts +4 -1
- package/lib/internal/task-warning.ts +7 -1
- package/lib/platform/comment-safety.ts +250 -0
- package/lib/platform/github-provider.ts +229 -7
- package/lib/platform/issue-comments.ts +160 -35
- package/lib/platform/pr-change-report.ts +6 -12
- package/lib/platform/pr-summary.ts +27 -6
- package/lib/platform/provider-contract.ts +78 -3
- package/lib/platform/provider-validation.ts +85 -3
- package/lib/platform/pull-requests.ts +126 -178
- package/lib/platform/repository-metadata.ts +453 -0
- package/lib/platform/security-alerts.ts +191 -0
- package/lib/platform/verification-sync.ts +32 -28
- package/lib/process-data/index.ts +7 -0
- package/lib/run/index.ts +5 -0
- package/lib/sandbox/commands/control-status.ts +26 -0
- package/lib/sandbox/commands/create.ts +46 -6
- package/lib/sandbox/commands/ls.ts +7 -0
- package/lib/sandbox/commands/rm.ts +1000 -87
- package/lib/sandbox/commands/show.ts +16 -0
- package/lib/sandbox/control/client.ts +103 -9
- package/lib/sandbox/control/completed-reentry.ts +98 -0
- package/lib/sandbox/control/container-identity.ts +27 -43
- package/lib/sandbox/control/executor.ts +177 -12
- package/lib/sandbox/control/lifecycle.ts +629 -17
- package/lib/sandbox/control/native-file-lock.ts +209 -0
- package/lib/sandbox/control/protocol.ts +5 -2
- package/lib/sandbox/control/server.ts +319 -37
- package/lib/sandbox/control/state.ts +6 -3
- package/lib/sandbox/control/task-view.ts +240 -0
- package/lib/sandbox/engines/authority.ts +365 -0
- package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
- package/lib/sandbox/index.ts +7 -0
- package/lib/sandbox/recovery.ts +21 -1
- package/lib/sandbox/workspace-view.ts +9 -3
- package/lib/sandbox/worktree-safety.ts +4 -1
- package/lib/server/index.ts +10 -0
- package/lib/task/artifact-lifecycle.ts +38 -16
- package/lib/task/artifact-operations.ts +626 -0
- package/lib/task/artifact-repair-intent.ts +71 -0
- package/lib/task/artifact-schema.ts +192 -0
- package/lib/task/capabilities.ts +70 -1
- package/lib/task/control-authority.ts +11 -1
- package/lib/task/create-service.ts +131 -6
- package/lib/task/create.ts +27 -0
- package/lib/task/events.ts +161 -65
- package/lib/task/index.ts +16 -3
- package/lib/task/local-artifact-finalization.ts +87 -218
- package/lib/task/orchestration.ts +172 -49
- package/lib/task/qualification-audit.ts +599 -0
- package/lib/task/qualification-confirmation.ts +117 -0
- package/lib/task/qualification-intents.ts +150 -0
- package/lib/task/review-artifacts.ts +21 -22
- package/lib/task/review-finalization.ts +133 -4
- package/lib/task/sections.ts +6 -4
- package/lib/task/verification-config.ts +12 -0
- package/lib/task/verification-engine.ts +55 -4
- package/package.json +6 -1
- package/templates/.agents/rules/README.en.md +2 -0
- package/templates/.agents/rules/README.zh-CN.md +2 -0
- package/templates/.agents/rules/decision-qualification.en.md +22 -0
- package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
- package/templates/.agents/rules/evidence-reporting.en.md +28 -0
- package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
- package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
- package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
- package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
- package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
- package/templates/.agents/rules/security-alerts.en.md +8 -8
- package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
- package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
- package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
- package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
- package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
- package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
- package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
- package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
- package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
- package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
- package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
- package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
- package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
- package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
- package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
- package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
- package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +5 -1
- package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
- package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
- package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
- package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
- package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
- package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
- package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
- package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
- package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
- package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
- package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
- package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
- package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
- package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
- package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
- package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
- package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
- package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
- package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
- package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
- package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
- package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
- package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
- package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
- package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
- package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
- package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
- package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
- package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -1
- package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
- package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
- package/templates/.agents/skills/test/SKILL.en.md +13 -2
- package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
- package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
- package/templates/.agents/templates/task.en.md +6 -0
- package/templates/.agents/templates/task.zh-CN.md +6 -0
- package/templates/.agents/scripts/security-alerts.github.sh +0 -151
- package/templates/.agents/scripts/security-alerts.sh +0 -31
- package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
- package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
- package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
- 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
|
|
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,
|
|
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,
|
|
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 =
|
|
1038
|
-
if (
|
|
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
|
|
1062
|
-
repositoryLabels: new Set(repositoryLabels
|
|
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
|
-
// ===
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
1584
|
-
|
|
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`
|