@frankzhang2026/opencode-android-orchestrator 0.10.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.
- package/CHANGELOG.md +18 -0
- package/README.md +45 -51
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/android-sdk.d.ts +10 -0
- package/dist/config/android-sdk.d.ts.map +1 -0
- package/dist/config/android-sdk.js +50 -0
- package/dist/config/android-sdk.js.map +1 -0
- package/dist/config/queue-policy.d.ts +12 -0
- package/dist/config/queue-policy.d.ts.map +1 -0
- package/dist/config/queue-policy.js +18 -0
- package/dist/config/queue-policy.js.map +1 -0
- package/dist/config/verification-policy.d.ts +8 -3
- package/dist/config/verification-policy.d.ts.map +1 -1
- package/dist/config/verification-policy.js +48 -14
- package/dist/config/verification-policy.js.map +1 -1
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +3 -49
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/installation.d.ts.map +1 -1
- package/dist/doctor/installation.js +3 -0
- package/dist/doctor/installation.js.map +1 -1
- package/dist/installer/adaptive-templates.d.ts +3 -1
- package/dist/installer/adaptive-templates.d.ts.map +1 -1
- package/dist/installer/adaptive-templates.js +2 -0
- package/dist/installer/adaptive-templates.js.map +1 -1
- package/dist/installer/install-manifest.d.ts +1 -0
- package/dist/installer/install-manifest.d.ts.map +1 -1
- package/dist/installer/install-manifest.js +6 -1
- package/dist/installer/install-manifest.js.map +1 -1
- package/dist/installer/opencode-config.d.ts +3 -3
- package/dist/installer/opencode-config.d.ts.map +1 -1
- package/dist/installer/opencode-config.js +1 -1
- package/dist/installer/opencode-config.js.map +1 -1
- package/dist/installer/uninstall.d.ts.map +1 -1
- package/dist/installer/uninstall.js +5 -0
- package/dist/installer/uninstall.js.map +1 -1
- package/dist/installer/upgrade.d.ts.map +1 -1
- package/dist/installer/upgrade.js +13 -1
- package/dist/installer/upgrade.js.map +1 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +11 -5
- package/dist/plugin/index.js.map +1 -1
- package/dist/queue/approvals.d.ts +49 -0
- package/dist/queue/approvals.d.ts.map +1 -0
- package/dist/queue/approvals.js +68 -0
- package/dist/queue/approvals.js.map +1 -0
- package/dist/queue/cli.d.ts +3 -0
- package/dist/queue/cli.d.ts.map +1 -0
- package/dist/queue/cli.js +109 -0
- package/dist/queue/cli.js.map +1 -0
- package/dist/queue/executor.d.ts +24 -0
- package/dist/queue/executor.d.ts.map +1 -0
- package/dist/queue/executor.js +445 -0
- package/dist/queue/executor.js.map +1 -0
- package/dist/queue/lifecycle.d.ts +3 -0
- package/dist/queue/lifecycle.d.ts.map +1 -0
- package/dist/queue/lifecycle.js +24 -0
- package/dist/queue/lifecycle.js.map +1 -0
- package/dist/queue/queue.d.ts +154 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +411 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/service.d.ts +15 -0
- package/dist/queue/service.d.ts.map +1 -0
- package/dist/queue/service.js +152 -0
- package/dist/queue/service.js.map +1 -0
- package/dist/queue/storage.d.ts +30 -0
- package/dist/queue/storage.d.ts.map +1 -0
- package/dist/queue/storage.js +171 -0
- package/dist/queue/storage.js.map +1 -0
- package/dist/queue/tools.d.ts +12 -0
- package/dist/queue/tools.d.ts.map +1 -0
- package/dist/queue/tools.js +144 -0
- package/dist/queue/tools.js.map +1 -0
- package/docs/MIGRATION.md +31 -11
- package/docs/QUEUE.md +146 -0
- package/docs/SECURITY.md +38 -31
- package/docs/TROUBLESHOOTING.md +34 -11
- package/package.json +1 -1
- package/templates/.opencode/agents/scheduled-planner.md +60 -131
- package/templates/.opencode/commands/abort-task.md +6 -15
- package/templates/.opencode/commands/acceptance.md +6 -15
- package/templates/.opencode/commands/change.md +3 -1
- package/templates/.opencode/commands/resume-review.md +6 -14
- package/templates/.opencode/commands/resume-task.md +6 -23
- package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +69 -248
- package/templates/AGENTS.md.fragment +8 -0
- package/templates/automation/config.json +8 -2
- package/templates/automation/config.schema.json +218 -46
- package/templates/scripts/automation/abort-task.sh +2 -1
- package/templates/scripts/automation/accept-and-integrate.sh +5 -0
- package/templates/scripts/automation/acceptance-report.sh +4 -2
- package/templates/scripts/automation/approve-and-run.sh +4 -0
- package/templates/scripts/automation/begin-review.sh +1 -0
- package/templates/scripts/automation/block-task.sh +1 -0
- package/templates/scripts/automation/claim-task.sh +1 -0
- package/templates/scripts/automation/lib.sh +94 -1
- package/templates/scripts/automation/orchestrate-task.sh +11 -0
- package/templates/scripts/automation/preflight.sh +14 -4
- package/templates/scripts/automation/prepare-contract-review.sh +4 -0
- package/templates/scripts/automation/quality-gate.sh +1 -0
- package/templates/scripts/automation/record-red.sh +1 -0
- package/templates/scripts/automation/resume-review-fix.sh +1 -0
- package/templates/scripts/automation/resume-review.sh +1 -0
- package/templates/scripts/automation/resume-task.sh +1 -0
- package/templates/scripts/automation/scope-gate.sh +10 -2
- package/templates/scripts/automation/submit-review.sh +8 -2
- 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;
|
|
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"}
|
package/dist/plugin/index.js
CHANGED
|
@@ -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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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. */
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAExB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,CAAC,MAAM,0BAA0B,GACrC,yCAAyC,CAAC;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GACpC,wCAAwC,CAAC;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,aAAa,CACnD,IAAI,GAAG,CACL,wDAAwD,EACxD,MAAM,CAAC,IAAI,CAAC,GAAG,CAChB,CACF,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oCAAoC;IACpC,oCAAoC;IACpC,8CAA8C;IAC9C,2CAA2C;IAC3C,qDAAqD;CAC7C,CAAC;AAQX,SAAS,4BAA4B;IACnC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,OAAO,CAAC,wBAAwB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC1E,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,6CAA6C,EAClG,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAqB,KAAK,EAAE,EAC7D,SAAS,EACT,QAAQ,EACR,CAAC,GACF,EAAE,EAAE;IACH,4BAA4B,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAEvE,OAAO,qBAAqB,CAAC;QAC3B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvB,MAAM,gBAAgB,GAAG,MAA8C,CAAC;YACxE,gBAAgB,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,IAAI,EAAE,CAAC;YACxD,gBAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACpE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBACtE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QACD,IAAI,EAAE,EAAE,GAAG,mBAAmB,CAAC;gBAC7B,SAAS,EAAE,gBAAgB;gBAC3B,QAAQ,EAAE,eAAe;gBACzB,KAAK,EAAE,CAAC;aACT,CAAC,EAAE,GAAG,gBAAgB,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE;QACrD,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,gBAAgB,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,GAAG,eAAe,CAAC;QAC1D,CAAC;QACD,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC7C,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACtD,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC;QACD,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KACnF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAW,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CACxE,sBAAsB,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAElE,eAAe,yBAAyB,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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,CAqE/D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
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 stable planning HEAD and file inventory",
|
|
16
|
+
read: "<planningHead> <path> Read a file at a fixed commit",
|
|
17
|
+
draft: "<input.json> Seal contract, plan, scheduling and commit policy in the inbox",
|
|
18
|
+
enqueue: "<key> <digest> <approval> Approve exactly one reviewed draft and return immediately",
|
|
19
|
+
cancel: "<key> Cancel an unstarted contract", revoke: "<key> Revoke future commit authorization",
|
|
20
|
+
integrate: "<key> <approval> <candidate> Request local integration after fresh final acceptance",
|
|
21
|
+
revalidate: "<key> Revalidate an isolated candidate on the current target branch",
|
|
22
|
+
"resume-task": "<key> <approval> Queue approved Coder recovery", "resume-review": "<key> <approval> Queue approved Reviewer recovery",
|
|
23
|
+
abort: "<key> <approval> Queue approved archival and safe workspace handoff",
|
|
24
|
+
recover: "<key> Resume a sealed local commit transaction",
|
|
25
|
+
"recover-lock": "Recover a queue transaction only after proving its owner has exited",
|
|
26
|
+
"clear-fault": "Clear a resolved public fault while no executor is active",
|
|
27
|
+
"recover-execution": "Prove the recorded executor and children have exited, then retain its interrupted workspace",
|
|
28
|
+
priority: "<key> <priority> Reorder an unstarted item without changing its sealed authorization",
|
|
29
|
+
policy: "<workspaceStrategy> <commitPolicy> Change repository defaults only while paused and unoccupied",
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
if (action === "_worker") {
|
|
33
|
+
invariant(rest.length === 2, "Invalid executor invocation");
|
|
34
|
+
return runWorker(new TaskQueue(rest[1]), rest[0]);
|
|
35
|
+
}
|
|
36
|
+
const [directory = process.cwd(), ...values] = rest;
|
|
37
|
+
const queue = new TaskQueue(directory);
|
|
38
|
+
if (action === "_serve")
|
|
39
|
+
return serve(queue);
|
|
40
|
+
if (action === "status")
|
|
41
|
+
return values[0] ? queue.details(values[0]) : { service: serviceStatus(queue), ...queue.storage.read() };
|
|
42
|
+
if (action === "snapshot")
|
|
43
|
+
return queue.snapshot(values[0]);
|
|
44
|
+
if (action === "read")
|
|
45
|
+
return queue.readSnapshot(values[0] ?? "", values[1] ?? "");
|
|
46
|
+
if (action === "draft") {
|
|
47
|
+
invariant(values.length === 1, "draft requires an input JSON file");
|
|
48
|
+
const draft = queue.draft(JSON.parse(readFileSync(values[0], "utf8")));
|
|
49
|
+
return { ...draft, approvalText: queue.approvalText(draft) };
|
|
50
|
+
}
|
|
51
|
+
if (action === "enqueue") {
|
|
52
|
+
invariant(values.length === 3, "enqueue requires key, digest and exact review approval");
|
|
53
|
+
const item = queue.enqueue(values[0], values[1], values[2]);
|
|
54
|
+
let serviceError = null;
|
|
55
|
+
try {
|
|
56
|
+
startService(queue);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
serviceError = String(error);
|
|
60
|
+
}
|
|
61
|
+
return { key: item.key, state: item.state, commitPolicy: item.commitPolicy, workspaceStrategy: item.workspaceStrategy, serviceError, pushed: false };
|
|
62
|
+
}
|
|
63
|
+
if (action === "start") {
|
|
64
|
+
startService(queue);
|
|
65
|
+
return { requested: "start" };
|
|
66
|
+
}
|
|
67
|
+
if (action === "stop") {
|
|
68
|
+
stopService(queue);
|
|
69
|
+
return { requested: "stop" };
|
|
70
|
+
}
|
|
71
|
+
if (["pause", "resume", "clear-fault", "cancel", "revoke", "acknowledge"].includes(action)) {
|
|
72
|
+
const result = queue.control(action, values[0]);
|
|
73
|
+
wakeService(queue);
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
if (action === "recover-lock") {
|
|
77
|
+
recoverLock(queue.storage.lockPath);
|
|
78
|
+
return { recovered: true };
|
|
79
|
+
}
|
|
80
|
+
if (action === "recover-execution") {
|
|
81
|
+
queue.recoverExecution();
|
|
82
|
+
wakeService(queue);
|
|
83
|
+
return { recovered: true };
|
|
84
|
+
}
|
|
85
|
+
if (action === "priority") {
|
|
86
|
+
queue.reorder(values[0] ?? "", Number(values[1]));
|
|
87
|
+
wakeService(queue);
|
|
88
|
+
return { reordered: values[0] };
|
|
89
|
+
}
|
|
90
|
+
if (action === "policy") {
|
|
91
|
+
invariant(values.length === 2, "policy requires workspaceStrategy and commitPolicy");
|
|
92
|
+
queue.setPolicy(values[0], values[1]);
|
|
93
|
+
return { policy: queue.config() };
|
|
94
|
+
}
|
|
95
|
+
if (["integrate", "revalidate", "resume-task", "resume-review", "abort", "recover"].includes(action)) {
|
|
96
|
+
const kind = action === "resume-task" ? "resume" : action;
|
|
97
|
+
queue.request(values[0] ?? "", kind, values[1], values[2]);
|
|
98
|
+
startService(queue);
|
|
99
|
+
return { key: values[0], requested: kind };
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`Unknown queue action: ${action}`);
|
|
102
|
+
}
|
|
103
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
104
|
+
queueCli(process.argv.slice(2)).then(result => {
|
|
105
|
+
if (result !== undefined)
|
|
106
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
107
|
+
}).catch(error => { process.stderr.write(`${String(error)}\n`); process.exitCode = 1; });
|
|
108
|
+
}
|
|
109
|
+
//# 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"}
|