@devcxl/opencode-cabbage 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.codex-plugin/plugin.json +36 -0
  2. package/README.md +67 -21
  3. package/README.zh.md +26 -13
  4. package/assets/agents/dev-lifecycle.md +6 -0
  5. package/assets/prompts/bootstrap.md +4 -0
  6. package/assets/skills/flow-change/SKILL.md +109 -0
  7. package/assets/skills/flow-design/SKILL.md +15 -0
  8. package/assets/skills/flow-docs/SKILL.md +112 -0
  9. package/assets/skills/flow-incident/SKILL.md +98 -0
  10. package/assets/skills/flow-research/SKILL.md +9 -0
  11. package/assets/skills/flow-setup/SKILL.md +13 -0
  12. package/codex-skills/agent-architect/SKILL.md +79 -0
  13. package/codex-skills/agent-dev-lifecycle/SKILL.md +311 -0
  14. package/codex-skills/agent-developer/SKILL.md +51 -0
  15. package/codex-skills/agent-goal-verify/SKILL.md +45 -0
  16. package/codex-skills/agent-researcher/SKILL.md +32 -0
  17. package/codex-skills/agent-reviewer/SKILL.md +109 -0
  18. package/codex-skills/flow-change/SKILL.md +109 -0
  19. package/codex-skills/flow-code/SKILL.md +71 -0
  20. package/codex-skills/flow-design/SKILL.md +161 -0
  21. package/codex-skills/flow-docs/SKILL.md +112 -0
  22. package/codex-skills/flow-incident/SKILL.md +98 -0
  23. package/codex-skills/flow-release/SKILL.md +90 -0
  24. package/codex-skills/flow-requirements/SKILL.md +90 -0
  25. package/codex-skills/flow-research/SKILL.md +86 -0
  26. package/codex-skills/flow-review/SKILL.md +110 -0
  27. package/codex-skills/flow-setup/SKILL.md +88 -0
  28. package/codex-skills/flow-tasks/SKILL.md +220 -0
  29. package/codex-skills/flow-tdd/SKILL.md +235 -0
  30. package/dist/hooks/session-start.d.ts +1 -0
  31. package/dist/hooks/session-start.js +72 -0
  32. package/dist/hooks/session-start.js.map +1 -0
  33. package/dist/index.d.ts +2 -5
  34. package/dist/index.js +1 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/plugin/agents.d.ts +20 -0
  37. package/dist/plugin/agents.js +79 -0
  38. package/dist/plugin/agents.js.map +1 -1
  39. package/dist/plugin/cabbage-cli.d.ts +28 -0
  40. package/dist/plugin/cabbage-cli.js +92 -0
  41. package/dist/plugin/cabbage-cli.js.map +1 -0
  42. package/dist/plugin/cabbage-tool.d.ts +103 -0
  43. package/dist/plugin/cabbage-tool.js +169 -0
  44. package/dist/plugin/cabbage-tool.js.map +1 -0
  45. package/dist/plugin/commands.d.ts +10 -0
  46. package/dist/plugin/commands.js +1 -1
  47. package/dist/plugin/commands.js.map +1 -1
  48. package/dist/plugin/continuation.d.ts +22 -0
  49. package/dist/plugin/continuation.js +233 -0
  50. package/dist/plugin/continuation.js.map +1 -0
  51. package/dist/plugin/goal-store.d.ts +64 -0
  52. package/dist/plugin/goal-store.js +57 -0
  53. package/dist/plugin/goal-store.js.map +1 -0
  54. package/dist/plugin/goal.d.ts +95 -38
  55. package/dist/plugin/goal.js +208 -199
  56. package/dist/plugin/goal.js.map +1 -1
  57. package/dist/plugin/install-dir.d.ts +13 -0
  58. package/dist/plugin/install-dir.js +46 -0
  59. package/dist/plugin/install-dir.js.map +1 -0
  60. package/dist/plugin/server.d.ts +4 -12
  61. package/dist/plugin/server.js +279 -423
  62. package/dist/plugin/server.js.map +1 -1
  63. package/dist/plugin/session-abort.d.ts +5 -0
  64. package/dist/plugin/session-abort.js +26 -0
  65. package/dist/plugin/session-abort.js.map +1 -0
  66. package/dist/plugin/skills.d.ts +15 -0
  67. package/dist/plugin/skills.js +47 -50
  68. package/dist/plugin/skills.js.map +1 -1
  69. package/dist/plugin.d.ts +2 -2
  70. package/dist/plugin.js +6 -2
  71. package/dist/plugin.js.map +1 -1
  72. package/dist/util/paths.d.ts +0 -6
  73. package/dist/util/paths.js +0 -15
  74. package/dist/util/paths.js.map +1 -1
  75. package/hooks/hooks.json +17 -0
  76. package/package.json +13 -8
  77. package/vendor/cabbage/MANIFEST.json +8 -0
  78. package/vendor/cabbage/cabbage_cli/__init__.py +1 -0
  79. package/vendor/cabbage/cabbage_cli/__main__.py +2 -0
  80. package/vendor/cabbage/cabbage_cli/assets/docs-site/.vitepress/config.ts +78 -0
  81. package/vendor/cabbage/cabbage_cli/assets/docs-site/README.md +31 -0
  82. package/vendor/cabbage/cabbage_cli/assets/docs-site/package.json +16 -0
  83. package/vendor/cabbage/cabbage_cli/assets/docs-site/pnpm-lock.yaml +2504 -0
  84. package/vendor/cabbage/cabbage_cli/assets/integrations/cabbage.yml +127 -0
  85. package/vendor/cabbage/cabbage_cli/assets/templates/adr.md +47 -0
  86. package/vendor/cabbage/cabbage_cli/assets/templates/api-design.md +45 -0
  87. package/vendor/cabbage/cabbage_cli/assets/templates/change-record.md +21 -0
  88. package/vendor/cabbage/cabbage_cli/assets/templates/database-design.md +37 -0
  89. package/vendor/cabbage/cabbage_cli/assets/templates/generic.md +20 -0
  90. package/vendor/cabbage/cabbage_cli/assets/templates/impact.md +41 -0
  91. package/vendor/cabbage/cabbage_cli/assets/templates/incident.md +48 -0
  92. package/vendor/cabbage/cabbage_cli/assets/templates/postmortem.md +43 -0
  93. package/vendor/cabbage/cabbage_cli/assets/templates/prd.md +71 -0
  94. package/vendor/cabbage/cabbage_cli/assets/templates/release-plan.md +45 -0
  95. package/vendor/cabbage/cabbage_cli/assets/templates/rfc.md +44 -0
  96. package/vendor/cabbage/cabbage_cli/assets/templates/security-review.md +35 -0
  97. package/vendor/cabbage/cabbage_cli/assets/templates/tasks.md +62 -0
  98. package/vendor/cabbage/cabbage_cli/assets/templates/tech-spec.md +87 -0
  99. package/vendor/cabbage/cabbage_cli/assets/templates/test-plan.md +44 -0
  100. package/vendor/cabbage/cabbage_cli/assets/workflows/change.yaml +11 -0
  101. package/vendor/cabbage/cabbage_cli/assets/workflows/incident.yaml +4 -0
  102. package/vendor/cabbage/cabbage_cli/cli.py +283 -0
  103. package/vendor/cabbage/cabbage_cli/core.py +606 -0
  104. package/vendor/cabbage/cabbage_cli/scaffold.py +313 -0
@@ -1,8 +1,6 @@
1
- import { tool } from "@opencode-ai/plugin/tool";
2
- import { createOpencodeClient } from "@opencode-ai/sdk/v2";
3
1
  import { bindSession, updateFlowSession, removeFlowSession } from "../kernel/session-index.js";
4
2
  import { KeyedMutex } from "../kernel/mutex.js";
5
- import { resolveProjectDir } from "../util/paths.js";
3
+ import { clearAborted } from "./session-abort.js";
6
4
  /** goal 会话级串行锁:所有读改写统一经 mutateGoal 走该锁,防并发丢失更新 */
7
5
  const goalMutex = new KeyedMutex();
8
6
  export function createGoal(parentIssueNumber, sessionProfile, tokenBudget) {
@@ -37,11 +35,20 @@ export function formatGoal(goal) {
37
35
  `Objective/acceptance: read from Flow Record (Parent Issue #${goal.parentIssueNumber})`,
38
36
  ].filter(Boolean).join("\n");
39
37
  }
38
+ /** 把存储的 profile.model(V1/V2 两种形状)归一为 V2 的 ModelRef;无法识别时返回 null */
39
+ export function normalizeProfileModel(model) {
40
+ if (!model?.providerID)
41
+ return null;
42
+ const id = model.id ?? model.modelID;
43
+ if (!id)
44
+ return null;
45
+ return { providerID: model.providerID, id, ...(model.variant ? { variant: model.variant } : {}) };
46
+ }
40
47
  export const MAX_CONTINUATIONS = 50;
41
48
  /**
42
- * 单条消息的 token 快照 = input + reasoning + cache.read + output。
43
- * 与 OpenChamber 记账同源:OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
44
- * 最新完成轮的快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
49
+ * token 快照 = input + reasoning + cache.read + output。
50
+ * OpenCode 每轮的 cache.read 已含此前所有轮次付费 token,
51
+ * 最新快照即整段成本,无需跨消息求和。reasoning 也计费,护栏方向偏严。
45
52
  */
46
53
  export function snapshotTokenTotal(tokens) {
47
54
  if (!tokens || typeof tokens !== "object")
@@ -98,59 +105,48 @@ marker [DONE: short summary of what was verified]. Do not use the marker unless
98
105
  you actually ran the verification and it passed — the goal will pause for an
99
106
  independent goal-verify pass.`;
100
107
  }
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
108
  /**
135
109
  * 带锁的 goal 读-改-写单一入口:同一 sessionID 的操作串行,杜绝并发丢失更新。
136
- * fn 接收当前 goal 与 session,返回写回的 goal(null 表示删除)与调用方结果 value。
110
+ * fn 接收当前 goal 与宿主会话,返回写回的 goal(null 表示删除)与调用方结果 value。
137
111
  * 当前无 goal 且 fn 也返回 null 时跳过写回(避免对不存在 goal 的无谓删除/写入)。
138
112
  */
139
- export async function mutateGoal(client, sessionID, fn) {
113
+ export async function mutateGoal(store, sessionID, fn) {
140
114
  return goalMutex.runExclusive(sessionID, async () => {
141
- const current = await readGoal(client, sessionID);
115
+ const current = await store.read(sessionID);
142
116
  const { goal: next, value } = await fn(current.goal, current.session);
143
117
  if (next !== null || current.goal !== null) {
144
- await writeGoal(client, sessionID, next, current.session);
118
+ await store.write(sessionID, next, current.session);
145
119
  }
146
120
  return value;
147
121
  });
148
122
  }
149
- export function createGoalTool(client, projectDirFallback) {
150
- /** 会话级项目目录:优先 ToolContext.directory,退化到插件级 projectDir(异常会话下避免写入根目录) */
151
- const sessionProjectDir = (ctxDirectory) => resolveProjectDir(ctxDirectory, projectDirFallback ?? "");
152
- return tool({
153
- description: `Manage the active goal-mode objective (minimal: parentIssueNumber/status/continuationCount).
123
+ /**
124
+ * goal 工具的允许名单(与权限规则层一致)。
125
+ * 规则层通过 agent permissions 隐藏/放行工具;此处的检查是工具级兜底,
126
+ * 覆盖规则层未覆盖的 agent(例如后续新注册的 agent)。
127
+ */
128
+ export const GOAL_ALLOWED_AGENTS = new Set(["dev-lifecycle", "goal-verify"]);
129
+ export const GOAL_TOOL_INPUT_SCHEMA = {
130
+ type: "object",
131
+ properties: {
132
+ op: {
133
+ type: "string",
134
+ enum: ["create", "get", "complete", "resume", "cancel", "pause", "edit"],
135
+ description: "Goal operation",
136
+ },
137
+ parent_issue_number: {
138
+ type: "number",
139
+ description: "Parent GitHub Issue number of the Flow Record (required for create; editable via edit)",
140
+ },
141
+ token_budget: {
142
+ type: "number",
143
+ description: "Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget",
144
+ },
145
+ },
146
+ required: ["op"],
147
+ additionalProperties: false,
148
+ };
149
+ export const GOAL_TOOL_DESCRIPTION = `Manage the active goal-mode objective (minimal: parentIssueNumber/status/continuationCount).
154
150
 
155
151
  Use a single op field:
156
152
  - create: starts a goal bound to a Flow Record. Requires parent_issue_number.
@@ -158,186 +154,199 @@ Use a single op field:
158
154
  - resume: re-activates a paused goal.
159
155
  - cancel: discards the current goal.
160
156
  - pause: pauses the active goal.
161
- - complete: marks the goal as completed. Follow the returned instructions.`,
162
- args: {
163
- op: tool.schema.enum(["create", "get", "complete", "resume", "cancel", "pause", "edit"]).describe("Goal operation"),
164
- parent_issue_number: tool.schema.number().optional().describe("Parent GitHub Issue number of the Flow Record (required for create; editable via edit)"),
165
- token_budget: tool.schema.number().optional().describe("Optional token budget guardrail; goal auto-pauses when tokensUsed reaches it. Pass 0 via edit to remove the budget"),
166
- },
167
- async execute(args, ctx) {
168
- const sessionID = ctx.sessionID;
157
+ - complete: marks the goal as completed. Follow the returned instructions.`;
158
+ /**
159
+ * 构建 goal 工具描述符:{name, description, input(JSON Schema), options, execute}。
160
+ * execute 返回 {content}(V2 Tool.Result 形状);授权在工具内自检(见 GOAL_ALLOWED_AGENTS)。
161
+ */
162
+ export function buildGoalTool(store, projectDir) {
163
+ return {
164
+ name: "goal",
165
+ description: GOAL_TOOL_DESCRIPTION,
166
+ input: GOAL_TOOL_INPUT_SCHEMA,
167
+ options: { permission: "goal" },
168
+ async execute(args, context) {
169
+ if (!context.agent || !GOAL_ALLOWED_AGENTS.has(context.agent)) {
170
+ return {
171
+ content: `Error: the goal tool is restricted to the cabbage flow agents (dev-lifecycle, goal-verify). Agent "${context.agent ?? "unknown"}" is not authorized.`,
172
+ };
173
+ }
174
+ const sessionID = context.sessionID;
169
175
  // 只读判断:当前会话是否为子 agent、目标会话(父会话)ID
170
- const { session } = await readGoal(client, sessionID);
176
+ const { session } = await store.read(sessionID);
171
177
  const isSubAgent = !!session?.parentID;
172
178
  const targetSessionID = session?.parentID ?? sessionID;
173
179
  if (isSubAgent && ["create", "pause", "resume", "cancel", "edit"].includes(args.op)) {
174
- return `Error: sub-agents cannot call goal({op:"${args.op}"}). Goal lifecycle operations are restricted to the main session.`;
180
+ return { content: `Error: sub-agents cannot call goal({op:"${args.op}"}). Goal lifecycle operations are restricted to the main session.` };
175
181
  }
176
182
  if (isSubAgent && args.op === "complete") {
177
- const agentName = ctx.agent;
183
+ const agentName = context.agent;
178
184
  if (agentName !== "goal-verify") {
179
- return `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.`;
185
+ return { content: `Error: only the goal-verify agent can complete the goal. Agent "${agentName}" is not authorized.` };
180
186
  }
181
- return mutateGoal(client, targetSessionID, async (goal) => {
182
- if (!goal)
183
- return { goal, value: "No goal to complete in the parent session." };
184
- if (goal.status !== "active") {
185
- return { goal, value: `Parent session goal is not active (status: ${goal.status}).` };
186
- }
187
- goal.status = "complete";
188
- // flow 级持久化:complete-flow 可跨会话识别验证完成(不依赖 index 会话一致性)
189
- try {
190
- await updateFlowSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber, { goalComplete: true });
191
- }
192
- catch {
193
- // 索引写入失败不阻塞 goal 完成(goal 本身已持久化)
194
- }
195
- return { goal, value: `Goal completed and verified: Flow #${goal.parentIssueNumber}` };
196
- });
197
- }
198
- switch (args.op) {
199
- case "create":
200
- return mutateGoal(client, sessionID, async (goal) => {
201
- if (goal?.status === "active") {
202
- // 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
203
- // 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
204
- return { goal, value: `Error: an active goal already exists for Flow #${goal.parentIssueNumber}` };
205
- }
206
- const parentIssue = Number(args.parent_issue_number);
207
- if (!Number.isInteger(parentIssue) || parentIssue <= 0) {
208
- const got = args.parent_issue_number === undefined ? "" : ` (got: ${args.parent_issue_number})`;
209
- return { goal, value: `Error: parent_issue_number is required (positive integer)${got}` };
210
- }
211
- // 快照创建时的 agent(模型由 message.updated 用户消息事件补充)
212
- const created = createGoal(parentIssue, { agent: ctx.agent }, typeof args.token_budget === "number" && Number.isFinite(args.token_budget) && args.token_budget > 0
213
- ? Math.floor(args.token_budget)
214
- : undefined);
215
- // 记账基线:create 时点的最新完成 assistant 轮快照(快照法排除 goal 前历史消耗)。
216
- // 拉取失败/无历史 → baseline 0(护栏方向保守:把可见历史计入)。
217
- try {
218
- const result = await client.session.messages({ sessionID, limit: 40 });
219
- let baseline = 0;
220
- for (const message of result?.data ?? []) {
221
- const info = message?.info;
222
- if (info?.role !== "assistant")
223
- continue;
224
- if (!(info.time?.completed && info.time.completed > 0) || info.time.completed > created.createdAt)
225
- continue;
226
- baseline = Math.max(baseline, snapshotTokenTotal(info.tokens));
227
- }
228
- created.tokensBaseline = baseline;
229
- }
230
- catch {
231
- created.tokensBaseline = 0;
187
+ return { content: await mutateGoal(store, targetSessionID, async (goal) => {
188
+ if (!goal)
189
+ return { goal, value: "No goal to complete in the parent session." };
190
+ if (goal.status !== "active") {
191
+ return { goal, value: `Parent session goal is not active (status: ${goal.status}).` };
232
192
  }
233
- // flow 级绑定:供插件重启后的 autoResume 恢复 active goal
193
+ goal.status = "complete";
194
+ // flow 级持久化:complete-flow 可跨会话识别验证完成(不依赖 index 会话一致性)
234
195
  try {
235
- await bindSession(sessionProjectDir(ctx.directory), created.parentIssueNumber, sessionID);
196
+ await updateFlowSession(projectDir, goal.parentIssueNumber, { goalComplete: true, status: "completed" });
236
197
  }
237
198
  catch {
238
- // 索引写入失败不阻塞 goal 创建(goal 本身已持久化在 session metadata)
199
+ // 索引写入失败不阻塞 goal 完成(goal 本身已持久化)
239
200
  }
240
- return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
241
- });
201
+ return { goal, value: `Goal completed and verified: Flow #${goal.parentIssueNumber}` };
202
+ }) };
203
+ }
204
+ switch (args.op) {
205
+ case "create":
206
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
207
+ if (goal?.status === "active") {
208
+ // 必须返回原 goal(不能返回 null):mutateGoal 在 next===null 且 current 非 null
209
+ // 时会删除现有 goal,错误分支返回 null 等于把活动 goal 取消了
210
+ return { goal, value: `Error: an active goal already exists for Flow #${goal.parentIssueNumber}` };
211
+ }
212
+ const parentIssue = Number(args.parent_issue_number);
213
+ if (!Number.isInteger(parentIssue) || parentIssue <= 0) {
214
+ const got = args.parent_issue_number === undefined ? "" : ` (got: ${args.parent_issue_number})`;
215
+ return { goal, value: `Error: parent_issue_number is required (positive integer)${got}` };
216
+ }
217
+ // 快照创建时的 agent/模型(模型来自会话当前选择;此后由 selection 事件刷新)
218
+ const sessionModel = session?.model;
219
+ const createdProfile = {
220
+ agent: context.agent,
221
+ ...(sessionModel && sessionModel.providerID && sessionModel.id
222
+ ? { model: { providerID: sessionModel.providerID, id: sessionModel.id, ...(sessionModel.variant ? { variant: sessionModel.variant } : {}) } }
223
+ : {}),
224
+ };
225
+ const created = createGoal(parentIssue, createdProfile, typeof args.token_budget === "number" && Number.isFinite(args.token_budget) && args.token_budget > 0
226
+ ? Math.floor(args.token_budget)
227
+ : undefined);
228
+ // 记账基线:create 时点的会话累计 token 快照(后续 used = 当前累计 − baseline)。
229
+ // 拉取失败 → baseline 0(护栏方向保守:把全部可见消耗计入)。
230
+ try {
231
+ created.tokensBaseline = snapshotTokenTotal(await store.sessionTokens(sessionID));
232
+ }
233
+ catch {
234
+ created.tokensBaseline = 0;
235
+ }
236
+ // flow 级绑定:供插件重启后的 autoResume 恢复 active goal
237
+ try {
238
+ await bindSession(projectDir, created.parentIssueNumber, sessionID);
239
+ }
240
+ catch {
241
+ // 索引写入失败不阻塞 goal 创建(goal 本身已持久化在 session metadata)
242
+ }
243
+ return { goal: created, value: `Goal created: Flow #${created.parentIssueNumber}\nStatus: active` };
244
+ }) };
242
245
  case "get": {
243
- const { goal } = await readGoal(client, targetSessionID);
244
- return goal ? formatGoal(goal) : "No active goal.";
246
+ const { goal } = await store.read(targetSessionID);
247
+ return { content: goal ? formatGoal(goal) : "No active goal." };
245
248
  }
246
249
  case "complete": {
247
- const { goal } = await readGoal(client, sessionID);
250
+ const { goal } = await store.read(sessionID);
248
251
  if (!goal)
249
- return "No active goal.";
252
+ return { content: "No active goal." };
250
253
  if (goal.status !== "active")
251
- return `Goal is not active (status: ${goal.status}).`;
252
- return `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.`;
254
+ return { content: `Goal is not active (status: ${goal.status}).` };
255
+ return { content: `BLOCKED: Call the goal-verify sub-agent via the Task tool. Only the sub-agent can complete verification.` };
253
256
  }
254
257
  case "resume":
255
- return mutateGoal(client, sessionID, async (goal) => {
256
- if (!goal)
257
- return { goal, value: "No goal to resume." };
258
- if (!canTransitionTo(goal, "active"))
259
- return { goal, value: `Goal cannot be resumed (status: ${goal.status}).` };
260
- goal.status = "active";
261
- goal.continuationCount = 0;
262
- // kickoff 信号:resume 后首次 tick 豁免 [BLOCKED:] 检测,防止被旧报告立即再次暂停
263
- goal.statusReason = "resumed";
264
- return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
265
- });
258
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
259
+ if (!goal)
260
+ return { goal, value: "No goal to resume." };
261
+ if (!canTransitionTo(goal, "active"))
262
+ return { goal, value: `Goal cannot be resumed (status: ${goal.status}).` };
263
+ // 用户显式恢复:清除用户中断标记,避免恢复后被残留标记立即再次暂停
264
+ clearAborted(sessionID);
265
+ goal.status = "active";
266
+ goal.continuationCount = 0;
267
+ // kickoff 信号:resume 后首次 tick 豁免 [BLOCKED:] 检测,防止被旧报告立即再次暂停
268
+ goal.statusReason = "resumed";
269
+ return { goal, value: `Goal resumed: Flow #${goal.parentIssueNumber}\nStatus: active` };
270
+ }) };
266
271
  case "pause":
267
- return mutateGoal(client, sessionID, async (goal) => {
268
- if (!goal)
269
- return { goal, value: "No goal to pause." };
270
- if (!canTransitionTo(goal, "paused"))
271
- return { goal, value: `Goal cannot be paused (status: ${goal.status}).` };
272
- goal.status = "paused";
273
- return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
274
- });
272
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
273
+ if (!goal)
274
+ return { goal, value: "No goal to pause." };
275
+ if (!canTransitionTo(goal, "paused"))
276
+ return { goal, value: `Goal cannot be paused (status: ${goal.status}).` };
277
+ goal.status = "paused";
278
+ return { goal, value: `Goal paused: Flow #${goal.parentIssueNumber}\nStatus: paused` };
279
+ }) };
275
280
  case "cancel":
276
- return mutateGoal(client, sessionID, async (goal) => {
277
- if (!goal)
278
- return { goal, value: "No goal to cancel." };
279
- // 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
280
- try {
281
- await removeFlowSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber);
282
- }
283
- catch {
284
- // 索引清理失败不阻塞取消(goal 本身已移除)
285
- }
286
- return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
287
- });
288
- case "edit":
289
- return mutateGoal(client, sessionID, async (goal) => {
290
- if (!goal)
291
- return { goal, value: "No goal to edit." };
292
- if (goal.status === "complete") {
293
- return { goal, value: "Error: completed goals are read-only. Remove the goal and create a new one." };
294
- }
295
- const budgetGiven = typeof args.token_budget === "number"
296
- && Number.isFinite(args.token_budget)
297
- && args.token_budget > 0;
298
- const budgetRemoved = args.token_budget === 0;
299
- const nextParent = typeof args.parent_issue_number === "number"
300
- && Number.isFinite(args.parent_issue_number)
301
- && args.parent_issue_number > 0
302
- ? Math.floor(args.parent_issue_number)
303
- : null;
304
- if (!budgetGiven && !budgetRemoved && nextParent === null) {
305
- return { goal, value: "Error: nothing to edit — pass parent_issue_number and/or token_budget" };
306
- }
307
- if (budgetGiven)
308
- goal.tokenBudget = Math.floor(args.token_budget);
309
- if (budgetRemoved)
310
- delete goal.tokenBudget;
311
- if (nextParent !== null && nextParent !== goal.parentIssueNumber) {
312
- const oldParent = goal.parentIssueNumber;
313
- goal.parentIssueNumber = nextParent;
314
- // 换 Flow:旧目标的记账/基线/创建时刻全部重置(新目标从 edit 时点起算)。
315
- // createdAt 必须更新——否则下一 tick 用旧 createdAt 重新初始化 baseline 时,
316
- // 会把旧 Flow 期间的消息(completed > 旧 createdAt)计入新 Flow 预算。
317
- goal.tokensUsed = 0;
318
- delete goal.tokensBaseline;
319
- goal.createdAt = Date.now();
281
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
282
+ if (!goal)
283
+ return { goal, value: "No goal to cancel." };
284
+ // 同步清除 session-index entry,避免重启 autoResume 恢复已取消 goal
320
285
  try {
321
- await bindSession(sessionProjectDir(ctx.directory), goal.parentIssueNumber, sessionID);
286
+ await removeFlowSession(projectDir, goal.parentIssueNumber);
322
287
  }
323
- catch (error) {
324
- // 新 Flow 索引绑定失败:新 entry 缺失,重启 autoResume 无法恢复新 goal
325
- console.warn(`[cabbage] goal edit: bindSession #${goal.parentIssueNumber} failed:`, error?.message ?? error);
288
+ catch {
289
+ // 索引清理失败不阻塞取消(goal 本身已移除)
326
290
  }
327
- try {
328
- await removeFlowSession(sessionProjectDir(ctx.directory), oldParent);
291
+ return { goal: null, value: `Goal cancelled: Flow #${goal.parentIssueNumber}` };
292
+ }) };
293
+ case "edit":
294
+ return { content: await mutateGoal(store, sessionID, async (goal) => {
295
+ if (!goal)
296
+ return { goal, value: "No goal to edit." };
297
+ if (goal.status === "complete") {
298
+ return { goal, value: "Error: completed goals are read-only. Remove the goal and create a new one." };
329
299
  }
330
- catch (error) {
331
- // 旧 entry 清理失败:残留 active entry 会在重启时被 autoResume 一致性自愈清理
332
- console.warn(`[cabbage] goal edit: removeFlowSession #${oldParent} failed:`, error?.message ?? error);
300
+ const budgetGiven = typeof args.token_budget === "number"
301
+ && Number.isFinite(args.token_budget)
302
+ && args.token_budget > 0;
303
+ const budgetRemoved = args.token_budget === 0;
304
+ const nextParent = typeof args.parent_issue_number === "number"
305
+ && Number.isFinite(args.parent_issue_number)
306
+ && args.parent_issue_number > 0
307
+ ? Math.floor(args.parent_issue_number)
308
+ : null;
309
+ if (!budgetGiven && !budgetRemoved && nextParent === null) {
310
+ return { goal, value: "Error: nothing to edit — pass parent_issue_number and/or token_budget" };
333
311
  }
334
- }
335
- return { goal, value: `Goal updated: Flow #${goal.parentIssueNumber}\nStatus: ${goal.status}` };
336
- });
312
+ if (budgetGiven)
313
+ goal.tokenBudget = Math.floor(args.token_budget);
314
+ if (budgetRemoved)
315
+ delete goal.tokenBudget;
316
+ if (nextParent !== null && nextParent !== goal.parentIssueNumber) {
317
+ const oldParent = goal.parentIssueNumber;
318
+ goal.parentIssueNumber = nextParent;
319
+ // 换 Flow:旧目标的记账/基线/创建时刻全部重置(新目标从 edit 时点起算)。
320
+ goal.tokensUsed = 0;
321
+ delete goal.tokensBaseline;
322
+ goal.createdAt = Date.now();
323
+ try {
324
+ goal.tokensBaseline = snapshotTokenTotal(await store.sessionTokens(sessionID));
325
+ }
326
+ catch {
327
+ goal.tokensBaseline = 0;
328
+ }
329
+ try {
330
+ await bindSession(projectDir, goal.parentIssueNumber, sessionID);
331
+ }
332
+ catch (error) {
333
+ // 新 Flow 索引绑定失败:新 entry 缺失,重启 autoResume 无法恢复新 goal
334
+ console.warn(`[cabbage] goal edit: bindSession #${goal.parentIssueNumber} failed:`, error?.message ?? error);
335
+ }
336
+ try {
337
+ await removeFlowSession(projectDir, oldParent);
338
+ }
339
+ catch (error) {
340
+ // 旧 entry 清理失败:残留 active entry 会在重启时被 autoResume 一致性自愈清理
341
+ console.warn(`[cabbage] goal edit: removeFlowSession #${oldParent} failed:`, error?.message ?? error);
342
+ }
343
+ }
344
+ return { goal, value: `Goal updated: Flow #${goal.parentIssueNumber}\nStatus: ${goal.status}` };
345
+ }) };
337
346
  default:
338
- return `Error: unknown operation "${args.op}"`;
347
+ return { content: `Error: unknown operation "${args.op}"` };
339
348
  }
340
349
  },
341
- });
350
+ };
342
351
  }
343
352
  //# sourceMappingURL=goal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,kDAAkD;AAClD,MAAM,SAAS,GAAG,IAAI,UAAU,EAAE,CAAA;AA6BlC,MAAM,UAAU,UAAU,CACxB,iBAAyB,EACzB,cAAmC,EACnC,WAAoB;IAEpB,OAAO;QACL,iBAAiB;QACjB,MAAM,EAAE,QAAQ;QAChB,iBAAiB,EAAE,CAAC;QACpB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAc,EAAE,MAAkB;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;QAC9C,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;QAC9C,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;QAChD,OAAO,CAAC,CAAC,OAAO,KAAK,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAc;IACvC,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;QACrD,CAAC,CAAC,WAAW,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;QACvD,CAAC,CAAC,EAAE,CAAA;IACN,OAAO;QACL,UAAU,IAAI,CAAC,iBAAiB,EAAE;QAClC,WAAW,IAAI,CAAC,MAAM,EAAE;QACxB,kBAAkB,IAAI,CAAC,iBAAiB,EAAE;QAC1C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;QAChE,UAAU;QACV,8DAA8D,IAAI,CAAC,iBAAiB,GAAG;KACxF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAEnC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAA;IACnD,MAAM,CAAC,GAAG,MAAgG,CAAA;IAC1G,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpG,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpH,OAAO,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;AAC/C,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,OAAO,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAA;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAEtD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAA;AAEhD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,iBAAyB;IAC1D,OAAO;;sCAE6B,iBAAiB;;;GAGpD,iBAAiB;;;;;;;;;;;;;;;;;8BAiBU,CAAA;AAC9B,CAAC;AAED,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;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAA+C,EAC/C,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;QACtD,MAAM,OAAO,GAAI,MAAoC,EAAE,IAAI,IAAI,IAAI,CAAA;QACnE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;QAC5D,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAgB,EAAE,OAAO,EAAE,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACtC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAA+C,EAC/C,SAAiB,EACjB,IAAqB,EACrB,eAAgC;IAEhC,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAA;IAC9E,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAA4B,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;IAChE,MAAM,QAAQ,GAAG,IAAI,KAAK,IAAI;QAC5B,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;QAC5E,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAA;IAEzB,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA+C,EAC/C,SAAiB,EACjB,EAAoG;IAEpG,OAAO,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QACrE,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC3C,MAAM,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAA+C,EAC/C,kBAA2B;IAE3B,uEAAuE;IACvE,MAAM,iBAAiB,GAAG,CAAC,YAAqB,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAA;IAC9G,OAAO,IAAI,CAAC;QACV,WAAW,EAAE;;;;;;;;2EAQ0D;QACvE,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACnH,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wFAAwF,CAAC;YACvJ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oHAAoH,CAAC;SAC7K;QACD,KAAK,CAAC,OAAO,CAAC,IAAyB,EAAE,GAAgB;YACvD,MAAM,SAAS,GAAI,GAAW,CAAC,SAAmB,CAAA;YAClD,kCAAkC;YAClC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YACrD,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAA;YACtC,MAAM,eAAe,GAAG,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAA;YAEtD,IAAI,UAAU,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACpF,OAAO,2CAA2C,IAAI,CAAC,EAAE,oEAAoE,CAAA;YAC/H,CAAC;YAED,IAAI,UAAU,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAA;gBAC3B,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;oBAChC,OAAO,mEAAmE,SAAS,sBAAsB,CAAA;gBAC3G,CAAC;gBACD,OAAO,UAAU,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACxD,IAAI,CAAC,IAAI;wBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAA;oBAC/E,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,8CAA8C,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;oBACvF,CAAC;oBACD,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;oBACxB,sDAAsD;oBACtD,IAAI,CAAC;wBACH,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;oBAC3G,CAAC;oBAAC,MAAM,CAAC;wBACP,iCAAiC;oBACnC,CAAC;oBACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,sCAAsC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAA;gBACxF,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;gBAChB,KAAK,QAAQ;oBACX,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBAClD,IAAI,IAAI,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;4BAC9B,kEAAkE;4BAClE,yCAAyC;4BACzC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,kDAAkD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAA;wBACpG,CAAC;wBACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;wBACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;4BACvD,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,mBAAmB,GAAG,CAAA;4BAC/F,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,4DAA4D,GAAG,EAAE,EAAE,CAAA;wBAC3F,CAAC;wBACD,6CAA6C;wBAC7C,MAAM,OAAO,GAAG,UAAU,CACxB,WAAW,EACX,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EACpB,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC;4BAClG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;4BAC/B,CAAC,CAAC,SAAS,CACd,CAAA;wBACD,uDAAuD;wBACvD,yCAAyC;wBACzC,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAEpE,CAAA;4BACD,IAAI,QAAQ,GAAG,CAAC,CAAA;4BAChB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gCACzC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;gCAC1B,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW;oCAAE,SAAQ;gCACxC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAU;oCAAE,SAAQ;gCAC5G,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;4BAChE,CAAC;4BACD,OAAO,CAAC,cAAc,GAAG,QAAQ,CAAA;wBACnC,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO,CAAC,cAAc,GAAG,CAAC,CAAA;wBAC5B,CAAC;wBACD,6CAA6C;wBAC7C,IAAI,CAAC;4BACH,MAAM,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;wBAC3F,CAAC;wBAAC,MAAM,CAAC;4BACP,mDAAmD;wBACrD,CAAC;wBACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,uBAAuB,OAAO,CAAC,iBAAiB,kBAAkB,EAAE,CAAA;oBACrG,CAAC,CAAC,CAAA;gBAEJ,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;oBACxD,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAA;gBACpD,CAAC;gBAED,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;oBAClD,IAAI,CAAC,IAAI;wBAAE,OAAO,iBAAiB,CAAA;oBACnC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;wBAAE,OAAO,+BAA+B,IAAI,CAAC,MAAM,IAAI,CAAA;oBACnF,OAAO,0GAA0G,CAAA;gBACnH,CAAC;gBAED,KAAK,QAAQ;oBACX,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBAClD,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAA;wBACvD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,mCAAmC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;wBAChH,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;wBACtB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;wBAC1B,2DAA2D;wBAC3D,IAAI,CAAC,YAAY,GAAG,SAAS,CAAA;wBAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,IAAI,CAAC,iBAAiB,kBAAkB,EAAE,CAAA;oBACzF,CAAC,CAAC,CAAA;gBAEJ,KAAK,OAAO;oBACV,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBAClD,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;wBACtD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAA;wBAC/G,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;wBACtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,IAAI,CAAC,iBAAiB,kBAAkB,EAAE,CAAA;oBACxF,CAAC,CAAC,CAAA;gBAEJ,KAAK,QAAQ;oBACX,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBAClD,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAA;wBACvD,sDAAsD;wBACtD,IAAI,CAAC;4BACH,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAA;wBACnF,CAAC;wBAAC,MAAM,CAAC;4BACP,0BAA0B;wBAC5B,CAAC;wBACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,yBAAyB,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAA;oBACjF,CAAC,CAAC,CAAA;gBAEJ,KAAK,MAAM;oBACT,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;wBAClD,IAAI,CAAC,IAAI;4BAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAA;wBACrD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;4BAC/B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,6EAA6E,EAAE,CAAA;wBACvG,CAAC;wBACD,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;+BACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;+BAClC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;wBAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,KAAK,CAAC,CAAA;wBAC7C,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,mBAAmB,KAAK,QAAQ;+BAC1D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC;+BACzC,IAAI,CAAC,mBAAmB,GAAG,CAAC;4BAC/B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;4BACtC,CAAC,CAAC,IAAI,CAAA;wBACR,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;4BAC1D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uEAAuE,EAAE,CAAA;wBACjG,CAAC;wBACD,IAAI,WAAW;4BAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAsB,CAAC,CAAA;wBAC3E,IAAI,aAAa;4BAAE,OAAO,IAAI,CAAC,WAAW,CAAA;wBAC1C,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC;4BACjE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAA;4BACxC,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAA;4BACnC,6CAA6C;4BAC7C,2DAA2D;4BAC3D,sDAAsD;4BACtD,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;4BACnB,OAAO,IAAI,CAAC,cAAc,CAAA;4BAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;4BAC3B,IAAI,CAAC;gCACH,MAAM,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAA;4BACxF,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,oDAAoD;gCACpD,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,iBAAiB,UAAU,EAAG,KAAsB,EAAE,OAAO,IAAI,KAAK,CAAC,CAAA;4BAChI,CAAC;4BACD,IAAI,CAAC;gCACH,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAA;4BACtE,CAAC;4BAAC,OAAO,KAAK,EAAE,CAAC;gCACf,yDAAyD;gCACzD,OAAO,CAAC,IAAI,CAAC,2CAA2C,SAAS,UAAU,EAAG,KAAsB,EAAE,OAAO,IAAI,KAAK,CAAC,CAAA;4BACzH,CAAC;wBACH,CAAC;wBACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,IAAI,CAAC,iBAAiB,aAAa,IAAI,CAAC,MAAM,EAAE,EAAE,CAAA;oBACjG,CAAC,CAAC,CAAA;gBAEJ;oBACE,OAAO,6BAA6B,IAAI,CAAC,EAAE,GAAG,CAAA;YAClD,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"goal.js","sourceRoot":"","sources":["../../src/plugin/goal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** 安装锁:mkdir 原子性互斥,防多实例并发 rm+cp 踩踏(超时放弃而非死等) */
2
+ export declare function acquireLock(lockPath: string, timeoutMs?: number): Promise<() => Promise<void>>;
3
+ export interface EnsureInstalledOptions {
4
+ sourceDir: string;
5
+ destDir: string;
6
+ /** 判定目标目录已完整可用(目录缺失/不完整时返回 false) */
7
+ isComplete: (destDir: string) => Promise<boolean>;
8
+ }
9
+ /**
10
+ * 版本化目录安装:完整则跳过;否则在锁内 rm+cp(锁内二次检查防重复重建)。
11
+ * 调用方可依赖返回后 destDir 完整可用。排除 __pycache__/*.pyc(Python 资产复用)。
12
+ */
13
+ export declare function ensureInstalledDir({ sourceDir, destDir, isComplete }: EnsureInstalledOptions): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { cp, mkdir, rm } from "node:fs/promises";
2
+ import path from "node:path";
3
+ /** 安装锁:mkdir 原子性互斥,防多实例并发 rm+cp 踩踏(超时放弃而非死等) */
4
+ export async function acquireLock(lockPath, timeoutMs = 10_000) {
5
+ await mkdir(path.dirname(lockPath), { recursive: true });
6
+ const start = Date.now();
7
+ for (;;) {
8
+ try {
9
+ await mkdir(lockPath);
10
+ return async () => {
11
+ await rm(lockPath, { recursive: true, force: true }).catch(() => undefined);
12
+ };
13
+ }
14
+ catch (err) {
15
+ if (err.code !== "EEXIST")
16
+ throw err;
17
+ if (Date.now() - start > timeoutMs) {
18
+ throw new Error(`[cabbage] timed out waiting for install lock: ${lockPath}`);
19
+ }
20
+ await new Promise(r => setTimeout(r, 100));
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * 版本化目录安装:完整则跳过;否则在锁内 rm+cp(锁内二次检查防重复重建)。
26
+ * 调用方可依赖返回后 destDir 完整可用。排除 __pycache__/*.pyc(Python 资产复用)。
27
+ */
28
+ export async function ensureInstalledDir({ sourceDir, destDir, isComplete }) {
29
+ if (await isComplete(destDir))
30
+ return;
31
+ const release = await acquireLock(`${destDir}.lock`);
32
+ try {
33
+ if (await isComplete(destDir))
34
+ return;
35
+ await rm(destDir, { recursive: true, force: true });
36
+ await mkdir(destDir, { recursive: true });
37
+ await cp(sourceDir, destDir, {
38
+ recursive: true,
39
+ filter: (src) => !src.split(path.sep).includes("__pycache__") && !src.endsWith(".pyc"),
40
+ });
41
+ }
42
+ finally {
43
+ await release();
44
+ }
45
+ }
46
+ //# sourceMappingURL=install-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-dir.js","sourceRoot":"","sources":["../../src/plugin/install-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAS,GAAG,MAAM;IACpE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;YACrB,OAAO,KAAK,IAAI,EAAE;gBAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC7E,CAAC,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAA;YAC/D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,QAAQ,EAAE,CAAC,CAAA;YAC9E,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAA0B;IACjG,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC;QAAE,OAAM;IACrC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,OAAO,OAAO,CAAC,CAAA;IACpD,IAAI,CAAC;QACH,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC;YAAE,OAAM;QACrC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE;YAC3B,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;SACvF,CAAC,CAAA;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAA;IACjB,CAAC;AACH,CAAC"}