@devcxl/opencode-cabbage 1.2.0 → 1.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.
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Cabbage Session Start Hook — loads plugin overview and project context.
3
+ * Runs on Codex SessionStart lifecycle event (matcher: startup|resume).
4
+ * Compiled to dist/hooks/session-start.js by tsc.
5
+ */
6
+ import { readFileSync, existsSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ // PLUGIN_ROOT is set by Codex hooks runtime
9
+ const PROJECT_DIR = process.cwd();
10
+ const MAX_OUTPUT_LENGTH = 12000;
11
+ function getHeader() {
12
+ return `## Cabbage Development Plugin
13
+
14
+ This plugin provides a full development lifecycle orchestration system.
15
+ Load skills by name: @agent-dev-lifecycle, @agent-architect, @agent-developer, @agent-reviewer, @agent-goal-verify, @agent-researcher
16
+
17
+ ### Available Flow Skills
18
+ - \`@flow-setup\` — 初始化项目开发环境
19
+ - \`@flow-requirements\` — 需求分析产出 PRD
20
+ - \`@flow-design\` — 技术方案与 ADR
21
+ - \`@flow-tasks\` — DAG 任务拆解
22
+ - \`@flow-research\` — 调研/事实核查
23
+ - \`@flow-code\` — 编码实现(TDD)
24
+ - \`@flow-tdd\` — TDD 协议参考
25
+ - \`@flow-review\` — 代码审查
26
+ - \`@flow-release\` — 发布流程
27
+
28
+ ### Available Agent Skills
29
+ - \`@agent-dev-lifecycle\` — 全流程编排器(主 agent,场景分诊)
30
+ - \`@agent-architect\` — 架构设计
31
+ - \`@agent-developer\` — 编码实现
32
+ - \`@agent-reviewer\` — 代码审查
33
+ - \`@agent-goal-verify\` — 目标验证
34
+ - \`@agent-researcher\` — 独立调研
35
+ `;
36
+ }
37
+ function readProjectProfile() {
38
+ // Try root AGENTS.md from project directory
39
+ const agentsMd = join(PROJECT_DIR, "AGENTS.md");
40
+ if (!existsSync(agentsMd))
41
+ return "";
42
+ let content;
43
+ try {
44
+ content = readFileSync(agentsMd, "utf8");
45
+ }
46
+ catch {
47
+ return "";
48
+ }
49
+ // Match only the exact "## Project Profile" heading line (not "## Project Profile Notes"),
50
+ // and stop at the next "## " heading or end of file.
51
+ const lines = content.split("\n");
52
+ const start = lines.findIndex((line) => line.trim() === "## Project Profile");
53
+ if (start === -1)
54
+ return "";
55
+ const end = lines.findIndex((line, i) => i > start && /^##\s/.test(line.trim()));
56
+ const slice = end === -1 ? lines.slice(start) : lines.slice(start, end);
57
+ return slice.join("\n").trim();
58
+ }
59
+ function main() {
60
+ const header = getHeader();
61
+ const profile = readProjectProfile();
62
+ const parts = [header];
63
+ if (profile)
64
+ parts.push(`## Project Context\n\n${profile}`);
65
+ let output = parts.join("\n\n");
66
+ if (output.length > MAX_OUTPUT_LENGTH) {
67
+ output = `${output.slice(0, MAX_OUTPUT_LENGTH)}\n\n[context truncated — output exceeds ${MAX_OUTPUT_LENGTH} chars]`;
68
+ }
69
+ console.log(output);
70
+ }
71
+ main();
72
+ //# sourceMappingURL=session-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,4CAA4C;AAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;AACjC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AAE/B,SAAS,SAAS;IAChB,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAuBR,CAAA;AACD,CAAC;AAED,SAAS,kBAAkB;IACzB,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IAEpC,IAAI,OAAe,CAAA;IACnB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,2FAA2F;IAC3F,qDAAqD;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,oBAAoB,CAAC,CAAA;IAC7E,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAE3B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAChF,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,IAAI;IACX,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAA;IAEpC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAA;IACtB,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAA;IAE3D,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,2CAA2C,iBAAiB,SAAS,CAAA;IACrH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,IAAI,EAAE,CAAA"}
@@ -0,0 +1,71 @@
1
+ import type { GoalData } from "./goal.js";
2
+ /**
3
+ * goal 存储抽象(V2 迁移解耦准备)。
4
+ *
5
+ * V1 实现 = session.metadata.goal(createMetadataGoalStore)。
6
+ * V2 候选 = ctx.storage / 本地文件——切换时只替换实现,不改调用方。
7
+ * 见 docs/dev/research/2026-08-31-opencode-v2-compat-spike.md §6.3.1。
8
+ */
9
+ /** goal 宿主会话的最小面:goal 工具判定子会话(parentID)与元数据保留(write 全量替换)所需 */
10
+ export interface GoalSession {
11
+ parentID: string | null;
12
+ metadata: Record<string, unknown>;
13
+ }
14
+ /** 宽松消息面:记账与尾部检查的最小形状(V1 实现直接透传 SDK messages data,不做映射) */
15
+ export interface GoalMessage {
16
+ info?: {
17
+ id?: string;
18
+ role?: string;
19
+ time?: {
20
+ completed?: number;
21
+ created?: number;
22
+ } | null;
23
+ tokens?: unknown;
24
+ error?: unknown;
25
+ } | null;
26
+ parts?: Array<{
27
+ type?: string;
28
+ text?: string;
29
+ }>;
30
+ }
31
+ /** goal 状态存储。read 的 fail-closed 语义(异常 → null)由实现保证,调用方依赖此兜底。 */
32
+ export interface GoalStore {
33
+ read(sessionID: string): Promise<{
34
+ goal: GoalData | null;
35
+ session: GoalSession | null;
36
+ }>;
37
+ /** 写 goal;null 表示删除。existingSession 复用 read 结果避免二次读取。 */
38
+ write(sessionID: string, goal: GoalData | null, existingSession?: GoalSession | null): Promise<void>;
39
+ /** 最近消息(记账基线 + 续接尾部检查用)。data 非数组时返回 null(与 SDK 语义一致)。 */
40
+ messages(sessionID: string, limit: number): Promise<GoalMessage[] | null>;
41
+ }
42
+ /** GoalStore V1 实现所需的最小 SDK 客户端面(createOpencodeClient 返回类型的子集) */
43
+ export interface GoalStoreClient {
44
+ session: {
45
+ get(args: {
46
+ sessionID: string;
47
+ }): Promise<{
48
+ data?: {
49
+ parentID?: string | null;
50
+ metadata?: Record<string, unknown>;
51
+ } | null;
52
+ }>;
53
+ update(args: {
54
+ sessionID: string;
55
+ metadata: Record<string, unknown>;
56
+ }): Promise<unknown>;
57
+ messages(args: {
58
+ sessionID: string;
59
+ limit?: number;
60
+ }): Promise<{
61
+ data?: GoalMessage[];
62
+ }>;
63
+ };
64
+ }
65
+ /** V1 实现:goal 持久化在 session metadata 的 goal 键;messages 直接透传 SDK 消息面 */
66
+ export declare function createMetadataGoalStore(client: GoalStoreClient): GoalStore;
67
+ /**
68
+ * 从插件上下文构建 SDK client(V1 宿主机制)。
69
+ * V2 下 ctx 本身即 server client,本函数与 createMetadataGoalStore 一起被替换。
70
+ */
71
+ export declare function createGoalClient(serverUrl: URL, v1Client: any): import("@opencode-ai/sdk/v2").OpencodeClient;
@@ -0,0 +1,54 @@
1
+ import { createOpencodeClient } from "@opencode-ai/sdk/v2";
2
+ /** V1 实现:goal 持久化在 session metadata 的 goal 键;messages 直接透传 SDK 消息面 */
3
+ export function createMetadataGoalStore(client) {
4
+ return {
5
+ async read(sessionID) {
6
+ try {
7
+ const result = await client.session.get({ sessionID });
8
+ const session = result?.data ?? null;
9
+ if (!session)
10
+ return { goal: null, session: null };
11
+ const goalSession = {
12
+ parentID: session.parentID ?? null,
13
+ metadata: session.metadata ?? {},
14
+ };
15
+ if (!goalSession.metadata.goal)
16
+ return { goal: null, session: goalSession };
17
+ return { goal: goalSession.metadata.goal, session: goalSession };
18
+ }
19
+ catch {
20
+ return { goal: null, session: null };
21
+ }
22
+ },
23
+ async write(sessionID, goal, existingSession) {
24
+ const session = existingSession ?? (await this.read(sessionID)).session;
25
+ if (!session)
26
+ throw new Error("Failed to get session");
27
+ const existing = session.metadata ?? {};
28
+ const metadata = goal === null
29
+ ? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
30
+ : { ...existing, goal };
31
+ await client.session.update({ sessionID, metadata });
32
+ },
33
+ async messages(sessionID, limit) {
34
+ const result = await client.session.messages({ sessionID, limit });
35
+ return Array.isArray(result?.data) ? result.data : null;
36
+ },
37
+ };
38
+ }
39
+ /**
40
+ * 从插件上下文构建 SDK client(V1 宿主机制)。
41
+ * V2 下 ctx 本身即 server client,本函数与 createMetadataGoalStore 一起被替换。
42
+ */
43
+ export function createGoalClient(serverUrl, v1Client) {
44
+ const v1Config = v1Client?.getConfig?.() ?? {};
45
+ return createOpencodeClient({
46
+ baseUrl: serverUrl.origin,
47
+ headers: v1Config.headers,
48
+ fetch: v1Config.fetch,
49
+ // SDK v2 默认 ThrowOnError=false(4xx/5xx 静默 resolve 为 {error}),
50
+ // 必须显式开启,否则 readGoal/writeGoal 的 try/catch 与错误传播全部失效
51
+ throwOnError: true,
52
+ });
53
+ }
54
+ //# sourceMappingURL=goal-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-store.js","sourceRoot":"","sources":["../../src/plugin/goal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AA+C1D,sEAAsE;AACtE,MAAM,UAAU,uBAAuB,CAAC,MAAuB;IAC7D,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;gBACtD,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,IAAI,CAAA;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;gBAClD,MAAM,WAAW,GAAgB;oBAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;oBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;iBACjC,CAAA;gBACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI;oBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;gBAC3E,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAA;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;YACtC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe;YAC1C,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;YACvE,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;YAEtD,MAAM,QAAQ,GAA4B,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;YAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI;gBAC5B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBAC5E,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;YAEzB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtD,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK;YAC7B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;YAClE,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAc,EAAE,QAAa;IAC5D,MAAM,QAAQ,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAA;IAC9C,OAAO,oBAAoB,CAAC;QAC1B,OAAO,EAAE,SAAS,CAAC,MAAM;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,8DAA8D;QAC9D,qDAAqD;QACrD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;AACJ,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import type { ToolContext, ToolResult } from "@opencode-ai/plugin";
2
- import { createOpencodeClient } from "@opencode-ai/sdk/v2";
3
- import type { Session } from "@opencode-ai/sdk/v2";
2
+ import type { GoalSession, GoalStore } from "./goal-store.js";
4
3
  export type GoalStatus = "active" | "paused" | "complete";
5
4
  /** 用户最后使用的会话配置快照:续接注入时显式传回,防止 idle 后回落/切换默认 agent 与模型 */
6
5
  export interface GoalSessionProfile {
@@ -53,22 +52,16 @@ export declare function isBlockedReport(text: string): boolean;
53
52
  export declare const DONE_REPORT_RE: RegExp;
54
53
  export declare function isDoneReport(text: string): boolean;
55
54
  export declare function continuationPrompt(parentIssueNumber: number): string;
56
- export declare function createGoalClient(serverUrl: URL, v1Client: any): import("@opencode-ai/sdk/v2").OpencodeClient;
57
- export declare function readGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string): Promise<{
58
- goal: GoalData | null;
59
- session: Session | null;
60
- }>;
61
- export declare function writeGoal(client: ReturnType<typeof createOpencodeClient>, sessionID: string, goal: GoalData | null, existingSession?: Session | null): Promise<void>;
62
55
  /**
63
56
  * 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
64
- * fn 接收当前 goal 与 session,返回写回的 goal(null 表示删除)与调用方结果 value。
57
+ * fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
65
58
  * 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
66
59
  */
67
- export declare function mutateGoal<T>(client: ReturnType<typeof createOpencodeClient>, sessionID: string, fn: (goal: GoalData | null, session: Session | null) => Promise<{
60
+ export declare function mutateGoal<T>(store: GoalStore, sessionID: string, fn: (goal: GoalData | null, session: GoalSession | null) => Promise<{
68
61
  goal: GoalData | null;
69
62
  value: T;
70
63
  }>): Promise<T>;
71
- export declare function createGoalTool(client: ReturnType<typeof createOpencodeClient>, projectDirFallback?: string): {
64
+ export declare function createGoalTool(store: GoalStore, projectDirFallback?: string): {
72
65
  description: string;
73
66
  args: {
74
67
  op: import("zod").ZodEnum<{
@@ -1,5 +1,4 @@
1
1
  import { tool } from "@opencode-ai/plugin/tool";
2
- import { createOpencodeClient } from "@opencode-ai/sdk/v2";
3
2
  import { bindSession, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
4
3
  import { KeyedMutex } from "../kernel/mutex.js";
5
4
  import { resolveProjectDir } from "../util/paths.js";
@@ -98,55 +97,22 @@ marker [DONE: short summary of what was verified]. Do not use the marker unless
98
97
  you actually ran the verification and it passed — the goal will pause for an
99
98
  independent goal-verify pass.`;
100
99
  }
101
- export function createGoalClient(serverUrl, v1Client) {
102
- const v1Config = v1Client?.getConfig?.() ?? {};
103
- return createOpencodeClient({
104
- baseUrl: serverUrl.origin,
105
- headers: v1Config.headers,
106
- fetch: v1Config.fetch,
107
- // SDK v2 默认 ThrowOnError=false(4xx/5xx 静默 resolve 为 {error}),
108
- // 必须显式开启,否则 readGoal/writeGoal 的 try/catch 与错误传播全部失效
109
- throwOnError: true,
110
- });
111
- }
112
- export async function readGoal(client, sessionID) {
113
- try {
114
- const result = await client.session.get({ sessionID });
115
- const session = result?.data ?? null;
116
- if (!session?.metadata?.goal)
117
- return { goal: null, session };
118
- return { goal: session.metadata.goal, session };
119
- }
120
- catch {
121
- return { goal: null, session: null };
122
- }
123
- }
124
- export async function writeGoal(client, sessionID, goal, existingSession) {
125
- const session = existingSession ?? (await readGoal(client, sessionID)).session;
126
- if (!session)
127
- throw new Error("Failed to get session");
128
- const existing = session.metadata ?? {};
129
- const metadata = goal === null
130
- ? Object.fromEntries(Object.entries(existing).filter(([k]) => k !== "goal"))
131
- : { ...existing, goal };
132
- await client.session.update({ sessionID, metadata });
133
- }
134
100
  /**
135
101
  * 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
136
- * fn 接收当前 goal 与 session,返回写回的 goal(null 表示删除)与调用方结果 value。
102
+ * fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
137
103
  * 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
138
104
  */
139
- export async function mutateGoal(client, sessionID, fn) {
105
+ export async function mutateGoal(store, sessionID, fn) {
140
106
  return goalMutex.runExclusive(sessionID, async () => {
141
- const current = await readGoal(client, sessionID);
107
+ const current = await store.read(sessionID);
142
108
  const { goal: next, value } = await fn(current.goal, current.session);
143
109
  if (next !== null || current.goal !== null) {
144
- await writeGoal(client, sessionID, next, current.session);
110
+ await store.write(sessionID, next, current.session);
145
111
  }
146
112
  return value;
147
113
  });
148
114
  }
149
- export function createGoalTool(client, projectDirFallback) {
115
+ export function createGoalTool(store, projectDirFallback) {
150
116
  /** 会话级项目目录:优先 ToolContext.directory,退化到插件级 projectDir(异常会话下避免写入根目录) */
151
117
  const sessionProjectDir = (ctxDirectory) => resolveProjectDir(ctxDirectory, projectDirFallback ?? "");
152
118
  return tool({
@@ -167,7 +133,7 @@ Use a single op field:
167
133
  async execute(args, ctx) {
168
134
  const sessionID = ctx.sessionID;
169
135
  // 只读判断:当前会话是否为子 agent、目标会话(父会话)ID
170
- const { session } = await readGoal(client, sessionID);
136
+ const { session } = await store.read(sessionID);
171
137
  const isSubAgent = !!session?.parentID;
172
138
  const targetSessionID = session?.parentID ?? sessionID;
173
139
  if (isSubAgent && ["create", "pause", "resume", "cancel", "edit"].includes(args.op)) {
@@ -178,7 +144,7 @@ Use a single op field:
178
144
  if (agentName !== "goal-verify") {
179
145
  return `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.`;
180
146
  }
181
- return mutateGoal(client, targetSessionID, async (goal) => {
147
+ return mutateGoal(store, targetSessionID, async (goal) => {
182
148
  if (!goal)
183
149
  return { goal, value: "No goal to complete in the parent session." };
184
150
  if (goal.status !== "active") {
@@ -197,7 +163,7 @@ Use a single op field:
197
163
  }
198
164
  switch (args.op) {
199
165
  case "create":
200
- return mutateGoal(client, sessionID, async (goal) => {
166
+ return mutateGoal(store, sessionID, async (goal) => {
201
167
  if (goal?.status === "active") {
202
168
  // 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
203
169
  // 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
@@ -215,9 +181,9 @@ Use a single op field:
215
181
  // 记账基线:create 时点的最新完成 assistant 轮快照(快照法排除 goal 前历史消耗)。
216
182
  // 拉取失败/无历史 → baseline 0(护栏方向保守:把可见历史计入)。
217
183
  try {
218
- const result = await client.session.messages({ sessionID, limit: 40 });
184
+ const messages = await store.messages(sessionID, 40);
219
185
  let baseline = 0;
220
- for (const message of result?.data ?? []) {
186
+ for (const message of messages ?? []) {
221
187
  const info = message?.info;
222
188
  if (info?.role !== "assistant")
223
189
  continue;
@@ -240,11 +206,11 @@ Use a single op field:
240
206
  return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
241
207
  });
242
208
  case "get": {
243
- const { goal } = await readGoal(client, targetSessionID);
209
+ const { goal } = await store.read(targetSessionID);
244
210
  return goal ? formatGoal(goal) : "No active goal.";
245
211
  }
246
212
  case "complete": {
247
- const { goal } = await readGoal(client, sessionID);
213
+ const { goal } = await store.read(sessionID);
248
214
  if (!goal)
249
215
  return "No active goal.";
250
216
  if (goal.status !== "active")
@@ -252,7 +218,7 @@ Use a single op field:
252
218
  return `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.`;
253
219
  }
254
220
  case "resume":
255
- return mutateGoal(client, sessionID, async (goal) => {
221
+ return mutateGoal(store, sessionID, async (goal) => {
256
222
  if (!goal)
257
223
  return { goal, value: "No goal to resume." };
258
224
  if (!canTransitionTo(goal, "active"))
@@ -264,7 +230,7 @@ Use a single op field:
264
230
  return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
265
231
  });
266
232
  case "pause":
267
- return mutateGoal(client, sessionID, async (goal) => {
233
+ return mutateGoal(store, sessionID, async (goal) => {
268
234
  if (!goal)
269
235
  return { goal, value: "No goal to pause." };
270
236
  if (!canTransitionTo(goal, "paused"))
@@ -273,7 +239,7 @@ Use a single op field:
273
239
  return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
274
240
  });
275
241
  case "cancel":
276
- return mutateGoal(client, sessionID, async (goal) => {
242
+ return mutateGoal(store, sessionID, async (goal) => {
277
243
  if (!goal)
278
244
  return { goal, value: "No goal to cancel." };
279
245
  // 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
@@ -286,7 +252,7 @@ Use a single op field:
286
252
  return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
287
253
  });
288
254
  case "edit":
289
- return mutateGoal(client, sessionID, async (goal) => {
255
+ return mutateGoal(store, sessionID, async (goal) => {
290
256
  if (!goal)
291
257
  return { goal, value: "No goal to edit." };
292
258
  if (goal.status === "complete") {
@@ -1 +1 @@
1
- {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Plugin } from "@opencode-ai/plugin";
2
+ import { type GoalStore } from "./goal-store.js";
2
3
  import type { ContextBlock } from "../kernel/context.js";
3
4
  export interface FirstUserInjectionInput {
4
5
  hasGoal: boolean;
@@ -20,7 +21,7 @@ interface GoalToolConfig extends AgentToolConfig {
20
21
  agent?: Record<string, unknown>;
21
22
  }
22
23
  export declare function configureGoalTools(config: GoalToolConfig): void;
23
- export declare function queueContinuation(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, sessionID: string, projectDir?: string): Promise<void>;
24
- export declare function autoResume(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, projectDir: string): Promise<void>;
24
+ export declare function queueContinuation(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, sessionID: string, projectDir?: string): Promise<void>;
25
+ export declare function autoResume(client: ReturnType<typeof import("@opencode-ai/sdk/v2").createOpencodeClient>, store: GoalStore, projectDir: string): Promise<void>;
25
26
  export declare function createOpencodeCabbage(packageRoot: string): Plugin;
26
27
  export {};
@@ -6,7 +6,8 @@ import { loadCommands } from "./commands.js";
6
6
  import { setupSkillsDir } from "./skills.js";
7
7
  import { loadAgents } from "./agents.js";
8
8
  import { createAgentShellEnv } from "./shell.js";
9
- import { createGoalClient, createGoalTool, readGoal, mutateGoal, MAX_CONTINUATIONS, continuationPrompt, formatGoal, isBlockedReport, isDoneReport, snapshotTokenTotal, budgetReached } from "./goal.js";
9
+ import { createGoalTool, mutateGoal, MAX_CONTINUATIONS, continuationPrompt, formatGoal, isBlockedReport, isDoneReport, snapshotTokenTotal, budgetReached } from "./goal.js";
10
+ import { createGoalClient, createMetadataGoalStore } from "./goal-store.js";
10
11
  import { readIndex, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
11
12
  import { getContextBlock, formatContextBlock, CONTEXT_MARKER } from "../kernel/context.js";
12
13
  import { readProjectProfile } from "../kernel/profile.js";
@@ -76,12 +77,12 @@ async function hasWorkingChildren(client, sessionID) {
76
77
  return true;
77
78
  }
78
79
  }
79
- export async function queueContinuation(client, sessionID, projectDir) {
80
+ export async function queueContinuation(client, store, sessionID, projectDir) {
80
81
  if (continuationInFlight.has(sessionID))
81
82
  return;
82
83
  continuationInFlight.add(sessionID);
83
84
  try {
84
- const decision = await mutateGoal(client, sessionID, async (goal) => {
85
+ const decision = await mutateGoal(store, sessionID, async (goal) => {
85
86
  // 读改写与 message.updated 同锁串行,杜绝续接计数/状态被并发覆盖
86
87
  if (!goal || goal.status !== "active")
87
88
  return { goal, value: null };
@@ -108,8 +109,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
108
109
  // 尾部静默检查:idle 事件可能竞态了后续消息/未落盘的回复。
109
110
  // 最后一条是 user 消息、或最后 assistant 未完成(无 completed 时间)→
110
111
  // 会话正在或即将忙碌,等下一次 idle 事件重新触发;无 assistant 消息则无 provider/model 可续。
111
- const messagesResult = await client.session.messages({ sessionID, limit: 40 });
112
- const messages = Array.isArray(messagesResult?.data) ? messagesResult.data : null;
112
+ const messages = await store.messages(sessionID, 40);
113
113
  if (!messages)
114
114
  return { goal, value: null };
115
115
  const lastMessageInfo = messages.length > 0 ? messages[messages.length - 1]?.info : null;
@@ -202,7 +202,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
202
202
  // abort 二次检查:idle 与 abort 事件并发时,避免对已 abort 的会话发出续接
203
203
  if (abortedSessions.has(sessionID)) {
204
204
  abortedSessions.delete(sessionID);
205
- await mutateGoal(client, sessionID, async (goal) => {
205
+ await mutateGoal(store, sessionID, async (goal) => {
206
206
  if (!goal)
207
207
  return { goal, value: null };
208
208
  goal.status = "paused";
@@ -237,7 +237,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
237
237
  catch (err) {
238
238
  // 发送失败 → 回滚计数(尽力;回滚失败只会少一次续接,方向安全)
239
239
  console.error("[cabbage] continuation prompt failed, rolling back counter:", err);
240
- await mutateGoal(client, sessionID, async (goal) => {
240
+ await mutateGoal(store, sessionID, async (goal) => {
241
241
  if (!goal)
242
242
  return { goal, value: null };
243
243
  goal.continuationCount = Math.max(0, goal.continuationCount - 1);
@@ -254,7 +254,7 @@ export async function queueContinuation(client, sessionID, projectDir) {
254
254
  continuationInFlight.delete(sessionID);
255
255
  }
256
256
  }
257
- export async function autoResume(client, projectDir) {
257
+ export async function autoResume(client, store, projectDir) {
258
258
  const index = await readIndex(projectDir);
259
259
  for (const [parentIssueNumber, entry] of Object.entries(index.flows)) {
260
260
  if (entry.status !== "active")
@@ -267,7 +267,7 @@ export async function autoResume(client, projectDir) {
267
267
  console.warn(`[cabbage] auto-resume: skip #${parentIssueNumber} (continued ${Math.round((Date.now() - entry.lastContinuedAt) / 1000)}s ago; next idle event re-arms)`);
268
268
  continue;
269
269
  }
270
- const { goal } = await readGoal(client, entry.sessionID);
270
+ const { goal } = await store.read(entry.sessionID);
271
271
  // 索引一致性自愈:entry 指向的 goal 已是别的 Flow(edit 换 Flow 后旧 entry 残留/rebind 失败)→
272
272
  // 删除陈旧 entry,防止每次重启对同一会话重复续接
273
273
  if (goal && goal.parentIssueNumber !== Number(parentIssueNumber)) {
@@ -313,12 +313,13 @@ export function createOpencodeCabbage(packageRoot) {
313
313
  const projectDir = ctx.worktree || ctx.directory;
314
314
  const v1Client = ctx.client._client;
315
315
  const goalClient = createGoalClient(ctx.serverUrl, v1Client);
316
- const goalTool = createGoalTool(goalClient, projectDir);
316
+ const goalStore = createMetadataGoalStore(goalClient);
317
+ const goalTool = createGoalTool(goalStore, projectDir);
317
318
  const agentsDir = path.join(packageRoot, "assets", "agents");
318
319
  await initPrompts(packageRoot, projectDir);
319
320
  await initBootstrap();
320
321
  startPeriodicCleanup();
321
- void autoResume(goalClient, projectDir).catch(err => {
322
+ void autoResume(goalClient, goalStore, projectDir).catch(err => {
322
323
  console.error("[cabbage] auto-resume failed:", err);
323
324
  });
324
325
  return {
@@ -395,7 +396,7 @@ export function createOpencodeCabbage(packageRoot) {
395
396
  if (firstUser.parts.some(p => p.type === "text" && (p.text.includes("EXTREMELY_IMPORTANT") || p.text.includes(CONTEXT_MARKER))))
396
397
  return;
397
398
  const sessionID = output.messages[0].info.sessionID;
398
- const { goal, session } = await readGoal(goalClient, sessionID);
399
+ const { goal, session } = await goalStore.read(sessionID);
399
400
  const contextBlock = await getContextBlock(projectDir);
400
401
  const injection = buildFirstUserInjection({
401
402
  hasGoal: goal?.status === "active",
@@ -417,7 +418,7 @@ export function createOpencodeCabbage(packageRoot) {
417
418
  // abort 立即持久化 pause:不依赖内存标记。
418
419
  // 否则 30 分钟清理窗口内无 idle 事件、或插件重启时标记丢失,
419
420
  // 用户主动中断的 goal 会被下次 idle/autoResume 自动续接(继续烧 token)。
420
- void mutateGoal(goalClient, sessionID, async (goal) => {
421
+ void mutateGoal(goalStore, sessionID, async (goal) => {
421
422
  if (!goal || goal.status !== "active")
422
423
  return { goal, value: undefined };
423
424
  goal.status = "paused";
@@ -434,15 +435,15 @@ export function createOpencodeCabbage(packageRoot) {
434
435
  const sessionID = evt.properties.sessionID;
435
436
  if (sessionID) {
436
437
  try {
437
- const result = await goalClient.session.get({ sessionID });
438
- if (result?.data?.parentID)
438
+ const { session } = await goalStore.read(sessionID);
439
+ if (session?.parentID)
439
440
  return;
440
441
  }
441
442
  catch (err) {
442
443
  console.error("[cabbage] session lookup failed:", err);
443
444
  return;
444
445
  }
445
- await queueContinuation(goalClient, sessionID, projectDir).catch(err => {
446
+ await queueContinuation(goalClient, goalStore, sessionID, projectDir).catch(err => {
446
447
  console.error("[cabbage] continuation failed:", err);
447
448
  });
448
449
  }
@@ -452,7 +453,7 @@ export function createOpencodeCabbage(packageRoot) {
452
453
  if (sessionID && !continuationInFlight.has(sessionID)) {
453
454
  abortedSessions.delete(sessionID);
454
455
  const info = evt.properties.info;
455
- await mutateGoal(goalClient, sessionID, async (goal) => {
456
+ await mutateGoal(goalStore, sessionID, async (goal) => {
456
457
  if (!goal)
457
458
  return { goal, value: undefined };
458
459
  goal.continuationCount = 0;
@@ -470,7 +471,7 @@ export function createOpencodeCabbage(packageRoot) {
470
471
  if (evt.type === "session.updated") {
471
472
  const sessionID = evt.properties?.sessionID;
472
473
  if (sessionID) {
473
- const { goal } = await readGoal(goalClient, sessionID);
474
+ const { goal } = await goalStore.read(sessionID);
474
475
  if (goal?.status === "complete") {
475
476
  await updateFlowSession(projectDir, goal.parentIssueNumber, { status: "completed" });
476
477
  }