@frankzhang2026/opencode-android-orchestrator 0.9.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +92 -55
  3. package/dist/cli.js +14 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/android-sdk.d.ts +10 -0
  6. package/dist/config/android-sdk.d.ts.map +1 -0
  7. package/dist/config/android-sdk.js +50 -0
  8. package/dist/config/android-sdk.js.map +1 -0
  9. package/dist/config/commit-message-prefix.d.ts +31 -0
  10. package/dist/config/commit-message-prefix.d.ts.map +1 -0
  11. package/dist/config/commit-message-prefix.js +155 -0
  12. package/dist/config/commit-message-prefix.js.map +1 -0
  13. package/dist/config/queue-policy.d.ts +12 -0
  14. package/dist/config/queue-policy.d.ts.map +1 -0
  15. package/dist/config/queue-policy.js +18 -0
  16. package/dist/config/queue-policy.js.map +1 -0
  17. package/dist/config/verification-policy.d.ts +10 -3
  18. package/dist/config/verification-policy.d.ts.map +1 -1
  19. package/dist/config/verification-policy.js +66 -13
  20. package/dist/config/verification-policy.js.map +1 -1
  21. package/dist/doctor/index.d.ts.map +1 -1
  22. package/dist/doctor/index.js +3 -49
  23. package/dist/doctor/index.js.map +1 -1
  24. package/dist/doctor/installation.d.ts.map +1 -1
  25. package/dist/doctor/installation.js +81 -0
  26. package/dist/doctor/installation.js.map +1 -1
  27. package/dist/index.d.ts +1 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/installer/adaptive-templates.d.ts +8 -2
  32. package/dist/installer/adaptive-templates.d.ts.map +1 -1
  33. package/dist/installer/adaptive-templates.js +10 -0
  34. package/dist/installer/adaptive-templates.js.map +1 -1
  35. package/dist/installer/index.d.ts +1 -0
  36. package/dist/installer/index.d.ts.map +1 -1
  37. package/dist/installer/index.js +1 -0
  38. package/dist/installer/index.js.map +1 -1
  39. package/dist/installer/init.d.ts +4 -1
  40. package/dist/installer/init.d.ts.map +1 -1
  41. package/dist/installer/init.js +60 -9
  42. package/dist/installer/init.js.map +1 -1
  43. package/dist/installer/install-manifest.d.ts +1 -0
  44. package/dist/installer/install-manifest.d.ts.map +1 -1
  45. package/dist/installer/install-manifest.js +6 -1
  46. package/dist/installer/install-manifest.js.map +1 -1
  47. package/dist/installer/opencode-config.d.ts +3 -3
  48. package/dist/installer/opencode-config.js +1 -1
  49. package/dist/installer/uninstall.d.ts.map +1 -1
  50. package/dist/installer/uninstall.js +5 -0
  51. package/dist/installer/uninstall.js.map +1 -1
  52. package/dist/installer/upgrade.d.ts +5 -1
  53. package/dist/installer/upgrade.d.ts.map +1 -1
  54. package/dist/installer/upgrade.js +94 -11
  55. package/dist/installer/upgrade.js.map +1 -1
  56. package/dist/plugin/index.d.ts.map +1 -1
  57. package/dist/plugin/index.js +11 -5
  58. package/dist/plugin/index.js.map +1 -1
  59. package/dist/queue/approvals.d.ts +49 -0
  60. package/dist/queue/approvals.d.ts.map +1 -0
  61. package/dist/queue/approvals.js +68 -0
  62. package/dist/queue/approvals.js.map +1 -0
  63. package/dist/queue/cli.d.ts +3 -0
  64. package/dist/queue/cli.d.ts.map +1 -0
  65. package/dist/queue/cli.js +109 -0
  66. package/dist/queue/cli.js.map +1 -0
  67. package/dist/queue/executor.d.ts +24 -0
  68. package/dist/queue/executor.d.ts.map +1 -0
  69. package/dist/queue/executor.js +445 -0
  70. package/dist/queue/executor.js.map +1 -0
  71. package/dist/queue/lifecycle.d.ts +3 -0
  72. package/dist/queue/lifecycle.d.ts.map +1 -0
  73. package/dist/queue/lifecycle.js +24 -0
  74. package/dist/queue/lifecycle.js.map +1 -0
  75. package/dist/queue/queue.d.ts +154 -0
  76. package/dist/queue/queue.d.ts.map +1 -0
  77. package/dist/queue/queue.js +411 -0
  78. package/dist/queue/queue.js.map +1 -0
  79. package/dist/queue/service.d.ts +15 -0
  80. package/dist/queue/service.d.ts.map +1 -0
  81. package/dist/queue/service.js +152 -0
  82. package/dist/queue/service.js.map +1 -0
  83. package/dist/queue/storage.d.ts +30 -0
  84. package/dist/queue/storage.d.ts.map +1 -0
  85. package/dist/queue/storage.js +171 -0
  86. package/dist/queue/storage.js.map +1 -0
  87. package/dist/queue/tools.d.ts +12 -0
  88. package/dist/queue/tools.d.ts.map +1 -0
  89. package/dist/queue/tools.js +144 -0
  90. package/dist/queue/tools.js.map +1 -0
  91. package/docs/MIGRATION.md +47 -14
  92. package/docs/QUEUE.md +146 -0
  93. package/docs/SECURITY.md +48 -32
  94. package/docs/TROUBLESHOOTING.md +36 -11
  95. package/package.json +1 -1
  96. package/templates/.opencode/agents/scheduled-planner.md +60 -131
  97. package/templates/.opencode/commands/abort-task.md +6 -15
  98. package/templates/.opencode/commands/acceptance.md +6 -15
  99. package/templates/.opencode/commands/change.md +3 -1
  100. package/templates/.opencode/commands/resume-review.md +6 -14
  101. package/templates/.opencode/commands/resume-task.md +6 -23
  102. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +69 -248
  103. package/templates/AGENTS.md.fragment +8 -0
  104. package/templates/README.md +9 -1
  105. package/templates/automation/config.json +9 -2
  106. package/templates/automation/config.schema.json +222 -45
  107. package/templates/scripts/automation/abort-task.sh +4 -2
  108. package/templates/scripts/automation/accept-and-integrate.sh +9 -2
  109. package/templates/scripts/automation/acceptance-report.sh +4 -2
  110. package/templates/scripts/automation/approve-and-run.sh +5 -0
  111. package/templates/scripts/automation/begin-review.sh +1 -0
  112. package/templates/scripts/automation/block-task.sh +1 -0
  113. package/templates/scripts/automation/claim-task.sh +1 -0
  114. package/templates/scripts/automation/lib.sh +186 -2
  115. package/templates/scripts/automation/orchestrate-task.sh +12 -0
  116. package/templates/scripts/automation/preflight.sh +25 -4
  117. package/templates/scripts/automation/prepare-contract-review.sh +4 -0
  118. package/templates/scripts/automation/quality-gate.sh +1 -0
  119. package/templates/scripts/automation/record-red.sh +1 -0
  120. package/templates/scripts/automation/resume-review-fix.sh +1 -0
  121. package/templates/scripts/automation/resume-review.sh +1 -0
  122. package/templates/scripts/automation/resume-task.sh +1 -0
  123. package/templates/scripts/automation/scope-gate.sh +10 -2
  124. package/templates/scripts/automation/show-acceptance-review.sh +3 -0
  125. package/templates/scripts/automation/submit-review.sh +8 -2
  126. package/templates/scripts/automation/tests/run-tests.sh +59 -4
  127. package/templates/scripts/automation/verify-task.sh +13 -0
@@ -0,0 +1,154 @@
1
+ import type { ApprovalProof } from "./approvals.js";
2
+ import { QueueStorage, type ProcessIdentity } from "./storage.js";
3
+ import { type QueuePolicy } from "../config/queue-policy.js";
4
+ export type WorkspaceStrategy = "inPlaceExclusive" | "isolatedWorktree";
5
+ export type CommitPolicy = "humanApproval" | "autoCommit";
6
+ export type JobKind = "execute" | "integrate" | "revalidate" | "resume" | "resume-review" | "abort" | "recover";
7
+ export interface QueueConfiguration {
8
+ schemaVersion: number;
9
+ enabled: boolean;
10
+ mode: string;
11
+ workspaceStrategy: WorkspaceStrategy;
12
+ commitPolicy?: CommitPolicy;
13
+ pushAfterAcceptance: false;
14
+ unitTestsEnabled: boolean;
15
+ autoCleanupWorktrees: boolean;
16
+ worktreeBase: string;
17
+ queue?: QueuePolicy["queue"];
18
+ approvalPhrases: Record<string, string>;
19
+ protectedPaths: string[];
20
+ gradleVerification: {
21
+ fullUnitTestTasks: string[];
22
+ focusedTestTasks: string[];
23
+ assembleTasks: string[];
24
+ };
25
+ }
26
+ export interface Draft {
27
+ proposalApproval?: ApprovalProof;
28
+ key: string;
29
+ taskId: string;
30
+ version: number;
31
+ contract: Record<string, unknown>;
32
+ contractText: string;
33
+ plan: string;
34
+ contractSha256: string;
35
+ planSha256: string;
36
+ planningHead: string;
37
+ targetBranch: string;
38
+ sourceRoot: string;
39
+ workspaceStrategy: WorkspaceStrategy;
40
+ commitPolicy: CommitPolicy;
41
+ notBefore: string | null;
42
+ dependsOn: string[];
43
+ priority: number;
44
+ createdAt: string;
45
+ digest: string;
46
+ }
47
+ export interface QueueItem extends Draft {
48
+ approvedWorkspaceStrategy: WorkspaceStrategy;
49
+ queuePriority: number;
50
+ sequence: number;
51
+ approvedAt: string;
52
+ authorization: {
53
+ source: "contractApproval";
54
+ digest: string;
55
+ commitPolicy: CommitPolicy;
56
+ pushAfterAcceptance: false;
57
+ revoked: boolean;
58
+ proof?: ApprovalProof;
59
+ };
60
+ state: string;
61
+ waitingReason: string | null;
62
+ runId: string | null;
63
+ taskRoot: string | null;
64
+ request: {
65
+ kind: JobKind;
66
+ approval: string | null;
67
+ candidate: string | null;
68
+ proof?: ApprovalProof;
69
+ } | null;
70
+ sealedDiff: string | null;
71
+ sealedRunId: string | null;
72
+ candidateId: string | null;
73
+ completedCommit: string | null;
74
+ }
75
+ export interface QueueRun {
76
+ id: string;
77
+ key: string;
78
+ kind: JobKind;
79
+ createdAt: string;
80
+ launcher: ProcessIdentity;
81
+ worker: ProcessIdentity | null;
82
+ outcome: {
83
+ state: string;
84
+ error: string | null;
85
+ } | null;
86
+ }
87
+ export interface QueueNotification {
88
+ id: string;
89
+ key: string;
90
+ state: string;
91
+ at: string;
92
+ message: string;
93
+ sealedDiff: string | null;
94
+ commit: string | null;
95
+ pushed: false;
96
+ acknowledged: boolean;
97
+ }
98
+ export interface QueueDocument {
99
+ schemaVersion: 1;
100
+ sequence: number;
101
+ paused: boolean;
102
+ fault: string | null;
103
+ strategy: WorkspaceStrategy | null;
104
+ drafts: Draft[];
105
+ items: QueueItem[];
106
+ active: QueueRun | null;
107
+ runs: QueueRun[];
108
+ notifications: QueueNotification[];
109
+ }
110
+ export interface DraftInput {
111
+ contract: Record<string, unknown>;
112
+ plan: string;
113
+ planningHead: string;
114
+ targetBranch: string;
115
+ workspaceStrategy?: WorkspaceStrategy;
116
+ commitPolicy?: CommitPolicy;
117
+ notBefore?: string;
118
+ dependsOn?: string[];
119
+ priority?: number;
120
+ }
121
+ export declare const TASK_ID: RegExp;
122
+ export declare function now(): string;
123
+ export declare function matchesPath(pattern: string, path: string): boolean;
124
+ export declare function validateContract(contract: Record<string, unknown>, config: QueueConfiguration): void;
125
+ export declare function draftFromItem(item: QueueItem): Draft;
126
+ export declare function assertAuthorized(item: QueueItem): void;
127
+ export declare class TaskQueue {
128
+ readonly storage: QueueStorage<QueueDocument>;
129
+ constructor(directory: string);
130
+ config(): QueueConfiguration;
131
+ snapshot(targetBranch?: string): {
132
+ sourceRoot: string;
133
+ targetBranch: string;
134
+ planningHead: string;
135
+ files: string[];
136
+ };
137
+ private sensitive;
138
+ readSnapshot(head: string, path: string): string;
139
+ draft(input: DraftInput, proposalApproval?: ApprovalProof): Draft;
140
+ approvalText(draft: Draft): string;
141
+ enqueue(key: string, digest: string, approval: string, proof?: ApprovalProof): QueueItem;
142
+ item(key: string): QueueItem;
143
+ private findItem;
144
+ reorder(key: string, priority: number): void;
145
+ setPolicy(workspaceStrategy: WorkspaceStrategy, commitPolicy: CommitPolicy): void;
146
+ recoverExecution(): void;
147
+ details(key: string): Record<string, unknown>;
148
+ notify(document: QueueDocument, item: QueueItem, message: string): void;
149
+ control(action: "pause" | "resume" | "clear-fault" | "cancel" | "revoke" | "acknowledge", key?: string): QueueDocument;
150
+ request(key: string, kind: Exclude<JobKind, "execute">, approval?: string, candidate?: string, proof?: ApprovalProof): void;
151
+ reserve(): QueueRun | null;
152
+ reconcile(): void;
153
+ }
154
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,411 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { spawnSync } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { atomicJson, fileLock, git, invariant, isAlive, processGroupAlive, processIdentity, readJson, sha256, QueueStorage, } from "./storage.js";
6
+ import { queuePolicy } from "../config/queue-policy.js";
7
+ const TERMINAL = new Set(["COMPLETED", "CANCELLED", "ABORTED", "SUPERSEDED"]);
8
+ const STOPPED = new Set(["AWAITING_HUMAN", "READY_TO_COMMIT", "BLOCKED", "TEST_FAILED", "NEEDS_HUMAN", "INTEGRATION_BLOCKED", "BASELINE_REVIEW"]);
9
+ export const TASK_ID = /^TASK-[A-Z0-9-]+$/;
10
+ export function now() { return new Date().toISOString(); }
11
+ export function matchesPath(pattern, path) {
12
+ const expression = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&")
13
+ .replace(/\*\*/g, "\u0001").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]")
14
+ .replace(/\u0001\//g, "(?:.*/)?").replace(/\u0001/g, ".*");
15
+ return new RegExp(`^${expression}${pattern.endsWith("/") ? ".*" : ""}$`).test(path);
16
+ }
17
+ export function validateContract(contract, config) {
18
+ invariant(TASK_ID.test(String(contract.id)), "Invalid task ID");
19
+ invariant([1, 2, 3].includes(Number(contract.schemaVersion)), "Unsupported contract schema");
20
+ invariant(contract.designApproved === true && contract.ambiguityPolicy === "BLOCKED", "An approved, bounded design is required");
21
+ invariant(typeof contract.title === "string" && contract.title.length > 0, "Contract title is required");
22
+ invariant(contract.planPath === `docs/plans/${contract.id}.md`, "Plan must use the task-specific docs/plans path");
23
+ invariant(Number.isInteger(contract.maxChangedFiles) && Number(contract.maxChangedFiles) >= 1 && Number(contract.maxChangedFiles) <= 12, "Invalid file limit");
24
+ invariant(Number.isInteger(contract.maxFixLoops) && Number(contract.maxFixLoops) >= 0 && Number(contract.maxFixLoops) <= 1, "Invalid fix-loop limit");
25
+ for (const key of ["allowedPaths", "forbiddenPaths", "acceptanceCriteria", "nonGoals"]) {
26
+ invariant(Array.isArray(contract[key]) && contract[key].length > 0 && contract[key].every(value => typeof value === "string" && value.length > 0), `Invalid ${key}`);
27
+ }
28
+ const allowed = contract.allowedPaths;
29
+ const forbidden = contract.forbiddenPaths;
30
+ for (const path of [...allowed, ...forbidden])
31
+ invariant(/^[A-Za-z0-9._/?*-]+$/.test(path) && !path.startsWith("/") && !path.includes(".."), "Unsafe contract path");
32
+ for (const path of config.protectedPaths) {
33
+ invariant(!allowed.some(pattern => matchesPath(pattern, path)), `Allowed paths overlap protected path: ${path}`);
34
+ invariant(forbidden.some(pattern => matchesPath(pattern, path)), `Forbidden paths must cover: ${path}`);
35
+ }
36
+ const skills = contract.schemaVersion === 1 ? contract.allowedSuperpowers : contract.allowedWorkflowSkills;
37
+ const expected = ["test-driven-development", "systematic-debugging", "verification-before-completion"].map(skill => contract.schemaVersion === 1 ? skill : `android-orchestrator-${skill}`);
38
+ invariant(JSON.stringify(skills) === JSON.stringify(expected), "Invalid workflow skill allowlist");
39
+ invariant(Array.isArray(contract.targetTests) && contract.targetTests.length > 0, "Focused tests are required");
40
+ for (const target of contract.targetTests) {
41
+ invariant(target && typeof target === "object" && typeof target.gradleTask === "string" && config.gradleVerification.focusedTestTasks.includes(target.gradleTask), "Focused test task is not configured");
42
+ invariant(typeof target.filter === "string" && /^[A-Za-z0-9_.#$*-]+$/.test(target.filter), "Unsafe test filter");
43
+ }
44
+ invariant(typeof contract.deviceTestsRequired === "boolean", "Missing device-test policy");
45
+ invariant(contract.testPolicy === "required" || (contract.testPolicy === "not-required" && typeof contract.testPolicyReason === "string" && contract.testPolicyReason.length >= 20), "Missing test policy");
46
+ invariant(!/replace with|TASK-EXAMPLE|\btodo\b|\btbd\b|placeholder/i.test(JSON.stringify(contract)), "Contract contains placeholders");
47
+ }
48
+ function draftDigest(draft) {
49
+ const { digest: _digest, ...sealed } = draft;
50
+ return sha256(JSON.stringify(sealed));
51
+ }
52
+ export function draftFromItem(item) {
53
+ const { sequence: _sequence, approvedAt: _approvedAt, authorization: _authorization, state: _state, waitingReason: _waitingReason, runId: _runId, taskRoot: _taskRoot, request: _request, sealedDiff: _sealedDiff, sealedRunId: _sealedRunId, candidateId: _candidateId, completedCommit: _commit, approvedWorkspaceStrategy, queuePriority: _priority, ...draft } = item;
54
+ return { ...draft, workspaceStrategy: approvedWorkspaceStrategy };
55
+ }
56
+ export function assertAuthorized(item) {
57
+ invariant(!item.authorization.revoked, "Contract authorization was revoked");
58
+ invariant(item.digest === draftDigest(draftFromItem(item)) && item.digest === item.authorization.digest, "Approved contract or scheduling policy changed; fresh approval required");
59
+ invariant(item.authorization.commitPolicy === item.commitPolicy && item.authorization.pushAfterAcceptance === false, "Invalid sealed commit or no-push authorization");
60
+ invariant(sha256(item.contractText) === item.contractSha256 && sha256(item.plan) === item.planSha256, "Approved artifacts changed");
61
+ invariant(JSON.stringify(JSON.parse(item.contractText)) === JSON.stringify(item.contract), "Contract text and metadata disagree");
62
+ invariant(item.workspaceStrategy !== "isolatedWorktree" || item.commitPolicy === "humanApproval", "isolatedWorktree + autoCommit is unsupported");
63
+ }
64
+ export class TaskQueue {
65
+ storage;
66
+ constructor(directory) {
67
+ this.storage = new QueueStorage(directory, () => ({ schemaVersion: 1, sequence: 0, paused: false, fault: null, strategy: null, drafts: [], items: [], active: null, runs: [], notifications: [] }));
68
+ }
69
+ config() {
70
+ const config = readJson(join(this.storage.root, "automation/config.json"));
71
+ invariant(config.schemaVersion === 6, "Queue execution requires an upgraded schema V6 installation");
72
+ invariant(config.enabled && config.mode === "orchestrated", "Automation is not enabled in orchestrated mode");
73
+ invariant(config.pushAfterAcceptance === false, "Remote push is forbidden");
74
+ invariant(["inPlaceExclusive", "isolatedWorktree"].includes(config.workspaceStrategy), "Unsupported workspace strategy");
75
+ invariant(config.commitPolicy === undefined || ["humanApproval", "autoCommit"].includes(config.commitPolicy), "Unsupported commit policy");
76
+ queuePolicy(config);
77
+ return config;
78
+ }
79
+ snapshot(targetBranch) {
80
+ const document = this.storage.read();
81
+ const occupied = document.items.find(item => item.taskRoot && !TERMINAL.has(item.state));
82
+ const branch = targetBranch ?? occupied?.targetBranch ?? git(this.storage.root, ["symbolic-ref", "--short", "HEAD"]);
83
+ git(this.storage.root, ["check-ref-format", `refs/heads/${branch}`]);
84
+ const head = git(this.storage.root, ["rev-parse", "--verify", `refs/heads/${branch}^{commit}`]);
85
+ const files = git(this.storage.root, ["ls-tree", "-r", "--name-only", head]).split("\n").filter(path => !this.sensitive(path));
86
+ return { sourceRoot: this.storage.root, targetBranch: branch, planningHead: head, files };
87
+ }
88
+ sensitive(path) {
89
+ return /(^|\/)(\.env(?:\..*)?|local\.properties)$|\.(jks|keystore)$/.test(path);
90
+ }
91
+ readSnapshot(head, path) {
92
+ invariant(/^[a-f0-9]{40,64}$/.test(head), "A fixed planning commit is required");
93
+ invariant(!path.startsWith("/") && !path.split("/").includes("..") && !path.includes("\0") && !this.sensitive(path), "Snapshot path is not allowed");
94
+ const type = git(this.storage.root, ["cat-file", "-t", `${head}:${path}`]);
95
+ invariant(type === "blob", "Snapshot path must be a file");
96
+ const size = Number(git(this.storage.root, ["cat-file", "-s", `${head}:${path}`]));
97
+ invariant(size <= 1024 * 1024, "Snapshot file exceeds 1 MiB");
98
+ return git(this.storage.root, ["show", `${head}:${path}`]);
99
+ }
100
+ draft(input, proposalApproval) {
101
+ const config = this.config();
102
+ validateContract(input.contract, config);
103
+ invariant(input.plan.trim().length >= 20 && Buffer.byteLength(input.plan) <= 1024 * 1024, "A complete plan of at most 1 MiB is required");
104
+ invariant(/^[a-f0-9]{40,64}$/.test(input.planningHead), "A fixed planning commit is required");
105
+ git(this.storage.root, ["check-ref-format", `refs/heads/${input.targetBranch}`]);
106
+ git(this.storage.root, ["merge-base", "--is-ancestor", input.planningHead, `refs/heads/${input.targetBranch}`]);
107
+ const workspaceStrategy = input.workspaceStrategy ?? config.workspaceStrategy;
108
+ // Missing policy always retains human acceptance, irrespective of defaults.
109
+ const commitPolicy = input.commitPolicy ?? "humanApproval";
110
+ invariant(["inPlaceExclusive", "isolatedWorktree"].includes(workspaceStrategy), "Invalid workspace strategy");
111
+ invariant(["humanApproval", "autoCommit"].includes(commitPolicy), "Invalid commit policy");
112
+ invariant(workspaceStrategy === "inPlaceExclusive" || commitPolicy === "humanApproval", "isolatedWorktree + autoCommit is unsupported");
113
+ const dependencies = input.dependsOn ?? [];
114
+ invariant(dependencies.every(id => TASK_ID.test(id) && id !== input.contract.id) && new Set(dependencies).size === dependencies.length, "Invalid task dependencies");
115
+ const priority = input.priority ?? 0;
116
+ invariant(Number.isInteger(priority) && priority >= -100 && priority <= 100, "Priority must be an integer from -100 to 100");
117
+ invariant(input.notBefore === undefined || /(?:Z|[+-]\d{2}:\d{2})$/.test(input.notBefore), "notBefore must include an explicit timezone offset");
118
+ const notBefore = input.notBefore === undefined ? null : new Date(input.notBefore).toISOString();
119
+ const contractText = `${JSON.stringify(input.contract, null, 2)}\n`;
120
+ return this.storage.transaction(document => {
121
+ const taskId = String(input.contract.id);
122
+ const version = Math.max(0, ...document.drafts.filter(draft => draft.taskId === taskId).map(draft => draft.version)) + 1;
123
+ const sealed = { ...(proposalApproval ? { proposalApproval } : {}), key: `${taskId}@${version}`, taskId, version, contract: input.contract, contractText,
124
+ plan: input.plan, contractSha256: sha256(contractText), planSha256: sha256(input.plan),
125
+ planningHead: input.planningHead, targetBranch: input.targetBranch, sourceRoot: this.storage.root,
126
+ workspaceStrategy, commitPolicy, notBefore, dependsOn: dependencies, priority, createdAt: now() };
127
+ const draft = { ...sealed, digest: draftDigest(sealed) };
128
+ document.drafts.push(draft);
129
+ return draft;
130
+ });
131
+ }
132
+ approvalText(draft) {
133
+ return draft.commitPolicy === "autoCommit"
134
+ ? `批准入队 ${draft.key}:通过构建、全量单测和独立 Review 后自动本地提交并集成,不推送远程。`
135
+ : `批准入队 ${draft.key}:执行后等待人工确认提交,不推送远程。`;
136
+ }
137
+ enqueue(key, digest, approval, proof) {
138
+ this.config();
139
+ return this.storage.transaction(document => {
140
+ const existing = document.items.find(item => item.key === key);
141
+ if (existing) {
142
+ invariant(existing.digest === digest && this.approvalText(existing) === approval, "Repeated approval does not match the sealed contract");
143
+ return existing;
144
+ }
145
+ const draft = document.drafts.find(candidate => candidate.key === key);
146
+ invariant(draft && draft.digest === digest && draftDigest(draft) === digest, "Draft changed; display a fresh contract review");
147
+ invariant(this.approvalText(draft) === approval, "Explicit approval for this version and commit policy is required");
148
+ invariant(!document.items.some(item => item.taskId === draft.taskId && item.state !== "CANCELLED" && item.state !== "SUPERSEDED"), "This task already has an approved execution; use a new task ID or cancel its unstarted version");
149
+ for (const dependency of draft.dependsOn)
150
+ invariant(document.items.some(item => item.taskId === dependency && item.state !== "CANCELLED"), `Approve dependency first: ${dependency}`);
151
+ const item = { ...draft, approvedWorkspaceStrategy: draft.workspaceStrategy, queuePriority: draft.priority,
152
+ sequence: ++document.sequence, approvedAt: now(),
153
+ authorization: { source: "contractApproval", digest, commitPolicy: draft.commitPolicy, pushAfterAcceptance: false, revoked: false, ...(proof ? { proof } : {}) },
154
+ state: "QUEUED", waitingReason: null, runId: null, taskRoot: null, request: null, sealedDiff: null, sealedRunId: null, candidateId: null, completedCommit: null };
155
+ document.items.push(item);
156
+ this.notify(document, item, "Contract approved and durably enqueued");
157
+ return item;
158
+ });
159
+ }
160
+ item(key) {
161
+ const item = this.findItem(this.storage.read(), key);
162
+ invariant(item, `Unknown queued task: ${key}`);
163
+ return item;
164
+ }
165
+ findItem(document, key) {
166
+ return document.items.find(item => item.key === key) ?? [...document.items].reverse().find(item => item.taskId === key);
167
+ }
168
+ reorder(key, priority) {
169
+ invariant(Number.isInteger(priority) && priority >= -100 && priority <= 100, "Priority must be an integer from -100 to 100");
170
+ this.storage.transaction(document => {
171
+ const item = this.findItem(document, key);
172
+ invariant(item?.state === "QUEUED", "Only unstarted queue items may be reordered");
173
+ item.queuePriority = priority;
174
+ });
175
+ }
176
+ setPolicy(workspaceStrategy, commitPolicy) {
177
+ const release = fileLock(join(this.storage.runtime, "locks/lifecycle.lock"));
178
+ try {
179
+ this.storage.transaction(document => {
180
+ invariant(document.paused && !document.active, "Pause the queue and wait for its executor before changing policy");
181
+ invariant(!document.items.some(item => item.taskRoot && !TERMINAL.has(item.state)), "Retained workspaces must complete or abort before a policy change");
182
+ invariant(!existsSync(join(this.storage.runtime, "locks/repository.workspace.lease")), "Repository still has a workspace owner");
183
+ const config = this.config();
184
+ helperFreeCleanCheck(this.storage.root);
185
+ const policy = queuePolicy({ ...config, workspaceStrategy, commitPolicy });
186
+ atomicJson(join(this.storage.root, "automation/config.json"), { ...config, ...policy });
187
+ document.strategy = workspaceStrategy;
188
+ });
189
+ }
190
+ finally {
191
+ release();
192
+ }
193
+ }
194
+ recoverExecution() {
195
+ this.storage.transaction(document => {
196
+ const run = document.active;
197
+ invariant(run, "No active execution to recover");
198
+ if (run.worker) {
199
+ invariant(!isAlive(run.worker) && !processGroupAlive(run.worker.pid), "Executor or its children are still alive; preserve the execution slot");
200
+ }
201
+ else {
202
+ invariant(run.launcher && !isAlive(run.launcher), "Execution launcher is still alive or unknown; cannot recover its reservation");
203
+ }
204
+ const item = this.findItem(document, run.key);
205
+ item.state = "BLOCKED";
206
+ item.waitingReason = "Interrupted execution preserved; inspect its workspace, then request resume, abort or commit recovery";
207
+ item.sealedRunId = null;
208
+ this.notify(document, item, item.waitingReason);
209
+ document.runs.push({ ...run, outcome: { state: item.state, error: item.waitingReason } });
210
+ // Invalidate the reservation atomically. A delayed, unregistered worker
211
+ // cannot acquire it after this transaction, even if it starts later.
212
+ document.active = null;
213
+ });
214
+ }
215
+ details(key) {
216
+ const item = this.item(key);
217
+ const evidence = {};
218
+ for (const name of ["acceptance-report", "review", "full-test-verification", "commit-transaction", "integration", "planning-baseline"]) {
219
+ const path = join(this.storage.runtime, "evidence", item.taskId, `${name}.json`);
220
+ if (existsSync(path))
221
+ evidence[name] = readJson(path);
222
+ }
223
+ return { ...item, currentTargetHead: git(item.sourceRoot, ["rev-parse", `refs/heads/${item.targetBranch}`]), evidence };
224
+ }
225
+ notify(document, item, message) {
226
+ const id = sha256(`${item.key}:${item.state}:${item.candidateId}:${item.completedCommit}:${message}`);
227
+ if (!document.notifications.some(notification => notification.id === id))
228
+ document.notifications.push({ id, key: item.key, state: item.state, at: now(), message, sealedDiff: item.sealedDiff, commit: item.completedCommit, pushed: false, acknowledged: false });
229
+ }
230
+ control(action, key) {
231
+ return this.storage.transaction(document => {
232
+ if (action === "pause")
233
+ document.paused = true;
234
+ if (action === "resume")
235
+ document.paused = false;
236
+ if (action === "clear-fault") {
237
+ invariant(!document.active, "Resolve the active execution before clearing a public fault");
238
+ document.fault = null;
239
+ }
240
+ if (action === "acknowledge") {
241
+ const notification = document.notifications.find(notification => notification.id === key);
242
+ invariant(notification, "Unknown notification");
243
+ notification.acknowledged = true;
244
+ }
245
+ if (action === "cancel" || action === "revoke") {
246
+ const item = this.findItem(document, key ?? "");
247
+ invariant(item && !TERMINAL.has(item.state), "No active approval for this task");
248
+ if (action === "cancel") {
249
+ invariant(item.taskRoot === null && document.active?.key !== item.key, "Running or occupied tasks require the approved abort workflow");
250
+ item.state = "CANCELLED";
251
+ }
252
+ item.authorization.revoked = true;
253
+ this.notify(document, item, action === "cancel" ? "Queued task cancelled" : "Commit authorization revoked; preserve workspace");
254
+ }
255
+ return document;
256
+ });
257
+ }
258
+ request(key, kind, approval, candidate, proof) {
259
+ const config = this.config();
260
+ this.storage.transaction(document => {
261
+ const item = this.findItem(document, key);
262
+ invariant(item && item.taskRoot && !TERMINAL.has(item.state), "Task has no recoverable workspace");
263
+ invariant(document.active?.key !== item.key || kind === "abort", "Task is still running; wait for its recorded process to exit");
264
+ invariant(!item.request || item.request.kind === kind, "An earlier request is already queued for this task");
265
+ if (kind === "integrate") {
266
+ invariant(item.commitPolicy === "humanApproval" && item.state === "AWAITING_HUMAN", "Task is not awaiting human acceptance");
267
+ invariant(candidate && candidate === item.candidateId, "Acceptance must bind to the latest sealed candidate and target baseline");
268
+ invariant(approval === config.approvalPhrases.acceptance, "Explicit final acceptance is required");
269
+ }
270
+ else if (kind !== "recover" && kind !== "revalidate") {
271
+ const phrase = kind === "abort" ? config.approvalPhrases.abort : config.approvalPhrases.resume;
272
+ invariant(approval === phrase, `Explicit ${kind} approval is required`);
273
+ }
274
+ if (kind === "revalidate")
275
+ invariant(item.workspaceStrategy === "isolatedWorktree" && item.state === "AWAITING_HUMAN", "Only a sealed isolated candidate can be revalidated");
276
+ item.request = { kind, approval: approval ?? null, candidate: candidate ?? null, ...(proof ? { proof } : {}) };
277
+ this.notify(document, item, `${kind} requested; waiting for the repository execution slot`);
278
+ });
279
+ }
280
+ reserve() {
281
+ const config = this.config();
282
+ // Disk traversal stays outside the intake transaction.
283
+ const retained = this.storage.read().items.filter(item => item.taskRoot && item.workspaceStrategy === "isolatedWorktree" && existsSync(item.taskRoot));
284
+ let workspaceBytes = 0;
285
+ for (const item of retained) {
286
+ const usage = spawnSync("du", ["-sk", item.taskRoot], { encoding: "utf8" });
287
+ invariant(usage.status === 0, "Cannot measure retained workspace disk usage");
288
+ workspaceBytes += Number(usage.stdout.trim().split(/\s+/)[0]) * 1024;
289
+ }
290
+ return this.storage.transaction(document => {
291
+ if (existsSync(join(this.storage.runtime, "locks/lifecycle.lock")))
292
+ return null;
293
+ if (document.active || document.paused || document.fault)
294
+ return null;
295
+ if (!config.unitTestsEnabled) {
296
+ document.fault = "Queued execution requires full unit tests; enable unitTestsEnabled";
297
+ return null;
298
+ }
299
+ const occupied = document.items.filter(item => item.taskRoot && !TERMINAL.has(item.state));
300
+ if (occupied.some(item => item.workspaceStrategy !== config.workspaceStrategy)) {
301
+ document.fault = "Workspace strategy changed while tasks retain a workspace; restore the recorded strategy";
302
+ return null;
303
+ }
304
+ const fixed = occupied.find(item => item.workspaceStrategy === "inPlaceExclusive");
305
+ const leaseDirectory = join(this.storage.runtime, "locks/repository.workspace.lease");
306
+ if (existsSync(leaseDirectory) && !existsSync(join(leaseDirectory, "lease.json"))) {
307
+ document.fault = "Repository workspace lease is incomplete; recover its ownership before scheduling";
308
+ return null;
309
+ }
310
+ const requests = document.items.filter(item => item.request).sort((a, b) => a.sequence - b.sequence);
311
+ const pending = document.items.filter(item => item.state === "QUEUED").sort((a, b) => b.queuePriority - a.queuePriority || a.sequence - b.sequence);
312
+ for (const item of [...requests, ...pending]) {
313
+ item.waitingReason = null;
314
+ if (fixed && fixed.key !== item.key) {
315
+ item.waitingReason = `Waiting for ${fixed.taskId}: ${fixed.state}`;
316
+ continue;
317
+ }
318
+ if (item.commitPolicy === "autoCommit" && config.workspaceStrategy === "isolatedWorktree") {
319
+ item.waitingReason = "isolatedWorktree + autoCommit is unsupported; fresh contract approval is required";
320
+ continue;
321
+ }
322
+ if (!item.request && item.notBefore && Date.parse(item.notBefore) > Date.now()) {
323
+ item.waitingReason = `Scheduled for ${item.notBefore}`;
324
+ continue;
325
+ }
326
+ const dependency = item.dependsOn.find(id => !document.items.some(candidate => candidate.taskId === id && candidate.state === "COMPLETED"));
327
+ if (dependency && !item.request) {
328
+ item.waitingReason = `Waiting for dependency ${dependency} to complete local integration`;
329
+ continue;
330
+ }
331
+ if (!item.request && config.workspaceStrategy === "isolatedWorktree" && (retained.length >= (config.queue?.maxWorkspaces ?? 3) || workspaceBytes >= (config.queue?.maxWorkspaceBytes ?? 20 * 1024 ** 3))) {
332
+ item.waitingReason = "Isolated workspace capacity or disk limit reached";
333
+ continue;
334
+ }
335
+ try {
336
+ if (item.request?.kind !== "abort")
337
+ assertAuthorized(item);
338
+ }
339
+ catch (error) {
340
+ item.waitingReason = String(error);
341
+ continue;
342
+ }
343
+ // Legacy leases and unknown workspace owners cannot be bypassed.
344
+ const leasePath = join(this.storage.runtime, "locks/repository.workspace.lease/lease.json");
345
+ if (existsSync(leasePath)) {
346
+ const lease = readJson(leasePath);
347
+ if (lease.taskId !== item.taskId) {
348
+ item.waitingReason = `Repository workspace is leased by ${lease.taskId}`;
349
+ continue;
350
+ }
351
+ }
352
+ const launcher = processIdentity(process.pid);
353
+ invariant(launcher, "Cannot establish execution launcher identity");
354
+ const run = { id: randomUUID(), key: item.key, kind: item.request?.kind ?? "execute", createdAt: now(), launcher, worker: null, outcome: null };
355
+ document.active = run;
356
+ document.strategy = config.workspaceStrategy;
357
+ item.runId = run.id;
358
+ item.sealedRunId = null;
359
+ if (run.kind === "execute") {
360
+ item.workspaceStrategy = config.workspaceStrategy;
361
+ item.state = "CLAIMED";
362
+ }
363
+ return run;
364
+ }
365
+ return null;
366
+ });
367
+ }
368
+ reconcile() {
369
+ this.storage.transaction(document => {
370
+ const run = document.active;
371
+ if (!run)
372
+ return;
373
+ const item = document.items.find(item => item.key === run.key);
374
+ invariant(item, "Active execution has no contract");
375
+ if (!run.worker) {
376
+ // A crash between reservation and spawn is ambiguous, never requeue it.
377
+ if (Date.now() - Date.parse(run.createdAt) > 30000)
378
+ document.fault = "Execution launch ownership is unknown; explicit recovery is required";
379
+ return;
380
+ }
381
+ if (isAlive(run.worker) || processGroupAlive(run.worker.pid))
382
+ return;
383
+ if (!run.outcome) {
384
+ item.state = "BLOCKED";
385
+ item.waitingReason = "Executor stopped without a durable outcome; preserve workspace and recover";
386
+ }
387
+ else {
388
+ item.state = run.outcome.state;
389
+ item.waitingReason = run.outcome.error;
390
+ }
391
+ if (run.outcome && item.sealedRunId === run.id && item.workspaceStrategy === "isolatedWorktree" && STOPPED.has(item.state) && item.sealedDiff) {
392
+ // Worker seals while it owns the lease. Only release after its entire
393
+ // process group has exited; never infer this from the shell exit alone.
394
+ const workspacePath = join(this.storage.runtime, "workspaces", `${item.taskId}.json`);
395
+ if (existsSync(workspacePath)) {
396
+ const workspace = readJson(workspacePath);
397
+ atomicJson(workspacePath, { ...workspace, repositoryLeaseRequired: false, executionExited: true });
398
+ }
399
+ }
400
+ if (item.request?.kind === run.kind)
401
+ item.request = null;
402
+ this.notify(document, item, item.waitingReason ?? (item.state === "COMPLETED" ? "Local integration completed; not pushed" : `Task reached ${item.state}`));
403
+ document.runs.push(structuredClone(run));
404
+ document.active = null;
405
+ });
406
+ }
407
+ }
408
+ function helperFreeCleanCheck(root) {
409
+ invariant(git(root, ["status", "--porcelain"]) === "", "Workspace must be clean before changing queue policy");
410
+ }
411
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}