@mickorz/opencode-agentic-workflow 0.3.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/LICENSE +21 -0
- package/README.md +406 -0
- package/dist/metrics/collector.d.ts +98 -0
- package/dist/metrics/collector.js +246 -0
- package/dist/metrics/collector.js.map +1 -0
- package/dist/observability/events.d.ts +99 -0
- package/dist/observability/events.js +55 -0
- package/dist/observability/events.js.map +1 -0
- package/dist/observability/observe.d.ts +7 -0
- package/dist/observability/observe.js +29 -0
- package/dist/observability/observe.js.map +1 -0
- package/dist/observability/trace.d.ts +26 -0
- package/dist/observability/trace.js +52 -0
- package/dist/observability/trace.js.map +1 -0
- package/dist/plugin/checkpoint-rpc.d.ts +74 -0
- package/dist/plugin/checkpoint-rpc.js +73 -0
- package/dist/plugin/checkpoint-rpc.js.map +1 -0
- package/dist/plugin/index.d.ts +24 -0
- package/dist/plugin/index.js +271 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/interactive-checkpoint-gate.d.ts +35 -0
- package/dist/plugin/interactive-checkpoint-gate.js +86 -0
- package/dist/plugin/interactive-checkpoint-gate.js.map +1 -0
- package/dist/plugin/opencode-v2-executor.d.ts +55 -0
- package/dist/plugin/opencode-v2-executor.js +92 -0
- package/dist/plugin/opencode-v2-executor.js.map +1 -0
- package/dist/plugin/policy-checkpoint-gate.d.ts +18 -0
- package/dist/plugin/policy-checkpoint-gate.js +27 -0
- package/dist/plugin/policy-checkpoint-gate.js.map +1 -0
- package/dist/plugin/price-table.d.ts +46 -0
- package/dist/plugin/price-table.js +44 -0
- package/dist/plugin/price-table.js.map +1 -0
- package/dist/plugin/tui.d.ts +12 -0
- package/dist/plugin/tui.js +53 -0
- package/dist/plugin/tui.js.map +1 -0
- package/dist/quality/check.d.ts +30 -0
- package/dist/quality/check.js +51 -0
- package/dist/quality/check.js.map +1 -0
- package/dist/quality/checkpoint.d.ts +44 -0
- package/dist/quality/checkpoint.js +55 -0
- package/dist/quality/checkpoint.js.map +1 -0
- package/dist/quality/json.d.ts +10 -0
- package/dist/quality/json.js +31 -0
- package/dist/quality/json.js.map +1 -0
- package/dist/quality/predicates.d.ts +17 -0
- package/dist/quality/predicates.js +44 -0
- package/dist/quality/predicates.js.map +1 -0
- package/dist/quality/verify.d.ts +50 -0
- package/dist/quality/verify.js +110 -0
- package/dist/quality/verify.js.map +1 -0
- package/dist/registry/definition.d.ts +66 -0
- package/dist/registry/definition.js +19 -0
- package/dist/registry/definition.js.map +1 -0
- package/dist/registry/errors.d.ts +31 -0
- package/dist/registry/errors.js +48 -0
- package/dist/registry/errors.js.map +1 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.js +9 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +45 -0
- package/dist/registry/registry.js +117 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/runner.d.ts +56 -0
- package/dist/registry/runner.js +199 -0
- package/dist/registry/runner.js.map +1 -0
- package/dist/registry/schema.d.ts +18 -0
- package/dist/registry/schema.js +73 -0
- package/dist/registry/schema.js.map +1 -0
- package/dist/runtime/command.d.ts +38 -0
- package/dist/runtime/command.js +61 -0
- package/dist/runtime/command.js.map +1 -0
- package/dist/runtime/engine.d.ts +17 -0
- package/dist/runtime/engine.js +31 -0
- package/dist/runtime/engine.js.map +1 -0
- package/dist/runtime/errors.d.ts +56 -0
- package/dist/runtime/errors.js +88 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/executor.d.ts +46 -0
- package/dist/runtime/executor.js +16 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/semaphore.d.ts +24 -0
- package/dist/runtime/semaphore.js +57 -0
- package/dist/runtime/semaphore.js.map +1 -0
- package/dist/state/file-store.d.ts +25 -0
- package/dist/state/file-store.js +138 -0
- package/dist/state/file-store.js.map +1 -0
- package/dist/state/journal.d.ts +83 -0
- package/dist/state/journal.js +59 -0
- package/dist/state/journal.js.map +1 -0
- package/dist/state/recorder.d.ts +63 -0
- package/dist/state/recorder.js +138 -0
- package/dist/state/recorder.js.map +1 -0
- package/dist/state/store.d.ts +23 -0
- package/dist/state/store.js +14 -0
- package/dist/state/store.js.map +1 -0
- package/dist/workflow/agent.d.ts +8 -0
- package/dist/workflow/agent.js +38 -0
- package/dist/workflow/agent.js.map +1 -0
- package/dist/workflow/fallback.d.ts +15 -0
- package/dist/workflow/fallback.js +32 -0
- package/dist/workflow/fallback.js.map +1 -0
- package/dist/workflow/parallel.d.ts +14 -0
- package/dist/workflow/parallel.js +62 -0
- package/dist/workflow/parallel.js.map +1 -0
- package/dist/workflow/phase.d.ts +7 -0
- package/dist/workflow/phase.js +12 -0
- package/dist/workflow/phase.js.map +1 -0
- package/dist/workflow/reliable.d.ts +50 -0
- package/dist/workflow/reliable.js +92 -0
- package/dist/workflow/reliable.js.map +1 -0
- package/dist/workflow/retry.d.ts +28 -0
- package/dist/workflow/retry.js +53 -0
- package/dist/workflow/retry.js.map +1 -0
- package/dist/workflow/sequence.d.ts +40 -0
- package/dist/workflow/sequence.js +100 -0
- package/dist/workflow/sequence.js.map +1 -0
- package/dist/workflow/smoke.d.ts +17 -0
- package/dist/workflow/smoke.js +38 -0
- package/dist/workflow/smoke.js.map +1 -0
- package/dist/workflows/artifact.d.ts +24 -0
- package/dist/workflows/artifact.js +71 -0
- package/dist/workflows/artifact.js.map +1 -0
- package/dist/workflows/index.d.ts +19 -0
- package/dist/workflows/index.js +40 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/reliable.d.ts +18 -0
- package/dist/workflows/reliable.js +32 -0
- package/dist/workflows/reliable.js.map +1 -0
- package/dist/workflows/smoke.d.ts +13 -0
- package/dist/workflows/smoke.js +26 -0
- package/dist/workflows/smoke.js.map +1 -0
- package/dist/workspace/ambient.d.ts +12 -0
- package/dist/workspace/ambient.js +17 -0
- package/dist/workspace/ambient.js.map +1 -0
- package/dist/workspace/git-worktree.d.ts +29 -0
- package/dist/workspace/git-worktree.js +110 -0
- package/dist/workspace/git-worktree.js.map +1 -0
- package/dist/workspace/index.d.ts +6 -0
- package/dist/workspace/index.js +6 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/provider.d.ts +61 -0
- package/dist/workspace/provider.js +15 -0
- package/dist/workspace/provider.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitWorktreeProvider(P2.7)—— WorkspaceProvider 的 git worktree 实现
|
|
3
|
+
*
|
|
4
|
+
* git -C <repo> worktree add -b agw/<runId> <dir>/<runId> [<baseRef>]
|
|
5
|
+
*
|
|
6
|
+
* - worktree 目录默认放在仓库**同级**目录(<项目名>-worktrees/<runId>),
|
|
7
|
+
* 不污染仓库本身(无需 .gitignore);
|
|
8
|
+
* - dispose 只移除 worktree(+prune),**不删分支**——分支是廉价 ref,
|
|
9
|
+
* 删除是破坏性操作,留给用户(git branch --list 'agw/*' 可批量清理);
|
|
10
|
+
* - attach 严格校验存在性,缺失即抛错(durable resume 纪律)。
|
|
11
|
+
*/
|
|
12
|
+
import { execFile } from "node:child_process";
|
|
13
|
+
import { promises as fs } from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import { promisify } from "node:util";
|
|
16
|
+
const exec = promisify(execFile);
|
|
17
|
+
async function git(args, cwd) {
|
|
18
|
+
const { stdout } = await exec("git", args, { cwd });
|
|
19
|
+
return stdout.trim();
|
|
20
|
+
}
|
|
21
|
+
export class GitWorktreeProvider {
|
|
22
|
+
kind = "git-worktree";
|
|
23
|
+
startDir;
|
|
24
|
+
dirOverride;
|
|
25
|
+
cache;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.startDir = options.startDir;
|
|
28
|
+
this.dirOverride = options.dir;
|
|
29
|
+
}
|
|
30
|
+
async resolvePaths() {
|
|
31
|
+
if (this.cache)
|
|
32
|
+
return this.cache;
|
|
33
|
+
const repoRoot = await git(["rev-parse", "--show-toplevel"], this.startDir);
|
|
34
|
+
const dir = this.dirOverride ??
|
|
35
|
+
path.join(path.dirname(repoRoot), `${path.basename(repoRoot)}-worktrees`);
|
|
36
|
+
this.cache = { repoRoot, dir };
|
|
37
|
+
return this.cache;
|
|
38
|
+
}
|
|
39
|
+
async create(runId, options = {}) {
|
|
40
|
+
const { repoRoot, dir } = await this.resolvePaths();
|
|
41
|
+
const branch = options.branch ?? `agw/${runId}`;
|
|
42
|
+
const root = options.path ?? path.join(dir, runId);
|
|
43
|
+
await fs.mkdir(path.dirname(root), { recursive: true });
|
|
44
|
+
const args = ["worktree", "add", "-b", branch, root];
|
|
45
|
+
if (options.baseRef)
|
|
46
|
+
args.push(options.baseRef);
|
|
47
|
+
await git(args, repoRoot);
|
|
48
|
+
const identity = {
|
|
49
|
+
provider: this.kind,
|
|
50
|
+
path: root,
|
|
51
|
+
branch,
|
|
52
|
+
baseRef: options.baseRef,
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
root,
|
|
56
|
+
identity,
|
|
57
|
+
dispose: (disposeOptions) => this.removeWorktree(root, disposeOptions),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async attach(identity) {
|
|
61
|
+
if (identity.provider !== this.kind) {
|
|
62
|
+
throw new Error(`[agentic-workflow] workspace provider mismatch: ${identity.provider} != ${this.kind}`);
|
|
63
|
+
}
|
|
64
|
+
const stat = await fs.stat(identity.path).catch(() => undefined);
|
|
65
|
+
if (!stat?.isDirectory()) {
|
|
66
|
+
throw new Error(`[agentic-workflow] workspace missing: ${identity.path} ` +
|
|
67
|
+
`(durable resume requires the original worktree; it may have been cleaned up — ` +
|
|
68
|
+
`re-run from scratch if the work product is recoverable)`);
|
|
69
|
+
}
|
|
70
|
+
const inside = await git(["rev-parse", "--is-inside-work-tree"], identity.path);
|
|
71
|
+
if (inside !== "true") {
|
|
72
|
+
throw new Error(`[agentic-workflow] not a git worktree: ${identity.path}`);
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
root: identity.path,
|
|
76
|
+
identity,
|
|
77
|
+
dispose: (disposeOptions) => this.removeWorktree(identity.path, disposeOptions),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async removeWorktree(root, options) {
|
|
81
|
+
// 从 worktree 自身解析主仓库根:跨目录/跨服务 resume 时,provider 的
|
|
82
|
+
// startDir 可能已不是该 worktree 所属仓库(journal 里的 path 才是事实源)
|
|
83
|
+
let repoRoot;
|
|
84
|
+
try {
|
|
85
|
+
const commonDir = await git(["rev-parse", "--git-common-dir"], root);
|
|
86
|
+
repoRoot = path.dirname(path.resolve(root, commonDir));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// worktree 目录已不存在:视为已清理(幂等)
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const args = ["worktree", "remove"];
|
|
93
|
+
if (options?.force)
|
|
94
|
+
args.push("--force");
|
|
95
|
+
args.push(root);
|
|
96
|
+
try {
|
|
97
|
+
await git(args, repoRoot);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
// 幂等:目录已不存在视为成功
|
|
101
|
+
const gone = !(await fs.stat(root).catch(() => undefined));
|
|
102
|
+
if (!gone)
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
await git(["worktree", "prune"], repoRoot).catch(() => { });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=git-worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../../src/workspace/git-worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace 公共出口(P2.7)
|
|
3
|
+
*/
|
|
4
|
+
export type { WorkspaceHandle, WorkspaceIdentity, WorkspaceOptions, WorkspaceProvider, CleanupPolicy, } from "./provider.js";
|
|
5
|
+
export { GitWorktreeProvider, type GitWorktreeProviderOptions } from "./git-worktree.js";
|
|
6
|
+
export { currentWorkspace, setCurrentWorkspace } from "./ambient.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,mBAAmB,EAAmC,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace 抽象(P2.7)—— Workflow 的文件系统隔离边界
|
|
3
|
+
*
|
|
4
|
+
* Core 不知道 Git、也不知道 OpenCode:只依赖本抽象。
|
|
5
|
+
* GitWorktreeProvider 是其中一个实现(经 child_process 执行 git,
|
|
6
|
+
* 同样零 OpenCode 依赖);未来可有 DockerWorkspaceProvider 等。
|
|
7
|
+
*
|
|
8
|
+
* 关键纪律:
|
|
9
|
+
* - worktree 属于 runtime infrastructure,不是业务 workflow 原语——
|
|
10
|
+
* workflow 定义只看到 ctx.workspaceRoot,绝不自己执行 git 命令。
|
|
11
|
+
* - resume 必须重新附着 journal 记录的**原** workspace(绝不静默重建):
|
|
12
|
+
* durable resume = journal 状态 + 文件系统状态 同时恢复。
|
|
13
|
+
*/
|
|
14
|
+
/** 持久化到 journal 的 workspace 身份(resume attach 的依据) */
|
|
15
|
+
export interface WorkspaceIdentity {
|
|
16
|
+
/** 提供者类型(如 "git-worktree") */
|
|
17
|
+
provider: string;
|
|
18
|
+
/** 工作区根目录(绝对路径) */
|
|
19
|
+
path: string;
|
|
20
|
+
/** 分支名(git-worktree) */
|
|
21
|
+
branch?: string;
|
|
22
|
+
/** 创建时的基准 ref */
|
|
23
|
+
baseRef?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface WorkspaceOptions {
|
|
26
|
+
/** 基准 ref(缺省 = 仓库当前 HEAD) */
|
|
27
|
+
baseRef?: string;
|
|
28
|
+
/** 分支名(缺省 agw/<runId>) */
|
|
29
|
+
branch?: string;
|
|
30
|
+
/** 工作区路径(缺省由 provider 决定) */
|
|
31
|
+
path?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface WorkspaceHandle {
|
|
34
|
+
/** 工作区根目录(子 agent 的 cwd) */
|
|
35
|
+
root: string;
|
|
36
|
+
identity: WorkspaceIdentity;
|
|
37
|
+
/**
|
|
38
|
+
* 清理工作区。force 时丢弃未提交变更;
|
|
39
|
+
* 已被移除视为成功(幂等)。
|
|
40
|
+
*/
|
|
41
|
+
dispose(options?: {
|
|
42
|
+
force?: boolean;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export interface WorkspaceProvider {
|
|
46
|
+
readonly kind: string;
|
|
47
|
+
/** 为新 run 创建工作区 */
|
|
48
|
+
create(runId: string, options?: WorkspaceOptions): Promise<WorkspaceHandle>;
|
|
49
|
+
/**
|
|
50
|
+
* 重新附着已有工作区(resume)。
|
|
51
|
+
* 不存在时必须抛错——绝不静默重建(文件系统状态丢失 = 假恢复)。
|
|
52
|
+
*/
|
|
53
|
+
attach(identity: WorkspaceIdentity): Promise<WorkspaceHandle>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 清理策略:
|
|
57
|
+
* - "always" 无论成败都清理
|
|
58
|
+
* - "on-success" 仅成功清理;失败保留现场(debug/resume 取证,默认)
|
|
59
|
+
* - "never" 永不清理
|
|
60
|
+
*/
|
|
61
|
+
export type CleanupPolicy = "always" | "on-success" | "never";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace 抽象(P2.7)—— Workflow 的文件系统隔离边界
|
|
3
|
+
*
|
|
4
|
+
* Core 不知道 Git、也不知道 OpenCode:只依赖本抽象。
|
|
5
|
+
* GitWorktreeProvider 是其中一个实现(经 child_process 执行 git,
|
|
6
|
+
* 同样零 OpenCode 依赖);未来可有 DockerWorkspaceProvider 等。
|
|
7
|
+
*
|
|
8
|
+
* 关键纪律:
|
|
9
|
+
* - worktree 属于 runtime infrastructure,不是业务 workflow 原语——
|
|
10
|
+
* workflow 定义只看到 ctx.workspaceRoot,绝不自己执行 git 命令。
|
|
11
|
+
* - resume 必须重新附着 journal 记录的**原** workspace(绝不静默重建):
|
|
12
|
+
* durable resume = journal 状态 + 文件系统状态 同时恢复。
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/workspace/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mickorz/opencode-agentic-workflow",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Durable Agentic Workflow Runtime for OpenCode V2: journal & resume, version registry, tracing, token/cost metrics, git worktree isolation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "mickorz",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/mickorz/opencode-agentic-workflow.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/mickorz/opencode-agentic-workflow#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/mickorz/opencode-agentic-workflow/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"opencode",
|
|
18
|
+
"opencode-plugin",
|
|
19
|
+
"workflow",
|
|
20
|
+
"agentic",
|
|
21
|
+
"multi-agent",
|
|
22
|
+
"agent-orchestration",
|
|
23
|
+
"durable",
|
|
24
|
+
"resume",
|
|
25
|
+
"worktree",
|
|
26
|
+
"llm"
|
|
27
|
+
],
|
|
28
|
+
"main": "./dist/plugin/index.js",
|
|
29
|
+
"types": "./dist/plugin/index.d.ts",
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
},
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"import": "./dist/plugin/index.js",
|
|
39
|
+
"types": "./dist/plugin/index.d.ts"
|
|
40
|
+
},
|
|
41
|
+
"./tui": {
|
|
42
|
+
"import": "./dist/plugin/tui.js",
|
|
43
|
+
"types": "./dist/plugin/tui.d.ts"
|
|
44
|
+
},
|
|
45
|
+
"./rpc": {
|
|
46
|
+
"import": "./dist/plugin/checkpoint-rpc.js",
|
|
47
|
+
"types": "./dist/plugin/checkpoint-rpc.d.ts"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "tsc",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"test": "tsx --test tests/**/*.test.ts",
|
|
54
|
+
"prepublishOnly": "npm run build"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=20"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@opencode/plugin": "^2.0.22"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@opencode/theme": "^2.0.22",
|
|
64
|
+
"@opentui/core": "^0.5.14",
|
|
65
|
+
"@opentui/solid": "^0.5.14",
|
|
66
|
+
"@types/node": "^26.6.4",
|
|
67
|
+
"solid-js": "^1.9.9",
|
|
68
|
+
"tsx": "^4.23.15",
|
|
69
|
+
"typescript": "^7.0.2"
|
|
70
|
+
}
|
|
71
|
+
}
|