@frankzhang2026/opencode-android-orchestrator 0.10.0 → 1.0.1

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 (109) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +48 -51
  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/queue-policy.d.ts +12 -0
  10. package/dist/config/queue-policy.d.ts.map +1 -0
  11. package/dist/config/queue-policy.js +18 -0
  12. package/dist/config/queue-policy.js.map +1 -0
  13. package/dist/config/verification-policy.d.ts +8 -3
  14. package/dist/config/verification-policy.d.ts.map +1 -1
  15. package/dist/config/verification-policy.js +48 -14
  16. package/dist/config/verification-policy.js.map +1 -1
  17. package/dist/doctor/index.d.ts.map +1 -1
  18. package/dist/doctor/index.js +3 -49
  19. package/dist/doctor/index.js.map +1 -1
  20. package/dist/doctor/installation.d.ts.map +1 -1
  21. package/dist/doctor/installation.js +3 -0
  22. package/dist/doctor/installation.js.map +1 -1
  23. package/dist/installer/adaptive-templates.d.ts +3 -1
  24. package/dist/installer/adaptive-templates.d.ts.map +1 -1
  25. package/dist/installer/adaptive-templates.js +2 -0
  26. package/dist/installer/adaptive-templates.js.map +1 -1
  27. package/dist/installer/install-manifest.d.ts +1 -0
  28. package/dist/installer/install-manifest.d.ts.map +1 -1
  29. package/dist/installer/install-manifest.js +6 -1
  30. package/dist/installer/install-manifest.js.map +1 -1
  31. package/dist/installer/opencode-config.d.ts +3 -3
  32. package/dist/installer/opencode-config.d.ts.map +1 -1
  33. package/dist/installer/opencode-config.js +1 -1
  34. package/dist/installer/opencode-config.js.map +1 -1
  35. package/dist/installer/uninstall.d.ts.map +1 -1
  36. package/dist/installer/uninstall.js +5 -0
  37. package/dist/installer/uninstall.js.map +1 -1
  38. package/dist/installer/upgrade.d.ts.map +1 -1
  39. package/dist/installer/upgrade.js +13 -1
  40. package/dist/installer/upgrade.js.map +1 -1
  41. package/dist/plugin/index.d.ts.map +1 -1
  42. package/dist/plugin/index.js +11 -5
  43. package/dist/plugin/index.js.map +1 -1
  44. package/dist/queue/approvals.d.ts +49 -0
  45. package/dist/queue/approvals.d.ts.map +1 -0
  46. package/dist/queue/approvals.js +68 -0
  47. package/dist/queue/approvals.js.map +1 -0
  48. package/dist/queue/cli.d.ts +3 -0
  49. package/dist/queue/cli.d.ts.map +1 -0
  50. package/dist/queue/cli.js +115 -0
  51. package/dist/queue/cli.js.map +1 -0
  52. package/dist/queue/executor.d.ts +24 -0
  53. package/dist/queue/executor.d.ts.map +1 -0
  54. package/dist/queue/executor.js +445 -0
  55. package/dist/queue/executor.js.map +1 -0
  56. package/dist/queue/lifecycle.d.ts +3 -0
  57. package/dist/queue/lifecycle.d.ts.map +1 -0
  58. package/dist/queue/lifecycle.js +24 -0
  59. package/dist/queue/lifecycle.js.map +1 -0
  60. package/dist/queue/queue.d.ts +171 -0
  61. package/dist/queue/queue.d.ts.map +1 -0
  62. package/dist/queue/queue.js +506 -0
  63. package/dist/queue/queue.js.map +1 -0
  64. package/dist/queue/service.d.ts +15 -0
  65. package/dist/queue/service.d.ts.map +1 -0
  66. package/dist/queue/service.js +152 -0
  67. package/dist/queue/service.js.map +1 -0
  68. package/dist/queue/storage.d.ts +32 -0
  69. package/dist/queue/storage.d.ts.map +1 -0
  70. package/dist/queue/storage.js +180 -0
  71. package/dist/queue/storage.js.map +1 -0
  72. package/dist/queue/tools.d.ts +12 -0
  73. package/dist/queue/tools.d.ts.map +1 -0
  74. package/dist/queue/tools.js +155 -0
  75. package/dist/queue/tools.js.map +1 -0
  76. package/docs/MIGRATION.md +32 -11
  77. package/docs/QUEUE.md +151 -0
  78. package/docs/SECURITY.md +38 -31
  79. package/docs/TROUBLESHOOTING.md +34 -11
  80. package/package.json +1 -1
  81. package/templates/.opencode/agents/scheduled-planner.md +64 -131
  82. package/templates/.opencode/commands/abort-task.md +6 -15
  83. package/templates/.opencode/commands/acceptance.md +6 -15
  84. package/templates/.opencode/commands/change.md +3 -1
  85. package/templates/.opencode/commands/resume-review.md +6 -14
  86. package/templates/.opencode/commands/resume-task.md +6 -23
  87. package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +72 -248
  88. package/templates/AGENTS.md.fragment +8 -0
  89. package/templates/automation/config.json +8 -2
  90. package/templates/automation/config.schema.json +218 -46
  91. package/templates/scripts/automation/abort-task.sh +2 -1
  92. package/templates/scripts/automation/accept-and-integrate.sh +5 -0
  93. package/templates/scripts/automation/acceptance-report.sh +4 -2
  94. package/templates/scripts/automation/approve-and-run.sh +4 -0
  95. package/templates/scripts/automation/begin-review.sh +1 -0
  96. package/templates/scripts/automation/block-task.sh +1 -0
  97. package/templates/scripts/automation/claim-task.sh +1 -0
  98. package/templates/scripts/automation/lib.sh +94 -1
  99. package/templates/scripts/automation/orchestrate-task.sh +11 -0
  100. package/templates/scripts/automation/preflight.sh +14 -4
  101. package/templates/scripts/automation/prepare-contract-review.sh +4 -0
  102. package/templates/scripts/automation/quality-gate.sh +1 -0
  103. package/templates/scripts/automation/record-red.sh +1 -0
  104. package/templates/scripts/automation/resume-review-fix.sh +1 -0
  105. package/templates/scripts/automation/resume-review.sh +1 -0
  106. package/templates/scripts/automation/resume-task.sh +1 -0
  107. package/templates/scripts/automation/scope-gate.sh +10 -2
  108. package/templates/scripts/automation/submit-review.sh +8 -2
  109. package/templates/scripts/automation/verify-task.sh +13 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,0BAA0B,4CACI,CAAC;AAC5C,eAAO,MAAM,yBAAyB,2CACI,CAAC;AAC3C,eAAO,MAAM,wBAAwB,QAKpC,CAAC;AACF,eAAO,MAAM,iBAAiB,2OAMpB,CAAC;AAwBX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAgCpC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,EAAE,MACyB,CAAC;AAElE,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAKnC,eAAO,MAAM,0BAA0B,4CACI,CAAC;AAC5C,eAAO,MAAM,yBAAyB,2CACI,CAAC;AAC3C,eAAO,MAAM,wBAAwB,QAKpC,CAAC;AACF,eAAO,MAAM,iBAAiB,2OAMpB,CAAC;AAwBX;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAoCpC,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,EAAE,MACyB,CAAC;AAElE,eAAe,yBAAyB,CAAC"}
@@ -4,6 +4,8 @@ import { fileURLToPath } from "node:url";
4
4
  import { applyLongCommandTimeout, readLongCommandTimeoutMs, } from "../config/long-command-timeout.js";
5
5
  import { defineCompatibleHooks, toCompatiblePluginInput, } from "../compatibility/hooks.js";
6
6
  import { createReadOnlyTools } from "../tools/index.js";
7
+ import { ApprovalLedger } from "../queue/approvals.js";
8
+ import { createQueueTools, guardExecutorCommand } from "../queue/tools.js";
7
9
  export const ORCHESTRATOR_DIRECTORY_ENV = "OPENCODE_ANDROID_ORCHESTRATOR_DIRECTORY";
8
10
  export const ORCHESTRATOR_WORKTREE_ENV = "OPENCODE_ANDROID_ORCHESTRATOR_WORKTREE";
9
11
  export const BUNDLED_SKILLS_DIRECTORY = fileURLToPath(new URL("../../resources/third-party/superpowers-v6.2.0/skills/", import.meta.url));
@@ -33,6 +35,7 @@ function assertBundledSkillsAvailable() {
33
35
  */
34
36
  export const createCompatiblePlugin = async ({ directory, worktree, $, }) => {
35
37
  assertBundledSkillsAvailable();
38
+ const approvals = new ApprovalLedger();
36
39
  const projectDirectory = resolve(directory);
37
40
  const projectWorktree = resolve(worktree);
38
41
  const longCommandTimeoutMs = readLongCommandTimeoutMs(projectWorktree);
@@ -45,18 +48,21 @@ export const createCompatiblePlugin = async ({ directory, worktree, $, }) => {
45
48
  compatibleConfig.skills.paths.push(BUNDLED_SKILLS_DIRECTORY);
46
49
  }
47
50
  },
48
- tool: createReadOnlyTools({
49
- directory: projectDirectory,
50
- worktree: projectWorktree,
51
- shell: $,
52
- }),
51
+ tool: { ...createReadOnlyTools({
52
+ directory: projectDirectory,
53
+ worktree: projectWorktree,
54
+ shell: $,
55
+ }), ...createQueueTools(projectWorktree, approvals) },
53
56
  "shell.env": async (_input, output) => {
54
57
  output.env[ORCHESTRATOR_DIRECTORY_ENV] = projectDirectory;
55
58
  output.env[ORCHESTRATOR_WORKTREE_ENV] = projectWorktree;
56
59
  },
57
60
  "tool.execute.before": async (input, output) => {
61
+ approvals.before(input, output);
62
+ guardExecutorCommand(input, output, projectDirectory);
58
63
  applyLongCommandTimeout(input, output, longCommandTimeoutMs);
59
64
  },
65
+ "tool.execute.after": async (input, output) => { approvals.after(input, output); },
60
66
  });
61
67
  };
62
68
  /** OpenCode SDK entry point compiled against the 1.14.22 baseline. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { ToolContext } from "@opencode-ai/plugin";
2
+ export interface ApprovalProof {
3
+ id: string;
4
+ sessionID: string;
5
+ messageID: string;
6
+ questionCallID: string;
7
+ kind: string;
8
+ binding: string;
9
+ selected: string;
10
+ approvedAt: string;
11
+ }
12
+ interface Question {
13
+ header: string;
14
+ question: string;
15
+ options: {
16
+ label: string;
17
+ description: string;
18
+ }[];
19
+ multiple?: boolean;
20
+ }
21
+ export declare const PROPOSAL_APPROVAL = "\u6279\u51C6\u65B9\u6848\uFF0C\u751F\u6210\u8BA1\u5212\u548C\u4EFB\u52A1\u5408\u540C\u3002";
22
+ /** Only the host's completed question hook creates a receipt. Losing the plugin
23
+ * process loses unconsumed receipts and requires another question, never an
24
+ * automatic approval. The consumed proof is copied into durable queue records. */
25
+ export declare class ApprovalLedger {
26
+ private readonly challenges;
27
+ private readonly pending;
28
+ private readonly selections;
29
+ prepare(sessionID: string, kind: string, binding: string, header: string, question: string, approval: string): {
30
+ questions: Question[];
31
+ };
32
+ before(input: {
33
+ tool: string;
34
+ sessionID: string;
35
+ callID: string;
36
+ }, output: {
37
+ args: unknown;
38
+ }): void;
39
+ after(input: {
40
+ tool: string;
41
+ sessionID: string;
42
+ callID: string;
43
+ }, output: {
44
+ metadata: unknown;
45
+ }): void;
46
+ consume(context: Pick<ToolContext, "sessionID" | "messageID">, kind: string, binding: string): ApprovalProof;
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=approvals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../src/queue/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AASD,eAAO,MAAM,iBAAiB,+FAAoB,CAAC;AAEnD;;kFAEkF;AAClF,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAE3D,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;KAAE;IAUxI,MAAM,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAkBnG,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAetG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa;CAQ7G"}
@@ -0,0 +1,68 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { invariant } from "./storage.js";
3
+ const MAX_AGE_MS = 15 * 60 * 1000;
4
+ export const PROPOSAL_APPROVAL = "批准方案,生成计划和任务合同。";
5
+ /** Only the host's completed question hook creates a receipt. Losing the plugin
6
+ * process loses unconsumed receipts and requires another question, never an
7
+ * automatic approval. The consumed proof is copied into durable queue records. */
8
+ export class ApprovalLedger {
9
+ challenges = new Map();
10
+ pending = new Map();
11
+ selections = new Map();
12
+ prepare(sessionID, kind, binding, header, question, approval) {
13
+ const challenge = { kind, binding, preparedAt: Date.now(), question: {
14
+ header, question, multiple: false,
15
+ options: [{ label: approval, description: "确认已展示的这份方案或成果。" }, { label: "暂不批准。", description: "保留当前内容,调整后重新确认。" }],
16
+ } };
17
+ this.challenges.set(sessionID, challenge);
18
+ this.selections.delete(sessionID);
19
+ return { questions: [challenge.question] };
20
+ }
21
+ before(input, output) {
22
+ if (input.tool !== "question")
23
+ return;
24
+ this.selections.delete(input.sessionID);
25
+ const questions = output.args?.questions;
26
+ if (!Array.isArray(questions) || questions.length !== 1)
27
+ return;
28
+ const question = questions[0];
29
+ if (!question || question.multiple === true || !Array.isArray(question.options) || question.options.length !== 2)
30
+ return;
31
+ let challenge = this.challenges.get(input.sessionID);
32
+ if (question.header === "方案确认" && question.options[0]?.label === PROPOSAL_APPROVAL &&
33
+ question.options[1]?.label !== PROPOSAL_APPROVAL && typeof question.question === "string") {
34
+ challenge = { kind: "proposal", binding: "proposal", question, preparedAt: Date.now() };
35
+ }
36
+ else if (!challenge || Date.now() - challenge.preparedAt > MAX_AGE_MS ||
37
+ question.header !== challenge.question.header || question.question !== challenge.question.question ||
38
+ question.options.some((option, index) => option.label !== challenge.question.options[index]?.label))
39
+ return;
40
+ this.challenges.delete(input.sessionID);
41
+ this.pending.set(`${input.sessionID}/${input.callID}`, structuredClone(challenge));
42
+ }
43
+ after(input, output) {
44
+ if (input.tool !== "question")
45
+ return;
46
+ const key = `${input.sessionID}/${input.callID}`;
47
+ const challenge = this.pending.get(key);
48
+ this.pending.delete(key);
49
+ if (!challenge)
50
+ return;
51
+ const answers = output.metadata?.answers;
52
+ if (!Array.isArray(answers) || answers.length !== 1 || !Array.isArray(answers[0]) ||
53
+ answers[0].length !== 1 || answers[0][0] !== challenge.question.options[0].label)
54
+ return;
55
+ this.selections.set(input.sessionID, { ...challenge, proof: {
56
+ id: randomUUID(), sessionID: input.sessionID, questionCallID: input.callID,
57
+ kind: challenge.kind, binding: challenge.binding, selected: answers[0][0], approvedAt: new Date().toISOString(),
58
+ } });
59
+ }
60
+ consume(context, kind, binding) {
61
+ const selected = this.selections.get(context.sessionID);
62
+ invariant(selected && selected.kind === kind && selected.binding === binding &&
63
+ Date.now() - Date.parse(selected.proof.approvedAt) <= MAX_AGE_MS, "A fresh, matching single-choice question selection is required; approval text is not a receipt");
64
+ this.selections.delete(context.sessionID);
65
+ return { ...selected.proof, messageID: context.messageID };
66
+ }
67
+ }
68
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/queue/approvals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAyBzC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD;;kFAEkF;AAClF,MAAM,OAAO,cAAc;IACR,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC1C,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IACvC,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE3D,OAAO,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,QAAgB,EAAE,QAAgB;QAC1G,MAAM,SAAS,GAAc,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE;gBAC9E,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK;gBACjC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;aAClH,EAAE,CAAC;QACJ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,OAAO,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAA0D,EAAE,MAAyB;QAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,SAAS,GAAI,MAAM,CAAC,IAAmC,EAAE,SAAS,CAAC;QACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAChE,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACzH,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,iBAAiB;YAC9E,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,iBAAiB,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9F,SAAS,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1F,CAAC;aAAM,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,UAAU,GAAG,UAAU;YACnE,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,CAAC,QAAQ;YAClG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO;QACjH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,KAA0D,EAAE,MAA6B;QAC7F,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO;QACtC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,OAAO,GAAI,MAAM,CAAC,QAAkC,EAAE,OAAO,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK;YAAE,OAAO;QAC9F,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE;gBAC1D,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM;gBAC1E,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC1H,EAAE,CAAC,CAAC;IACP,CAAC;IAED,OAAO,CAAC,OAAqD,EAAE,IAAY,EAAE,OAAe;QAC1F,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxD,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO;YAC1E,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,EAClE,gGAAgG,CAAC,CAAC;QAClG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function queueCli(args: string[]): Promise<unknown>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/queue/cli.ts"],"names":[],"mappings":";AAQA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAyE/D"}
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { TaskQueue } from "./queue.js";
5
+ import { invariant, recoverLock } from "./storage.js";
6
+ import { runWorker, serve, serviceStatus, startService, stopService, wakeService } from "./service.js";
7
+ export async function queueCli(args) {
8
+ const [action = "status", ...rest] = args;
9
+ if (action === "--help" || action === "-h")
10
+ return {
11
+ usage: "opencode-android-orchestrator queue <action> [directory] [arguments]",
12
+ actions: {
13
+ status: "Durable queue, waiting reasons, notifications and daemon status",
14
+ start: "Start the detached repository scheduler", stop: "Stop scheduling; retain the current executor",
15
+ pause: "Pause new executions", resume: "Resume consumption", snapshot: "[targetBranch] Read compact stable planning metadata",
16
+ list: "<planningHead> [prefix] [query] [cursor] [limit] List bounded stable file pages",
17
+ read: "<planningHead> <path> Read a file at a fixed commit",
18
+ "read-chunk": "<planningHead> <path> [cursor] Read a bounded exact file chunk",
19
+ draft: "<input.json> Seal contract, plan, scheduling and commit policy in the inbox",
20
+ enqueue: "<key> <digest> <approval> Approve exactly one reviewed draft and return immediately",
21
+ cancel: "<key> Cancel an unstarted contract", revoke: "<key> Revoke future commit authorization",
22
+ integrate: "<key> <approval> <candidate> Request local integration after fresh final acceptance",
23
+ revalidate: "<key> Revalidate an isolated candidate on the current target branch",
24
+ "resume-task": "<key> <approval> Queue approved Coder recovery", "resume-review": "<key> <approval> Queue approved Reviewer recovery",
25
+ abort: "<key> <approval> Queue approved archival and safe workspace handoff",
26
+ recover: "<key> Resume a sealed local commit transaction",
27
+ "recover-lock": "Recover a queue transaction only after proving its owner has exited",
28
+ "clear-fault": "Clear a resolved public fault while no executor is active",
29
+ "recover-execution": "Prove the recorded executor and children have exited, then retain its interrupted workspace",
30
+ priority: "<key> <priority> Reorder an unstarted item without changing its sealed authorization",
31
+ policy: "<workspaceStrategy> <commitPolicy> Change repository defaults only while paused and unoccupied",
32
+ },
33
+ };
34
+ if (action === "_worker") {
35
+ invariant(rest.length === 2, "Invalid executor invocation");
36
+ return runWorker(new TaskQueue(rest[1]), rest[0]);
37
+ }
38
+ const [directory = process.cwd(), ...values] = rest;
39
+ const queue = new TaskQueue(directory);
40
+ if (action === "_serve")
41
+ return serve(queue);
42
+ if (action === "status")
43
+ return values[0] ? queue.details(values[0]) : { service: serviceStatus(queue), ...queue.storage.read() };
44
+ if (action === "snapshot")
45
+ return queue.snapshot(values[0]);
46
+ if (action === "list")
47
+ return queue.listSnapshot(values[0] ?? "", values[1], values[2], values[3], values[4] === undefined ? undefined : Number(values[4]));
48
+ if (action === "read")
49
+ return queue.readSnapshot(values[0] ?? "", values[1] ?? "");
50
+ if (action === "read-chunk")
51
+ return queue.readSnapshotChunk(values[0] ?? "", values[1] ?? "", values[2]);
52
+ if (action === "draft") {
53
+ invariant(values.length === 1, "draft requires an input JSON file");
54
+ const draft = queue.draft(JSON.parse(readFileSync(values[0], "utf8")));
55
+ return { ...draft, approvalText: queue.approvalText(draft) };
56
+ }
57
+ if (action === "enqueue") {
58
+ invariant(values.length === 3, "enqueue requires key, digest and exact review approval");
59
+ const item = queue.enqueue(values[0], values[1], values[2]);
60
+ let serviceError = null;
61
+ try {
62
+ startService(queue);
63
+ }
64
+ catch (error) {
65
+ serviceError = String(error);
66
+ }
67
+ return { key: item.key, state: item.state, commitPolicy: item.commitPolicy, workspaceStrategy: item.workspaceStrategy, serviceError, pushed: false };
68
+ }
69
+ if (action === "start") {
70
+ startService(queue);
71
+ return { requested: "start" };
72
+ }
73
+ if (action === "stop") {
74
+ stopService(queue);
75
+ return { requested: "stop" };
76
+ }
77
+ if (["pause", "resume", "clear-fault", "cancel", "revoke", "acknowledge"].includes(action)) {
78
+ const result = queue.control(action, values[0]);
79
+ wakeService(queue);
80
+ return result;
81
+ }
82
+ if (action === "recover-lock") {
83
+ recoverLock(queue.storage.lockPath);
84
+ return { recovered: true };
85
+ }
86
+ if (action === "recover-execution") {
87
+ queue.recoverExecution();
88
+ wakeService(queue);
89
+ return { recovered: true };
90
+ }
91
+ if (action === "priority") {
92
+ queue.reorder(values[0] ?? "", Number(values[1]));
93
+ wakeService(queue);
94
+ return { reordered: values[0] };
95
+ }
96
+ if (action === "policy") {
97
+ invariant(values.length === 2, "policy requires workspaceStrategy and commitPolicy");
98
+ queue.setPolicy(values[0], values[1]);
99
+ return { policy: queue.config() };
100
+ }
101
+ if (["integrate", "revalidate", "resume-task", "resume-review", "abort", "recover"].includes(action)) {
102
+ const kind = action === "resume-task" ? "resume" : action;
103
+ queue.request(values[0] ?? "", kind, values[1], values[2]);
104
+ startService(queue);
105
+ return { key: values[0], requested: kind };
106
+ }
107
+ throw new Error(`Unknown queue action: ${action}`);
108
+ }
109
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
110
+ queueCli(process.argv.slice(2)).then(result => {
111
+ if (result !== undefined)
112
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
113
+ }).catch(error => { process.stderr.write(`${String(error)}\n`); process.exitCode = 1; });
114
+ }
115
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/queue/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { TaskQueue, type QueueRun } from "./queue.js";
2
+ export declare function workerEnvironment(runId: string): NodeJS.ProcessEnv;
3
+ export declare function helper(root: string, name: string, args?: string[], runId?: string): string;
4
+ export declare class QueueExecutor {
5
+ readonly queue: TaskQueue;
6
+ readonly run: QueueRun;
7
+ private readonly evidence;
8
+ private readonly workspacePath;
9
+ private readonly previousAgentRuns;
10
+ constructor(queue: TaskQueue, run: QueueRun);
11
+ private item;
12
+ private workspace;
13
+ private state;
14
+ private setState;
15
+ private assertOwner;
16
+ private lease;
17
+ private executionInputsChanged;
18
+ private prepare;
19
+ private seal;
20
+ private integrate;
21
+ private revalidate;
22
+ execute(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/queue/executor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsC,SAAS,EAAkB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoB1G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CASlE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,KAAK,SAAK,GAAG,MAAM,CAO1F;AAaD,qBAAa,aAAa;IAIZ,QAAQ,CAAC,KAAK,EAAE,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ;IAH7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBACtB,KAAK,EAAE,SAAS,EAAW,GAAG,EAAE,QAAQ;IAO7D,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,OAAO;IA8Df,OAAO,CAAC,IAAI;YAiBE,SAAS;YA4JT,UAAU;IAsClB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CA6C/B"}