opencode-planpilot 0.2.3 → 0.2.4

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 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/command.ts","../src/lib/db.ts","../src/lib/models.ts","../src/lib/util.ts","../src/lib/errors.ts","../src/lib/format.ts","../src/lib/app.ts","../src/prompt.ts","../src/lib/config.ts"],"sourcesContent":["import { tool, type Plugin } from \"@opencode-ai/plugin\"\nimport { runCommand, formatCommandError } from \"./command\"\nimport { PlanpilotApp } from \"./lib/app\"\nimport {\n loadPlanpilotConfig,\n matchesKeywords,\n type EventRule,\n type SendRetryConfig,\n type SessionErrorRule,\n type SessionRetryRule,\n} from \"./lib/config\"\nimport { openDatabase } from \"./lib/db\"\nimport { invalidInput } from \"./lib/errors\"\nimport { formatStepDetail } from \"./lib/format\"\nimport { parseWaitFromComment } from \"./lib/util\"\nimport { PLANPILOT_SYSTEM_INJECTION, PLANPILOT_TOOL_DESCRIPTION, formatPlanpilotAutoContinueMessage } from \"./prompt\"\n\nexport const PlanpilotPlugin: Plugin = async (ctx) => {\n const IDLE_DEBOUNCE_MS = 1000\n const RECENT_SEND_DEDUPE_MS = 1500\n const TRIGGER_TTL_MS = 10 * 60 * 1000\n\n const inFlight = new Set<string>()\n const skipNextAuto = new Set<string>()\n const lastIdleAt = new Map<string, number>()\n const pendingTrigger = new Map<string, AutoTrigger>()\n const recentSends = new Map<string, { signature: string; at: number }>()\n const sendRetryTimers = new Map<string, ReturnType<typeof setTimeout>>()\n const sendRetryState = new Map<string, { signature: string; attempt: number }>()\n const manualStop = new Map<string, { at: number; reason: string }>()\n const waitTimers = new Map<string, ReturnType<typeof setTimeout>>()\n const permissionAsked = new Map<string, { sessionID: string; summary: string }>()\n const questionAsked = new Map<string, { sessionID: string; summary: string }>()\n const runSeq = new Map<string, number>()\n\n const loadedConfig = loadPlanpilotConfig()\n const autoConfig = loadedConfig.config.autoContinue\n\n type AutoTrigger = {\n source: string\n force: boolean\n detail?: string\n at: number\n }\n\n type RetryInput = {\n sessionID: string\n signature: string\n source: string\n force: boolean\n detail?: string\n error: unknown\n }\n\n const clearWaitTimer = (sessionID: string) => {\n const existing = waitTimers.get(sessionID)\n if (existing) {\n clearTimeout(existing)\n waitTimers.delete(sessionID)\n }\n }\n\n const log = async (level: \"debug\" | \"info\" | \"warn\" | \"error\", message: string, extra?: Record<string, any>) => {\n try {\n await ctx.client.app.log({\n body: {\n service: \"opencode-planpilot\",\n level,\n message,\n extra,\n },\n })\n } catch {\n // ignore logging failures\n }\n }\n\n const logDebug = async (message: string, extra?: Record<string, any>) => {\n await log(\"debug\", message, extra)\n }\n\n const clearSendRetryTimer = (sessionID: string) => {\n const timer = sendRetryTimers.get(sessionID)\n if (timer) {\n clearTimeout(timer)\n sendRetryTimers.delete(sessionID)\n }\n }\n\n const clearSendRetry = (sessionID: string) => {\n clearSendRetryTimer(sessionID)\n sendRetryState.delete(sessionID)\n }\n\n const clearManualStop = async (sessionID: string, source: string) => {\n if (!manualStop.has(sessionID)) return\n manualStop.delete(sessionID)\n await logDebug(\"manual-stop guard cleared\", { sessionID, source })\n }\n\n const setManualStop = async (sessionID: string, reason: string, source: string) => {\n manualStop.set(sessionID, {\n at: Date.now(),\n reason,\n })\n pendingTrigger.delete(sessionID)\n clearSendRetry(sessionID)\n await log(\"info\", \"manual-stop guard armed\", {\n sessionID,\n source,\n reason,\n })\n }\n\n const stringifyError = (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === \"string\") return error\n return String(error)\n }\n\n const isManualStopError = (error: unknown): boolean => {\n const text = stringifyError(error).toLowerCase()\n return text.includes(\"aborted\") || text.includes(\"cancel\") || text.includes(\"canceled\")\n }\n\n const buildRetryDetail = (baseDetail: string | undefined, attempt: number, max: number, message: string) =>\n toSummary([\n baseDetail,\n `send-retry=${attempt}/${max}`,\n message ? `error=${message}` : undefined,\n ])\n\n const scheduleSendRetry = async (input: RetryInput) => {\n const cfg: SendRetryConfig = autoConfig.sendRetry\n if (!cfg.enabled) return\n\n const blocked = manualStop.get(input.sessionID)\n if (blocked) {\n await logDebug(\"send retry skipped: manual-stop guard active\", {\n sessionID: input.sessionID,\n source: input.source,\n reason: blocked.reason,\n })\n return\n }\n\n const text = stringifyError(input.error)\n if (isManualStopError(input.error)) {\n await logDebug(\"send retry skipped: manual-stop style error\", {\n sessionID: input.sessionID,\n source: input.source,\n error: text,\n })\n return\n }\n\n const previous = sendRetryState.get(input.sessionID)\n const attempt =\n previous && previous.signature === input.signature\n ? previous.attempt + 1\n : 1\n if (attempt > cfg.maxAttempts) {\n clearSendRetry(input.sessionID)\n await log(\"warn\", \"send retry exhausted\", {\n sessionID: input.sessionID,\n source: input.source,\n signature: input.signature,\n maxAttempts: cfg.maxAttempts,\n error: text,\n })\n return\n }\n\n sendRetryState.set(input.sessionID, {\n signature: input.signature,\n attempt,\n })\n clearSendRetryTimer(input.sessionID)\n\n const index = Math.min(Math.max(attempt - 1, 0), cfg.delaysMs.length - 1)\n const delayMs = cfg.delaysMs[index]\n const retryDetail = buildRetryDetail(input.detail, attempt, cfg.maxAttempts, text)\n\n const timer = setTimeout(() => {\n sendRetryTimers.delete(input.sessionID)\n queueTrigger(input.sessionID, {\n source: `${input.source}.send_retry`,\n force: input.force,\n detail: retryDetail,\n }).catch((err) => {\n void log(\"warn\", \"send retry trigger failed\", {\n sessionID: input.sessionID,\n source: input.source,\n error: stringifyError(err),\n })\n })\n }, delayMs)\n sendRetryTimers.set(input.sessionID, timer)\n\n await log(\"info\", \"send retry scheduled\", {\n sessionID: input.sessionID,\n source: input.source,\n signature: input.signature,\n attempt,\n maxAttempts: cfg.maxAttempts,\n delayMs,\n error: text,\n })\n }\n\n const nextRun = (sessionID: string) => {\n const next = (runSeq.get(sessionID) ?? 0) + 1\n runSeq.set(sessionID, next)\n return next\n }\n\n type SessionMessage = {\n info?: {\n role?: string\n agent?: string\n model?: {\n providerID: string\n modelID: string\n }\n modelID?: string\n providerID?: string\n variant?: string\n time?: {\n created?: number\n }\n error?: {\n name?: string\n data?: {\n message?: string\n statusCode?: number\n isRetryable?: boolean\n }\n }\n finish?: string\n }\n }\n\n const loadRecentMessages = async (sessionID: string, limit = 200): Promise<SessionMessage[]> => {\n const response = await ctx.client.session.messages({\n path: { id: sessionID },\n query: { limit },\n })\n const data = (response as { data?: unknown }).data ?? response\n if (!Array.isArray(data)) return []\n return data as SessionMessage[]\n }\n\n const findLastMessage = (messages: SessionMessage[], predicate: (message: SessionMessage) => boolean) => {\n for (let idx = messages.length - 1; idx >= 0; idx -= 1) {\n const message = messages[idx]\n if (predicate(message)) return message\n }\n return undefined\n }\n\n const findLastMessageByRole = (messages: SessionMessage[], role: \"user\" | \"assistant\") =>\n findLastMessage(messages, (message) => message?.info?.role === role)\n\n const resolveAutoContext = async (sessionID: string) => {\n const messages = await loadRecentMessages(sessionID)\n if (!messages.length) return null\n\n const sortedMessages = [...messages].sort((left, right) => {\n const leftTime = left?.info?.time?.created ?? 0\n const rightTime = right?.info?.time?.created ?? 0\n return leftTime - rightTime\n })\n\n const lastUser = findLastMessage(sortedMessages, (message) => message?.info?.role === \"user\")\n if (!lastUser) return { missingUser: true }\n\n const lastAssistant = findLastMessageByRole(sortedMessages, \"assistant\")\n const error = lastAssistant?.info?.error\n const aborted = typeof error === \"object\" && error?.name === \"MessageAbortedError\"\n const finish = lastAssistant?.info?.finish\n const ready =\n !lastAssistant || (typeof finish === \"string\" && finish !== \"tool-calls\" && finish !== \"unknown\")\n\n const model =\n lastUser?.info?.model ??\n (lastUser?.info?.providerID && lastUser?.info?.modelID\n ? { providerID: lastUser.info.providerID, modelID: lastUser.info.modelID }\n : lastAssistant?.info?.providerID && lastAssistant?.info?.modelID\n ? { providerID: lastAssistant.info.providerID, modelID: lastAssistant.info.modelID }\n : undefined)\n\n return {\n agent: lastUser?.info?.agent ?? lastAssistant?.info?.agent,\n model,\n variant: lastUser?.info?.variant,\n aborted,\n ready,\n missingUser: false,\n assistantFinish: finish,\n assistantErrorName: typeof error === \"object\" && error ? (error as any).name : undefined,\n assistantErrorMessage:\n typeof error === \"object\" && error && typeof (error as any).data?.message === \"string\"\n ? ((error as any).data.message as string)\n : undefined,\n assistantErrorStatusCode:\n typeof error === \"object\" &&\n error &&\n typeof (error as any).data?.statusCode === \"number\" &&\n Number.isFinite((error as any).data.statusCode)\n ? Math.trunc((error as any).data.statusCode as number)\n : undefined,\n assistantErrorRetryable:\n typeof error === \"object\" && error && typeof (error as any).data?.isRetryable === \"boolean\"\n ? ((error as any).data.isRetryable as boolean)\n : undefined,\n }\n }\n\n const toSummary = (parts: Array<string | undefined>) =>\n parts\n .filter((part): part is string => typeof part === \"string\" && part.trim().length > 0)\n .join(\" \")\n .trim()\n\n const toStringArray = (value: unknown) =>\n Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\").map((item) => item.trim()).filter(Boolean)\n : []\n\n const summarizePermissionEvent = (properties: any): string => {\n const permission = typeof properties?.permission === \"string\" ? properties.permission.trim() : \"\"\n const patterns = toStringArray(properties?.patterns)\n return toSummary([permission, patterns.length ? `patterns=${patterns.join(\",\")}` : undefined])\n }\n\n const summarizeQuestionEvent = (properties: any): string => {\n const questions = Array.isArray(properties?.questions) ? properties.questions : []\n const pieces = questions\n .map((item: any) =>\n toSummary([\n typeof item?.header === \"string\" ? item.header.trim() : undefined,\n typeof item?.question === \"string\" ? item.question.trim() : undefined,\n ]),\n )\n .filter(Boolean)\n return pieces.join(\" | \")\n }\n\n const shouldTriggerEventRule = (rule: EventRule, text: string): boolean => {\n if (!rule.enabled) return false\n return matchesKeywords(text, rule.keywords)\n }\n\n const shouldTriggerSessionError = (rule: SessionErrorRule, error: any): { matched: boolean; detail: string } => {\n if (!rule.enabled) return { matched: false, detail: \"\" }\n if (!error || typeof error !== \"object\") return { matched: false, detail: \"\" }\n\n const name = typeof error.name === \"string\" ? error.name : \"\"\n const message = typeof error.data?.message === \"string\" ? error.data.message : \"\"\n const statusCode =\n typeof error.data?.statusCode === \"number\" && Number.isFinite(error.data.statusCode)\n ? Math.trunc(error.data.statusCode)\n : undefined\n const retryable = typeof error.data?.isRetryable === \"boolean\" ? error.data.isRetryable : undefined\n\n if (rule.errorNames.length > 0 && !rule.errorNames.includes(name)) {\n return { matched: false, detail: \"\" }\n }\n if (rule.statusCodes.length > 0) {\n if (statusCode === undefined || !rule.statusCodes.includes(statusCode)) {\n return { matched: false, detail: \"\" }\n }\n }\n if (rule.retryableOnly && retryable !== true) {\n return { matched: false, detail: \"\" }\n }\n\n const detail = toSummary([\n name ? `error=${name}` : undefined,\n statusCode !== undefined ? `status=${statusCode}` : undefined,\n retryable !== undefined ? `retryable=${retryable}` : undefined,\n message,\n ])\n if (!matchesKeywords(detail, rule.keywords)) {\n return { matched: false, detail }\n }\n return { matched: true, detail }\n }\n\n const shouldTriggerSessionRetry = (rule: SessionRetryRule, status: any): { matched: boolean; detail: string } => {\n if (!rule.enabled) return { matched: false, detail: \"\" }\n if (!status || typeof status !== \"object\") return { matched: false, detail: \"\" }\n if (status.type !== \"retry\") return { matched: false, detail: \"\" }\n\n const attempt = typeof status.attempt === \"number\" && Number.isFinite(status.attempt) ? Math.trunc(status.attempt) : 0\n const message = typeof status.message === \"string\" ? status.message : \"\"\n const next = typeof status.next === \"number\" && Number.isFinite(status.next) ? Math.trunc(status.next) : undefined\n if (attempt < rule.attemptAtLeast) {\n return { matched: false, detail: \"\" }\n }\n const detail = toSummary([\n `attempt=${attempt}`,\n next !== undefined ? `next=${next}` : undefined,\n message,\n ])\n if (!matchesKeywords(detail, rule.keywords)) {\n return { matched: false, detail }\n }\n return { matched: true, detail }\n }\n\n const readTrigger = (sessionID: string): AutoTrigger | undefined => {\n const current = pendingTrigger.get(sessionID)\n if (!current) return undefined\n if (Date.now() - current.at > TRIGGER_TTL_MS) {\n pendingTrigger.delete(sessionID)\n return undefined\n }\n return current\n }\n\n const queueTrigger = async (sessionID: string, trigger: Omit<AutoTrigger, \"at\">) => {\n if (manualStop.has(sessionID)) {\n await logDebug(\"auto-continue trigger skipped: manual-stop guard active\", {\n sessionID,\n source: trigger.source,\n })\n return\n }\n pendingTrigger.set(sessionID, {\n ...trigger,\n at: Date.now(),\n })\n await logDebug(\"auto-continue trigger queued\", {\n sessionID,\n source: trigger.source,\n force: trigger.force,\n detail: trigger.detail,\n })\n await handleSessionIdle(sessionID, trigger.source)\n }\n\n const handleSessionIdle = async (sessionID: string, source: string) => {\n const now = Date.now()\n const run = nextRun(sessionID)\n const trigger = readTrigger(sessionID)\n const force = trigger?.force === true\n const idleSource = source === \"session.idle\" || source === \"session.status\"\n\n if (inFlight.has(sessionID)) {\n await logDebug(\"auto-continue skipped: already in-flight\", { sessionID, source, run, trigger: trigger?.source })\n return\n }\n\n const stopped = manualStop.get(sessionID)\n if (stopped) {\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: manual-stop guard active\", {\n sessionID,\n source,\n run,\n stopAt: stopped.at,\n stopReason: stopped.reason,\n })\n return\n }\n\n inFlight.add(sessionID)\n try {\n if (skipNextAuto.has(sessionID)) {\n skipNextAuto.delete(sessionID)\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: skipNextAuto\", { sessionID, source, run, trigger: trigger?.source })\n return\n }\n\n if (idleSource && !trigger) {\n const lastIdle = lastIdleAt.get(sessionID)\n if (lastIdle && now - lastIdle < IDLE_DEBOUNCE_MS) {\n await logDebug(\"auto-continue skipped: idle debounce\", {\n sessionID,\n source,\n run,\n lastIdle,\n now,\n deltaMs: now - lastIdle,\n })\n return\n }\n }\n\n if (idleSource) {\n lastIdleAt.set(sessionID, now)\n }\n\n const app = new PlanpilotApp(openDatabase(), sessionID)\n const active = app.getActivePlan()\n if (!active) {\n clearWaitTimer(sessionID)\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: no active plan\", { sessionID, source, run, trigger: trigger?.source })\n return\n }\n const next = app.nextStep(active.plan_id)\n if (!next) {\n clearWaitTimer(sessionID)\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: no pending step\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n trigger: trigger?.source,\n })\n return\n }\n if (next.executor !== \"ai\") {\n clearWaitTimer(sessionID)\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: next executor is not ai\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n executor: next.executor,\n trigger: trigger?.source,\n })\n return\n }\n\n const wait = parseWaitFromComment(next.comment)\n if (wait && wait.until > now) {\n clearWaitTimer(sessionID)\n await log(\"info\", \"auto-continue delayed by step wait\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n until: wait.until,\n reason: wait.reason,\n trigger: trigger?.source,\n })\n const msUntil = Math.max(0, wait.until - now)\n const timer = setTimeout(() => {\n waitTimers.delete(sessionID)\n handleSessionIdle(sessionID, \"wait_timer\").catch((err) => {\n void log(\"warn\", \"auto-continue retry failed\", {\n sessionID,\n error: err instanceof Error ? err.message : String(err),\n })\n })\n }, msUntil)\n waitTimers.set(sessionID, timer)\n return\n }\n if (!wait) {\n clearWaitTimer(sessionID)\n }\n\n const goals = app.goalsForStep(next.id)\n const detail = formatStepDetail(next, goals)\n if (!detail.trim()) {\n pendingTrigger.delete(sessionID)\n await log(\"warn\", \"auto-continue stopped: empty step detail\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n trigger: trigger?.source,\n })\n return\n }\n\n const signature = `${active.plan_id}:${next.id}`\n const retryState = sendRetryState.get(sessionID)\n if (retryState && retryState.signature !== signature) {\n clearSendRetry(sessionID)\n }\n const recent = recentSends.get(sessionID)\n if (recent && recent.signature === signature && now - recent.at < RECENT_SEND_DEDUPE_MS) {\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: duplicate send window\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n trigger: trigger?.source,\n deltaMs: now - recent.at,\n })\n return\n }\n\n const autoContext = await resolveAutoContext(sessionID)\n if (autoContext?.missingUser) {\n pendingTrigger.delete(sessionID)\n await log(\"warn\", \"auto-continue stopped: missing user context\", { sessionID, source, run, trigger: trigger?.source })\n return\n }\n if (!autoContext) {\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue stopped: missing autoContext (no recent messages?)\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n trigger: trigger?.source,\n })\n return\n }\n if (autoContext.aborted && !force) {\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: last assistant aborted\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n assistantErrorName: autoContext.assistantErrorName,\n assistantErrorMessage: autoContext.assistantErrorMessage,\n assistantFinish: autoContext.assistantFinish,\n trigger: trigger?.source,\n })\n return\n }\n if (autoContext.ready === false && !force) {\n pendingTrigger.delete(sessionID)\n await logDebug(\"auto-continue skipped: last assistant not ready\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n assistantFinish: autoContext.assistantFinish,\n assistantErrorName: autoContext.assistantErrorName,\n assistantErrorMessage: autoContext.assistantErrorMessage,\n trigger: trigger?.source,\n })\n return\n }\n\n const timestamp = new Date().toISOString()\n const message = formatPlanpilotAutoContinueMessage({\n timestamp,\n stepDetail: detail,\n triggerDetail: trigger?.detail,\n })\n\n const promptBody: any = {\n agent: autoContext.agent ?? undefined,\n model: autoContext.model ?? undefined,\n parts: [{ type: \"text\" as const, text: message }],\n }\n if (autoContext.variant) {\n promptBody.variant = autoContext.variant\n }\n\n await logDebug(\"auto-continue sending prompt_async\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n trigger: trigger?.source,\n force,\n agent: promptBody.agent,\n model: promptBody.model,\n variant: promptBody.variant,\n messageChars: message.length,\n })\n\n await ctx.client.session.promptAsync({\n path: { id: sessionID },\n body: promptBody,\n // OpenCode server routes requests to the correct instance (project) using this header.\n // Without it, the server falls back to process.cwd(), which breaks when OpenCode is\n // managed by opencode-studio (cwd != active project directory).\n headers: ctx.directory ? { \"x-opencode-directory\": ctx.directory } : undefined,\n }).catch(async (err) => {\n await scheduleSendRetry({\n sessionID,\n signature,\n source,\n force,\n detail: trigger?.detail,\n error: err,\n })\n throw err\n })\n\n recentSends.set(sessionID, {\n signature,\n at: Date.now(),\n })\n clearSendRetry(sessionID)\n pendingTrigger.delete(sessionID)\n\n await log(\"info\", \"auto-continue prompt_async accepted\", {\n sessionID,\n source,\n run,\n planId: active.plan_id,\n stepId: next.id,\n trigger: trigger?.source,\n force,\n })\n } catch (err) {\n await log(\"warn\", \"failed to auto-continue plan\", {\n sessionID,\n source,\n error: err instanceof Error ? err.message : String(err),\n stack: err instanceof Error ? err.stack : undefined,\n })\n } finally {\n inFlight.delete(sessionID)\n }\n }\n\n if (loadedConfig.loadError) {\n await log(\"warn\", \"failed to load planpilot config, falling back to defaults\", {\n path: loadedConfig.path,\n error: loadedConfig.loadError,\n })\n }\n\n await log(\"info\", \"planpilot plugin initialized\", {\n directory: ctx.directory,\n worktree: ctx.worktree,\n configPath: loadedConfig.path,\n configLoadedFromFile: loadedConfig.loadedFromFile,\n })\n\n return {\n \"experimental.chat.system.transform\": async (_input, output) => {\n output.system.push(PLANPILOT_SYSTEM_INJECTION)\n },\n tool: {\n planpilot: tool({\n description: PLANPILOT_TOOL_DESCRIPTION,\n args: {\n argv: tool.schema.array(tool.schema.string()).min(1),\n },\n async execute(args, toolCtx) {\n const argv = Array.isArray(args.argv) ? args.argv : []\n if (!argv.length) {\n return formatCommandError(invalidInput(\"missing argv\"))\n }\n\n if (containsForbiddenFlags(argv)) {\n return formatCommandError(invalidInput(\"argv cannot include --cwd or --session-id\"))\n }\n\n const cwd = (ctx.directory ?? \"\").trim()\n if (!cwd) {\n return formatCommandError(invalidInput(\"cwd is required\"))\n }\n\n const output: string[] = []\n const io = {\n log: (...parts: any[]) => output.push(parts.map(String).join(\" \")),\n }\n\n try {\n await runCommand(argv, { sessionId: toolCtx.sessionID, cwd }, io)\n } catch (err) {\n return formatCommandError(err)\n }\n\n return output.join(\"\\n\").trimEnd()\n },\n }),\n },\n \"experimental.session.compacting\": async ({ sessionID }, output) => {\n skipNextAuto.add(sessionID)\n lastIdleAt.set(sessionID, Date.now())\n\n await logDebug(\"compaction hook: skip next auto-continue\", { sessionID })\n\n // Compaction runs with tools disabled; inject Planpilot guidance into the continuation summary.\n output.context.push(PLANPILOT_TOOL_DESCRIPTION)\n },\n event: async ({ event }) => {\n const evt = event as any\n\n if (evt.type === \"message.updated\") {\n const info = evt.properties?.info\n const sessionID = typeof info?.sessionID === \"string\" ? info.sessionID : \"\"\n if (!sessionID) return\n\n if (info.role === \"user\") {\n pendingTrigger.delete(sessionID)\n clearSendRetry(sessionID)\n await clearManualStop(sessionID, \"message.updated.user\")\n return\n }\n\n if (info.role === \"assistant\" && info.error?.name === \"MessageAbortedError\") {\n await setManualStop(sessionID, \"assistant message aborted\", \"message.updated.assistant\")\n }\n return\n }\n\n if (evt.type === \"session.idle\") {\n await handleSessionIdle(evt.properties.sessionID, \"session.idle\")\n return\n }\n if (evt.type === \"session.status\") {\n if (evt.properties.status.type === \"idle\") {\n await handleSessionIdle(evt.properties.sessionID, \"session.status\")\n return\n }\n const retryResult = shouldTriggerSessionRetry(autoConfig.onSessionRetry, evt.properties.status)\n if (!retryResult.matched) return\n await queueTrigger(evt.properties.sessionID, {\n source: \"session.status.retry\",\n force: autoConfig.onSessionRetry.force,\n detail: retryResult.detail || \"session status retry\",\n })\n return\n }\n\n if (evt.type === \"session.error\") {\n const sessionID = typeof evt.properties?.sessionID === \"string\" ? evt.properties.sessionID : \"\"\n if (!sessionID) return\n if (evt.properties?.error?.name === \"MessageAbortedError\") {\n await setManualStop(sessionID, \"session aborted\", \"session.error\")\n return\n }\n const errorResult = shouldTriggerSessionError(autoConfig.onSessionError, evt.properties?.error)\n if (!errorResult.matched) return\n await queueTrigger(sessionID, {\n source: \"session.error\",\n force: autoConfig.onSessionError.force,\n detail: errorResult.detail || \"session error\",\n })\n return\n }\n\n if (evt.type === \"permission.asked\") {\n const sessionID = typeof evt.properties?.sessionID === \"string\" ? evt.properties.sessionID : \"\"\n if (!sessionID) return\n const requestID = typeof evt.properties?.id === \"string\" ? evt.properties.id : \"\"\n const summary = summarizePermissionEvent(evt.properties)\n if (requestID) {\n permissionAsked.set(requestID, {\n sessionID,\n summary,\n })\n }\n if (!shouldTriggerEventRule(autoConfig.onPermissionAsked, summary || \"permission asked\")) return\n await queueTrigger(sessionID, {\n source: \"permission.asked\",\n force: autoConfig.onPermissionAsked.force,\n detail: summary || \"permission asked\",\n })\n return\n }\n\n if (evt.type === \"permission.replied\") {\n const sessionID = typeof evt.properties?.sessionID === \"string\" ? evt.properties.sessionID : \"\"\n if (!sessionID) return\n const requestID =\n typeof evt.properties?.requestID === \"string\"\n ? evt.properties.requestID\n : typeof evt.properties?.permissionID === \"string\"\n ? evt.properties.permissionID\n : \"\"\n const reply =\n typeof evt.properties?.reply === \"string\"\n ? evt.properties.reply\n : typeof evt.properties?.response === \"string\"\n ? evt.properties.response\n : \"\"\n const asked = requestID ? permissionAsked.get(requestID) : undefined\n if (requestID) {\n permissionAsked.delete(requestID)\n }\n if (reply !== \"reject\") return\n const summary = toSummary([\n asked?.summary,\n requestID ? `request=${requestID}` : undefined,\n \"reply=reject\",\n ])\n if (!shouldTriggerEventRule(autoConfig.onPermissionRejected, summary || \"permission rejected\")) return\n await queueTrigger(sessionID, {\n source: \"permission.replied.reject\",\n force: autoConfig.onPermissionRejected.force,\n detail: summary || \"permission rejected\",\n })\n return\n }\n\n if (evt.type === \"question.asked\") {\n const sessionID = typeof evt.properties?.sessionID === \"string\" ? evt.properties.sessionID : \"\"\n if (!sessionID) return\n const requestID = typeof evt.properties?.id === \"string\" ? evt.properties.id : \"\"\n const summary = summarizeQuestionEvent(evt.properties)\n if (requestID) {\n questionAsked.set(requestID, {\n sessionID,\n summary,\n })\n }\n if (!shouldTriggerEventRule(autoConfig.onQuestionAsked, summary || \"question asked\")) return\n await queueTrigger(sessionID, {\n source: \"question.asked\",\n force: autoConfig.onQuestionAsked.force,\n detail: summary || \"question asked\",\n })\n return\n }\n\n if (evt.type === \"question.replied\") {\n const requestID = typeof evt.properties?.requestID === \"string\" ? evt.properties.requestID : \"\"\n if (!requestID) return\n questionAsked.delete(requestID)\n return\n }\n\n if (evt.type === \"question.rejected\") {\n const sessionID = typeof evt.properties?.sessionID === \"string\" ? evt.properties.sessionID : \"\"\n if (!sessionID) return\n const requestID = typeof evt.properties?.requestID === \"string\" ? evt.properties.requestID : \"\"\n const asked = requestID ? questionAsked.get(requestID) : undefined\n if (requestID) {\n questionAsked.delete(requestID)\n }\n const summary = toSummary([\n asked?.summary,\n requestID ? `request=${requestID}` : undefined,\n \"question=rejected\",\n ])\n if (!shouldTriggerEventRule(autoConfig.onQuestionRejected, summary || \"question rejected\")) return\n await queueTrigger(sessionID, {\n source: \"question.rejected\",\n force: autoConfig.onQuestionRejected.force,\n detail: summary || \"question rejected\",\n })\n }\n },\n }\n}\n\nexport default PlanpilotPlugin\n\nfunction containsForbiddenFlags(argv: string[]): boolean {\n return argv.some((token) => {\n if (token === \"--cwd\" || token === \"--session-id\") return true\n if (token.startsWith(\"--cwd=\") || token.startsWith(\"--session-id=\")) return true\n return false\n })\n}\n","import fs from \"fs\"\nimport { openDatabase, resolvePlanMarkdownPath, ensureParentDir } from \"./lib/db\"\nimport { PlanpilotApp } from \"./lib/app\"\nimport {\n createEmptyStatusChanges,\n statusChangesEmpty,\n type GoalStatus,\n type PlanOrder,\n type PlanStatus,\n type StepExecutor,\n type StepStatus,\n} from \"./lib/models\"\nimport { AppError, invalidInput } from \"./lib/errors\"\nimport { ensureNonEmpty, projectMatchesPath, resolveMaybeRealpath } from \"./lib/util\"\nimport { formatGoalDetail, formatPlanDetail, formatPlanMarkdown, formatStepDetail } from \"./lib/format\"\nimport { PLANPILOT_HELP_TEXT } from \"./prompt\"\n\nconst DEFAULT_PAGE = 1\nconst DEFAULT_LIMIT = 20\n\nexport type CommandIO = {\n log: (...args: any[]) => void\n}\n\nexport type CommandContext = {\n sessionId: string\n cwd: string\n}\n\nconst noopIO: CommandIO = {\n log: () => {},\n}\n\nlet currentIO: CommandIO = noopIO\n\nfunction log(...args: any[]) {\n currentIO.log(...args)\n}\n\nasync function withIO<T>(io: CommandIO, fn: () => Promise<T> | T): Promise<T> {\n const prev = currentIO\n currentIO = io\n try {\n return await fn()\n } finally {\n currentIO = prev\n }\n}\n\nexport function formatCommandError(err: unknown): string {\n if (err instanceof AppError) {\n return `Error: ${err.toDisplayString()}`\n }\n if (err instanceof Error) {\n return `Error: ${err.message}`\n }\n return `Error: ${String(err)}`\n}\n\nexport async function runCommand(argv: string[], context: CommandContext, io: CommandIO = noopIO) {\n return withIO(io, async () => {\n if (!argv.length) {\n throw invalidInput(\"missing argv\")\n }\n\n const [section, subcommand, ...args] = argv\n\n const db = openDatabase()\n const resolvedCwd = resolveMaybeRealpath(context.cwd)\n const app = new PlanpilotApp(db, context.sessionId, resolvedCwd)\n\n let planIds: number[] = []\n let shouldSync = false\n\n switch (section) {\n case \"help\": {\n if (subcommand !== undefined || args.length) {\n const rest = [subcommand, ...args].filter((x) => x !== undefined)\n throw invalidInput(`help unexpected argument: ${rest.join(\" \")}`)\n }\n log(PLANPILOT_HELP_TEXT)\n return\n }\n case \"plan\": {\n const result = await handlePlan(app, subcommand, args, { cwd: context.cwd })\n planIds = result.planIds\n shouldSync = result.shouldSync\n break\n }\n case \"step\": {\n const result = await handleStep(app, subcommand, args)\n planIds = result.planIds\n shouldSync = result.shouldSync\n break\n }\n case \"goal\": {\n const result = await handleGoal(app, subcommand, args)\n planIds = result.planIds\n shouldSync = result.shouldSync\n break\n }\n default:\n throw invalidInput(`unknown command: ${section}`)\n }\n\n if (shouldSync) {\n syncPlanMarkdown(app, planIds)\n }\n })\n}\n\nfunction requireCwd(cwd: string | undefined): string {\n if (!cwd || !cwd.trim()) {\n throw invalidInput(\"cwd is required\")\n }\n return cwd\n}\n\nexport type { CommandContext as PlanpilotCommandContext, CommandIO as PlanpilotCommandIO }\n\nasync function handlePlan(\n app: PlanpilotApp,\n subcommand: string | undefined,\n args: string[],\n context: { cwd: string | undefined },\n) {\n switch (subcommand) {\n case \"add-tree\":\n return { planIds: handlePlanAddTree(app, args), shouldSync: true }\n case \"list\":\n return { planIds: handlePlanList(app, args, context), shouldSync: false }\n case \"count\":\n return { planIds: handlePlanCount(app, args, context), shouldSync: false }\n case \"search\":\n return { planIds: handlePlanSearch(app, args, context), shouldSync: false }\n case \"show\":\n return { planIds: handlePlanShow(app, args), shouldSync: false }\n case \"export\":\n return { planIds: handlePlanExport(app, args), shouldSync: false }\n case \"comment\":\n return { planIds: handlePlanComment(app, args), shouldSync: true }\n case \"update\":\n return { planIds: handlePlanUpdate(app, args), shouldSync: true }\n case \"done\":\n return { planIds: handlePlanDone(app, args), shouldSync: true }\n case \"remove\":\n return { planIds: handlePlanRemove(app, args), shouldSync: true }\n case \"activate\":\n return { planIds: handlePlanActivate(app, args), shouldSync: true }\n case \"show-active\":\n return { planIds: handlePlanActive(app), shouldSync: false }\n case \"deactivate\":\n return { planIds: handlePlanDeactivate(app), shouldSync: true }\n default:\n throw invalidInput(`unknown plan command: ${subcommand ?? \"\"}`)\n }\n}\n\nasync function handleStep(app: PlanpilotApp, subcommand: string | undefined, args: string[]) {\n switch (subcommand) {\n case \"add\":\n return { planIds: handleStepAdd(app, args), shouldSync: true }\n case \"add-tree\":\n return { planIds: handleStepAddTree(app, args), shouldSync: true }\n case \"list\":\n return { planIds: handleStepList(app, args), shouldSync: false }\n case \"count\":\n return { planIds: handleStepCount(app, args), shouldSync: false }\n case \"show\":\n return { planIds: handleStepShow(app, args), shouldSync: false }\n case \"show-next\":\n return { planIds: handleStepShowNext(app), shouldSync: false }\n case \"wait\":\n return { planIds: handleStepWait(app, args), shouldSync: true }\n case \"comment\":\n return { planIds: handleStepComment(app, args), shouldSync: true }\n case \"update\":\n return { planIds: handleStepUpdate(app, args), shouldSync: true }\n case \"done\":\n return { planIds: handleStepDone(app, args), shouldSync: true }\n case \"move\":\n return { planIds: handleStepMove(app, args), shouldSync: true }\n case \"remove\":\n return { planIds: handleStepRemove(app, args), shouldSync: true }\n default:\n throw invalidInput(`unknown step command: ${subcommand ?? \"\"}`)\n }\n}\n\nasync function handleGoal(app: PlanpilotApp, subcommand: string | undefined, args: string[]) {\n switch (subcommand) {\n case \"add\":\n return { planIds: handleGoalAdd(app, args), shouldSync: true }\n case \"list\":\n return { planIds: handleGoalList(app, args), shouldSync: false }\n case \"count\":\n return { planIds: handleGoalCount(app, args), shouldSync: false }\n case \"show\":\n return { planIds: handleGoalShow(app, args), shouldSync: false }\n case \"comment\":\n return { planIds: handleGoalComment(app, args), shouldSync: true }\n case \"update\":\n return { planIds: handleGoalUpdate(app, args), shouldSync: true }\n case \"done\":\n return { planIds: handleGoalDone(app, args), shouldSync: true }\n case \"remove\":\n return { planIds: handleGoalRemove(app, args), shouldSync: true }\n default:\n throw invalidInput(`unknown goal command: ${subcommand ?? \"\"}`)\n }\n}\n\nfunction handlePlanAddTree(app: PlanpilotApp, args: string[]): number[] {\n const [title, content, ...rest] = args\n if (!title || content === undefined) {\n throw invalidInput(\"plan add-tree requires <title> <content> and at least one --step\")\n }\n ensureNonEmpty(\"plan title\", title)\n ensureNonEmpty(\"plan content\", content)\n const specs = parsePlanAddTreeSteps(rest)\n if (!specs.length) {\n throw invalidInput(\"plan add-tree requires at least one --step\")\n }\n const steps = specs.map((spec) => ({\n content: spec.content,\n executor: spec.executor ?? \"ai\",\n goals: spec.goals ?? [],\n }))\n const result = app.addPlanTree({ title, content }, steps)\n log(`Created plan ID: ${result.plan.id}: ${result.plan.title} (steps: ${result.stepCount}, goals: ${result.goalCount})`)\n app.setActivePlan(result.plan.id, false)\n log(`Active plan set to ${result.plan.id}: ${result.plan.title}`)\n\n // Print full detail so the AI can reference plan/step/goal IDs immediately.\n const detail = app.getPlanDetail(result.plan.id)\n log(\"\")\n log(formatPlanDetail(detail.plan, detail.steps, detail.goals))\n return [result.plan.id]\n}\n\nfunction handlePlanList(\n app: PlanpilotApp,\n args: string[],\n context: { cwd: string | undefined },\n): number[] {\n const { options, positionals } = parseOptions(args)\n if (positionals.length) {\n throw invalidInput(`plan list unexpected argument: ${positionals.join(\" \")}`)\n }\n if (options.search && options.search.length) {\n throw invalidInput(\"plan list does not accept --search\")\n }\n const allowed = new Set([\"scope\", \"status\", \"limit\", \"page\", \"order\", \"desc\", \"search\"])\n for (const key of Object.keys(options)) {\n if (!allowed.has(key)) {\n throw invalidInput(`plan list does not support --${key}`)\n }\n }\n\n const desiredStatus: PlanStatus | null = parsePlanStatusFilter(options.status)\n const cwd = requireCwd(context.cwd)\n\n const order = options.order ? parsePlanOrder(options.order) : \"updated\"\n const desc = options.desc ?? true\n let plans = app.listPlans(order, desc)\n if (!plans.length) {\n log(\"No plans found.\")\n return []\n }\n plans = plans.filter((plan) => (desiredStatus ? plan.status === desiredStatus : true))\n const scope = parseScope(options.scope)\n if (scope === \"project\") {\n const cwdValue = resolveMaybeRealpath(cwd)\n plans = plans.filter((plan) => plan.last_cwd && projectMatchesPath(plan.last_cwd, cwdValue))\n }\n if (!plans.length) {\n log(\"No plans found.\")\n return []\n }\n const pagination = resolvePagination(options, { limit: DEFAULT_LIMIT, page: DEFAULT_PAGE })\n const total = plans.length\n if (total === 0) {\n log(\"No plans found.\")\n return []\n }\n const totalPages = Math.ceil(total / pagination.limit)\n if (pagination.page > totalPages) {\n log(`Page ${pagination.page} exceeds total pages ${totalPages}.`)\n return []\n }\n const start = pagination.offset\n const end = start + pagination.limit\n plans = plans.slice(start, end)\n const details = app.getPlanDetails(plans)\n printPlanList(details)\n logPageFooter(pagination.page, pagination.limit)\n return []\n}\n\nfunction handlePlanCount(\n app: PlanpilotApp,\n args: string[],\n context: { cwd: string | undefined },\n): number[] {\n const { options, positionals } = parseOptions(args)\n if (positionals.length) {\n throw invalidInput(`plan count unexpected argument: ${positionals.join(\" \")}`)\n }\n if (options.search && options.search.length) {\n throw invalidInput(\"plan count does not accept --search\")\n }\n const allowed = new Set([\"scope\", \"status\", \"search\"])\n for (const key of Object.keys(options)) {\n if (!allowed.has(key)) {\n throw invalidInput(`plan count does not support --${key}`)\n }\n }\n\n const desiredStatus: PlanStatus | null = parsePlanStatusFilter(options.status)\n const cwd = requireCwd(context.cwd)\n\n let plans = app.listPlans()\n if (!plans.length) {\n log(\"Total: 0\")\n return []\n }\n plans = plans.filter((plan) => (desiredStatus ? plan.status === desiredStatus : true))\n const scope = parseScope(options.scope)\n if (scope === \"project\") {\n const cwdValue = resolveMaybeRealpath(cwd)\n plans = plans.filter((plan) => plan.last_cwd && projectMatchesPath(plan.last_cwd, cwdValue))\n }\n log(`Total: ${plans.length}`)\n return []\n}\n\nfunction handlePlanSearch(\n app: PlanpilotApp,\n args: string[],\n context: { cwd: string | undefined },\n): number[] {\n const { options, positionals } = parseOptions(args)\n if (positionals.length) {\n throw invalidInput(`plan search unexpected argument: ${positionals.join(\" \")}`)\n }\n if (options.search && !options.search.length) {\n throw invalidInput(\"plan search requires at least one --search\")\n }\n const desiredStatus: PlanStatus | null = parsePlanStatusFilter(options.status)\n const cwd = requireCwd(context.cwd)\n\n const order = options.order ? parsePlanOrder(options.order) : \"updated\"\n const desc = options.desc ?? true\n let plans = app.listPlans(order, desc)\n if (!plans.length) {\n log(\"No plans found.\")\n return []\n }\n plans = plans.filter((plan) => (desiredStatus ? plan.status === desiredStatus : true))\n const scope = parseScope(options.scope)\n if (scope === \"project\") {\n const cwdValue = resolveMaybeRealpath(cwd)\n plans = plans.filter((plan) => plan.last_cwd && projectMatchesPath(plan.last_cwd, cwdValue))\n }\n if (!plans.length) {\n log(\"No plans found.\")\n return []\n }\n\n const details = app.getPlanDetails(plans)\n const query = new PlanSearchQuery(options.search, options.searchMode, options.searchField, options.matchCase)\n const filtered = details.filter((detail) => planMatchesSearch(detail, query))\n if (!filtered.length) {\n log(\"No plans found.\")\n return []\n }\n const pagination = resolvePagination(options, { limit: DEFAULT_LIMIT, page: DEFAULT_PAGE })\n const totalPages = Math.ceil(filtered.length / pagination.limit)\n if (pagination.page > totalPages) {\n log(`Page ${pagination.page} exceeds total pages ${totalPages}.`)\n return []\n }\n const start = pagination.offset\n const end = start + pagination.limit\n const paged = filtered.slice(start, end)\n printPlanList(paged)\n logPageFooter(pagination.page, pagination.limit)\n return []\n}\n\nfunction handlePlanShow(app: PlanpilotApp, args: string[]): number[] {\n const id = parseIdArg(args, \"plan show\")\n const detail = app.getPlanDetail(id)\n log(formatPlanDetail(detail.plan, detail.steps, detail.goals))\n return []\n}\n\nfunction handlePlanExport(app: PlanpilotApp, args: string[]): number[] {\n if (args.length < 2) {\n throw invalidInput(\"plan export requires <id> <path>\")\n }\n const id = parseNumber(args[0], \"plan id\")\n const filePath = args[1]\n const detail = app.getPlanDetail(id)\n const active = app.getActivePlan()\n const isActive = active?.plan_id === detail.plan.id\n const activatedAt = isActive ? active?.updated_at ?? null : null\n ensureParentDir(filePath)\n const markdown = formatPlanMarkdown(isActive, activatedAt ?? null, detail.plan, detail.steps, detail.goals)\n fs.writeFileSync(filePath, markdown, \"utf8\")\n log(`Exported plan ID: ${detail.plan.id} to ${filePath}`)\n return []\n}\n\nfunction handlePlanComment(app: PlanpilotApp, args: string[]): number[] {\n const entries = parseCommentPairs(\"plan\", args)\n const planIds = app.commentPlans(entries)\n if (planIds.length === 1) {\n log(`Updated plan comment for plan ID: ${planIds[0]}.`)\n } else {\n log(`Updated plan comments for ${planIds.length} plans.`)\n }\n return planIds\n}\n\nfunction handlePlanUpdate(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"plan update requires <id>\")\n }\n const id = parseNumber(args[0], \"plan id\")\n const { options } = parseOptions(args.slice(1))\n if (options.content !== undefined) {\n ensureNonEmpty(\"plan content\", options.content)\n }\n const changes = {\n title: options.title,\n content: options.content,\n status: options.status ? parsePlanStatus(options.status) : undefined,\n comment: options.comment,\n }\n const result = app.updatePlanWithActiveClear(id, changes)\n log(`Updated plan ID: ${result.plan.id}: ${result.plan.title}`)\n if (result.cleared) {\n log(\"Active plan deactivated because plan is done.\")\n }\n if (result.plan.status === \"done\") {\n notifyPlanCompleted(result.plan.id)\n }\n return [result.plan.id]\n}\n\nfunction handlePlanDone(app: PlanpilotApp, args: string[]): number[] {\n const id = parseIdArg(args, \"plan done\")\n const result = app.updatePlanWithActiveClear(id, { status: \"done\" })\n log(`Plan ID: ${result.plan.id} marked done.`)\n if (result.cleared) {\n log(\"Active plan deactivated because plan is done.\")\n }\n if (result.plan.status === \"done\") {\n notifyPlanCompleted(result.plan.id)\n }\n return [result.plan.id]\n}\n\nfunction handlePlanRemove(app: PlanpilotApp, args: string[]): number[] {\n const id = parseIdArg(args, \"plan remove\")\n app.deletePlan(id)\n log(`Plan ID: ${id} removed.`)\n return []\n}\n\nfunction handlePlanActivate(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"plan activate requires <id>\")\n }\n const id = parseNumber(args[0], \"plan id\")\n const force = args.slice(1).includes(\"--force\")\n const plan = app.getPlan(id)\n if (plan.status === \"done\") {\n throw invalidInput(\"cannot activate plan; plan is done\")\n }\n app.setActivePlan(id, force)\n log(`Active plan set to ${plan.id}: ${plan.title}`)\n return [plan.id]\n}\n\nfunction handlePlanActive(app: PlanpilotApp): number[] {\n const active = app.getActivePlan()\n if (!active) {\n log(\"No active plan.\")\n return []\n }\n try {\n const detail = app.getPlanDetail(active.plan_id)\n log(formatPlanDetail(detail.plan, detail.steps, detail.goals))\n return []\n } catch (err) {\n if (err instanceof AppError && err.kind === \"NotFound\") {\n app.clearActivePlan()\n log(`Active plan ID: ${active.plan_id} not found.`)\n return []\n }\n throw err\n }\n}\n\nfunction handlePlanDeactivate(app: PlanpilotApp): number[] {\n const active = app.getActivePlan()\n app.clearActivePlan()\n log(\"Active plan deactivated.\")\n return active ? [active.plan_id] : []\n}\n\nfunction handleStepAdd(app: PlanpilotApp, args: string[]): number[] {\n if (args.length < 2) {\n throw invalidInput(\"step add requires <plan_id> <content...>\")\n }\n const planId = parseNumber(args[0], \"plan id\")\n const parsed = parseStepAddArgs(args.slice(1))\n if (!parsed.contents.length) {\n throw invalidInput(\"no contents provided\")\n }\n if (parsed.at !== undefined && parsed.at === 0) {\n throw invalidInput(\"position starts at 1\")\n }\n parsed.contents.forEach((content) => ensureNonEmpty(\"step content\", content))\n\n const result = app.addStepsBatch(planId, parsed.contents, \"todo\", parsed.executor ?? \"ai\", parsed.at)\n if (result.steps.length === 1) {\n log(`Created step ID: ${result.steps[0].id} for plan ID: ${result.steps[0].plan_id}`)\n } else {\n log(`Created ${result.steps.length} steps for plan ID: ${planId}`)\n }\n printStatusChanges(result.changes)\n return [planId]\n}\n\nfunction handleStepAddTree(app: PlanpilotApp, args: string[]): number[] {\n if (args.length < 2) {\n throw invalidInput(\"step add-tree requires <plan_id> <content>\")\n }\n const planId = parseNumber(args[0], \"plan id\")\n const content = args[1]\n const parsed = parseStepAddTreeArgs(args.slice(2))\n ensureNonEmpty(\"step content\", content)\n parsed.goals.forEach((goal) => ensureNonEmpty(\"goal content\", goal))\n const executor = parsed.executor ?? \"ai\"\n\n const result = app.addStepTree(planId, content, executor, parsed.goals)\n log(`Created step ID: ${result.step.id} for plan ID: ${result.step.plan_id} (goals: ${result.goals.length})`)\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n return [planId]\n}\n\nfunction handleStepList(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step list requires <plan_id>\")\n }\n const planId = parseNumber(args[0], \"plan id\")\n const { options } = parseOptions(args.slice(1))\n const allowed = new Set([\"status\", \"executor\", \"limit\", \"page\"])\n for (const key of Object.keys(options)) {\n if (key === \"search\" && Array.isArray(options.search) && options.search.length === 0) continue\n if (!allowed.has(key)) {\n throw invalidInput(`step list does not support --${key}`)\n }\n }\n const status = parseStepStatusFilter(options.status)\n const pagination = resolvePagination(options, { limit: DEFAULT_LIMIT, page: DEFAULT_PAGE })\n const countQuery = {\n status,\n executor: options.executor ? parseStepExecutor(options.executor) : undefined,\n limit: undefined,\n offset: undefined,\n order: undefined,\n desc: undefined,\n }\n const total = app.countSteps(planId, countQuery)\n if (total === 0) {\n log(`No steps found for plan ID: ${planId}.`)\n return []\n }\n const totalPages = Math.ceil(total / pagination.limit)\n if (pagination.page > totalPages) {\n log(`Page ${pagination.page} exceeds total pages ${totalPages} for plan ID: ${planId}.`)\n return []\n }\n\n const query = {\n status,\n executor: options.executor ? parseStepExecutor(options.executor) : undefined,\n limit: pagination.limit,\n offset: pagination.offset,\n order: \"order\" as const,\n desc: false,\n }\n\n const steps = app.listStepsFiltered(planId, query)\n const details = app.getStepsDetail(steps)\n printStepList(details)\n logPageFooter(pagination.page, pagination.limit)\n return []\n}\n\nfunction handleStepCount(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step count requires <plan_id>\")\n }\n const planId = parseNumber(args[0], \"plan id\")\n const { options } = parseOptions(args.slice(1))\n const allowed = new Set([\"status\", \"executor\"])\n for (const key of Object.keys(options)) {\n if (key === \"search\" && Array.isArray(options.search) && options.search.length === 0) continue\n if (!allowed.has(key)) {\n throw invalidInput(`step count does not support --${key}`)\n }\n }\n const status = parseStepStatusFilter(options.status)\n const query = {\n status,\n executor: options.executor ? parseStepExecutor(options.executor) : undefined,\n limit: undefined,\n offset: undefined,\n order: undefined,\n desc: undefined,\n }\n const total = app.countSteps(planId, query)\n log(`Total: ${total}`)\n return []\n}\n\nfunction handleStepShow(app: PlanpilotApp, args: string[]): number[] {\n const id = parseIdArg(args, \"step show\")\n const detail = app.getStepDetail(id)\n log(formatStepDetail(detail.step, detail.goals))\n return []\n}\n\nfunction handleStepShowNext(app: PlanpilotApp): number[] {\n const active = app.getActivePlan()\n if (!active) {\n log(\"No active plan.\")\n return []\n }\n const next = app.nextStep(active.plan_id)\n if (!next) {\n log(\"No pending step.\")\n return []\n }\n const goals = app.goalsForStep(next.id)\n log(formatStepDetail(next, goals))\n return []\n}\n\nfunction handleStepWait(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step wait requires <id>\")\n }\n const stepId = parseNumber(args[0], \"step id\")\n const options = parseOptions(args.slice(1)).options\n if (options.clear) {\n const result = app.clearStepWait(stepId)\n log(`Step ID: ${result.step.id} wait cleared.`)\n return [result.step.plan_id]\n }\n if (options.delay === undefined) {\n throw invalidInput(\"step wait requires --delay <ms> or --clear\")\n }\n const delayMs = parseNumber(options.delay, \"delay\")\n if (delayMs < 0) {\n throw invalidInput(\"delay must be >= 0\")\n }\n const reason = options.reason ? String(options.reason) : undefined\n const result = app.setStepWait(stepId, delayMs, reason)\n log(`Step ID: ${result.step.id} waiting until ${result.until}.`)\n return [result.step.plan_id]\n}\n\nfunction handleStepUpdate(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step update requires <id>\")\n }\n const id = parseNumber(args[0], \"step id\")\n const { options } = parseOptions(args.slice(1))\n if (options.content !== undefined) {\n ensureNonEmpty(\"step content\", options.content)\n }\n const status = options.status ? parseStepStatus(options.status) : undefined\n const result = app.updateStep(id, {\n content: options.content,\n status,\n executor: options.executor ? parseStepExecutor(options.executor) : undefined,\n comment: options.comment,\n })\n log(`Updated step ID: ${result.step.id}.`)\n printStatusChanges(result.changes)\n if (status === \"done\" && result.step.status === \"done\") {\n notifyNextStepForPlan(app, result.step.plan_id)\n }\n notifyPlansCompleted(app, result.changes)\n return [result.step.plan_id]\n}\n\nfunction handleStepComment(app: PlanpilotApp, args: string[]): number[] {\n const entries = parseCommentPairs(\"step\", args)\n const planIds = app.commentSteps(entries)\n if (planIds.length === 1) {\n log(`Updated step comments for plan ID: ${planIds[0]}.`)\n } else {\n log(`Updated step comments for ${planIds.length} plans.`)\n }\n return planIds\n}\n\nfunction handleStepDone(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step done requires <id>\")\n }\n const id = parseNumber(args[0], \"step id\")\n const allGoals = args.slice(1).includes(\"--all-goals\")\n const result = app.setStepDoneWithGoals(id, allGoals)\n log(`Step ID: ${result.step.id} marked done.`)\n printStatusChanges(result.changes)\n notifyNextStepForPlan(app, result.step.plan_id)\n notifyPlansCompleted(app, result.changes)\n return [result.step.plan_id]\n}\n\nfunction handleStepMove(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"step move requires <id> --to <pos>\")\n }\n const id = parseNumber(args[0], \"step id\")\n const toIndex = args.indexOf(\"--to\")\n if (toIndex === -1 || toIndex === args.length - 1) {\n throw invalidInput(\"step move requires --to <pos>\")\n }\n const to = parseNumber(args[toIndex + 1], \"position\")\n if (to === 0) {\n throw invalidInput(\"position starts at 1\")\n }\n const steps = app.moveStep(id, to)\n log(`Reordered steps for plan ID: ${steps[0].plan_id}:`)\n const details = app.getStepsDetail(steps)\n printStepList(details)\n return [steps[0].plan_id]\n}\n\nfunction handleStepRemove(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"no step ids provided\")\n }\n const ids = args.map((arg) => parseNumber(arg, \"step id\"))\n const planIds = app.planIdsForSteps(ids)\n const result = app.deleteSteps(ids)\n if (ids.length === 1) {\n log(`Step ID: ${ids[0]} removed.`)\n } else {\n log(`Removed ${result.deleted} steps.`)\n }\n printStatusChanges(result.changes)\n return planIds\n}\n\nfunction handleGoalAdd(app: PlanpilotApp, args: string[]): number[] {\n if (args.length < 2) {\n throw invalidInput(\"goal add requires <step_id> <content...>\")\n }\n const stepId = parseNumber(args[0], \"step id\")\n const contents = args.slice(1)\n if (!contents.length) {\n throw invalidInput(\"no contents provided\")\n }\n contents.forEach((content) => ensureNonEmpty(\"goal content\", content))\n const result = app.addGoalsBatch(stepId, contents, \"todo\")\n if (result.goals.length === 1) {\n log(`Created goal ID: ${result.goals[0].id} for step ID: ${result.goals[0].step_id}`)\n } else {\n log(`Created ${result.goals.length} goals for step ID: ${stepId}`)\n }\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n const step = app.getStep(stepId)\n return [step.plan_id]\n}\n\nfunction handleGoalList(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"goal list requires <step_id>\")\n }\n const stepId = parseNumber(args[0], \"step id\")\n const { options } = parseOptions(args.slice(1))\n const status = parseGoalStatusFilter(options.status)\n const pagination = resolvePagination(options, { limit: DEFAULT_LIMIT, page: DEFAULT_PAGE })\n const countQuery = {\n status,\n limit: undefined,\n offset: undefined,\n }\n const total = app.countGoals(stepId, countQuery)\n if (total === 0) {\n log(`No goals found for step ID: ${stepId}.`)\n return []\n }\n const totalPages = Math.ceil(total / pagination.limit)\n if (pagination.page > totalPages) {\n log(`Page ${pagination.page} exceeds total pages ${totalPages} for step ID: ${stepId}.`)\n return []\n }\n\n const query = {\n status,\n limit: pagination.limit,\n offset: pagination.offset,\n }\n\n const goals = app.listGoalsFiltered(stepId, query)\n printGoalList(goals)\n logPageFooter(pagination.page, pagination.limit)\n return []\n}\n\nfunction handleGoalCount(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"goal count requires <step_id>\")\n }\n const stepId = parseNumber(args[0], \"step id\")\n const { options } = parseOptions(args.slice(1))\n const status = parseGoalStatusFilter(options.status)\n const query = {\n status,\n limit: undefined,\n offset: undefined,\n }\n const total = app.countGoals(stepId, query)\n log(`Total: ${total}`)\n return []\n}\n\nfunction handleGoalShow(app: PlanpilotApp, args: string[]): number[] {\n const id = parseIdArg(args, \"goal show\")\n const detail = app.getGoalDetail(id)\n log(formatGoalDetail(detail.goal, detail.step))\n return []\n}\n\nfunction handleGoalComment(app: PlanpilotApp, args: string[]): number[] {\n const entries = parseCommentPairs(\"goal\", args)\n const planIds = app.commentGoals(entries)\n if (planIds.length === 1) {\n log(`Updated goal comments for plan ID: ${planIds[0]}.`)\n } else {\n log(`Updated goal comments for ${planIds.length} plans.`)\n }\n return planIds\n}\n\nfunction handleGoalUpdate(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"goal update requires <id>\")\n }\n const id = parseNumber(args[0], \"goal id\")\n const { options } = parseOptions(args.slice(1))\n if (options.content !== undefined) {\n ensureNonEmpty(\"goal content\", options.content)\n }\n const result = app.updateGoal(id, {\n content: options.content,\n status: options.status ? parseGoalStatus(options.status) : undefined,\n comment: options.comment,\n })\n log(`Updated goal ${result.goal.id}.`)\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n const step = app.getStep(result.goal.step_id)\n return [step.plan_id]\n}\n\nfunction handleGoalDone(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"goal done requires <id>\")\n }\n const ids = args.map((arg) => parseNumber(arg, \"goal id\"))\n if (ids.length === 1) {\n const result = app.setGoalStatus(ids[0], \"done\")\n log(`Goal ID: ${result.goal.id} marked done.`)\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n const step = app.getStep(result.goal.step_id)\n return [step.plan_id]\n }\n const planIds = app.planIdsForGoals(ids)\n const result = app.setGoalsStatus(ids, \"done\")\n log(`Goals marked done: ${result.updated}.`)\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n return planIds\n}\n\nfunction handleGoalRemove(app: PlanpilotApp, args: string[]): number[] {\n if (!args.length) {\n throw invalidInput(\"no goal ids provided\")\n }\n const ids = args.map((arg) => parseNumber(arg, \"goal id\"))\n const planIds = app.planIdsForGoals(ids)\n const result = app.deleteGoals(ids)\n if (ids.length === 1) {\n log(`Goal ID: ${ids[0]} removed.`)\n } else {\n log(`Removed ${result.deleted} goals.`)\n }\n printStatusChanges(result.changes)\n notifyAfterStepChanges(app, result.changes)\n notifyPlansCompleted(app, result.changes)\n return planIds\n}\n\nfunction parseIdArg(args: string[], label: string): number {\n if (!args.length) {\n throw invalidInput(`${label} requires <id>`) \n }\n return parseNumber(args[0], \"id\")\n}\n\nfunction parseNumber(value: string, label: string): number {\n const num = Number(value)\n if (!Number.isFinite(num) || !Number.isInteger(num)) {\n throw invalidInput(`${label} '${value}' is invalid`)\n }\n return num\n}\n\nfunction parseOptions(args: string[]) {\n const options: Record<string, any> = { search: [] }\n const positionals: string[] = []\n let i = 0\n while (i < args.length) {\n const token = args[i]\n if (!token.startsWith(\"--\")) {\n positionals.push(token)\n i += 1\n continue\n }\n switch (token) {\n case \"--scope\":\n options.scope = expectValue(args, i, token)\n i += 2\n break\n case \"--match-case\":\n options.matchCase = true\n i += 1\n break\n case \"--desc\":\n options.desc = true\n i += 1\n break\n case \"--all-goals\":\n options.allGoals = true\n i += 1\n break\n case \"--force\":\n options.force = true\n i += 1\n break\n case \"--search\":\n options.search.push(expectValue(args, i, token))\n i += 2\n break\n case \"--search-mode\":\n options.searchMode = expectValue(args, i, token)\n i += 2\n break\n case \"--search-field\":\n options.searchField = expectValue(args, i, token)\n i += 2\n break\n case \"--title\":\n options.title = expectValue(args, i, token)\n i += 2\n break\n case \"--content\":\n options.content = expectValue(args, i, token)\n i += 2\n break\n case \"--status\":\n options.status = expectValue(args, i, token)\n i += 2\n break\n case \"--comment\":\n options.comment = expectValue(args, i, token)\n i += 2\n break\n case \"--executor\":\n options.executor = expectValue(args, i, token)\n i += 2\n break\n case \"--limit\":\n options.limit = expectValue(args, i, token)\n i += 2\n break\n case \"--page\":\n options.page = expectValue(args, i, token)\n i += 2\n break\n case \"--order\":\n options.order = expectValue(args, i, token)\n i += 2\n break\n case \"--to\":\n options.to = expectValue(args, i, token)\n i += 2\n break\n case \"--delay\":\n options.delay = expectValue(args, i, token)\n i += 2\n break\n case \"--reason\":\n options.reason = expectValue(args, i, token)\n i += 2\n break\n case \"--clear\":\n options.clear = true\n i += 1\n break\n case \"--goal\":\n if (!options.goals) options.goals = []\n options.goals.push(expectValue(args, i, token))\n i += 2\n break\n default:\n throw invalidInput(`unexpected argument: ${token}`)\n }\n\n }\n return { options, positionals }\n}\n\nfunction expectValue(args: string[], index: number, token: string): string {\n const value = args[index + 1]\n if (value === undefined) {\n throw invalidInput(`${token} requires a value`)\n }\n return value\n}\n\nfunction parsePlanStatus(value: string): PlanStatus {\n const normalized = value.trim().toLowerCase()\n if (normalized === \"todo\" || normalized === \"done\") return normalized\n throw invalidInput(`invalid status '${value}', expected todo|done`)\n}\n\nfunction parsePlanStatusFilter(value?: string): PlanStatus | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (normalized === \"all\") return null\n return parsePlanStatus(normalized)\n}\n\nfunction parseStepStatus(value: string): StepStatus {\n return parsePlanStatus(value) as StepStatus\n}\n\nfunction parseGoalStatus(value: string): GoalStatus {\n return parsePlanStatus(value) as GoalStatus\n}\n\nfunction parseStepStatusFilter(value?: string): StepStatus | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (normalized === \"all\") return null\n return parseStepStatus(normalized)\n}\n\nfunction parseGoalStatusFilter(value?: string): GoalStatus | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (normalized === \"all\") return null\n return parseGoalStatus(normalized)\n}\n\nfunction parseScope(value?: string): \"project\" | \"all\" {\n if (!value) return \"project\"\n const normalized = value.trim().toLowerCase()\n if (normalized === \"project\" || normalized === \"all\") return normalized as \"project\" | \"all\"\n throw invalidInput(`invalid scope '${value}', expected project|all`)\n}\n\nfunction parsePlanOrder(value: string): PlanOrder {\n const normalized = value.trim().toLowerCase()\n if (normalized === \"id\" || normalized === \"title\" || normalized === \"created\" || normalized === \"updated\") {\n return normalized as PlanOrder\n }\n throw invalidInput(`invalid order '${value}', expected id|title|created|updated`)\n}\n\nfunction parseStepExecutor(value: string): StepExecutor {\n const normalized = value.trim().toLowerCase()\n if (normalized === \"ai\" || normalized === \"human\") return normalized\n throw invalidInput(`invalid executor '${value}', expected ai|human`)\n}\n\nfunction resolvePagination(\n options: Record<string, any>,\n defaults: { limit: number; page: number },\n): { limit: number; page: number; offset: number } {\n if (defaults.limit <= 0 || defaults.page < 1) {\n throw invalidInput(\"invalid default pagination configuration\")\n }\n\n const limit = options.limit !== undefined ? parseNumber(options.limit, \"limit\") : defaults.limit\n if (limit <= 0) {\n throw invalidInput(\"limit must be >= 1\")\n }\n\n const page = options.page !== undefined ? parseNumber(options.page, \"page\") : defaults.page\n if (page < 1) {\n throw invalidInput(\"page must be >= 1\")\n }\n\n return { limit, page, offset: (page - 1) * limit }\n}\n\ntype PlanSearchMode = \"any\" | \"all\"\ntype PlanSearchField = \"plan\" | \"title\" | \"content\" | \"comment\" | \"steps\" | \"goals\" | \"all\"\n\nclass PlanSearchQuery {\n terms: string[]\n mode: PlanSearchMode\n field: PlanSearchField\n matchCase: boolean\n\n constructor(rawTerms: string[] = [], searchMode?: string, searchField?: string, matchCase?: boolean) {\n let terms = rawTerms.map((term) => term.trim()).filter((term) => term.length > 0)\n const caseSensitive = !!matchCase\n if (!caseSensitive) {\n terms = terms.map((term) => term.toLowerCase())\n }\n this.terms = terms\n this.mode = parseSearchMode(searchMode)\n this.field = parseSearchField(searchField)\n this.matchCase = caseSensitive\n }\n\n hasTerms() {\n return this.terms.length > 0\n }\n}\n\nfunction parseSearchMode(value?: string): PlanSearchMode {\n if (!value) return \"all\"\n const normalized = value.trim().toLowerCase()\n if (normalized === \"any\" || normalized === \"all\") return normalized\n throw invalidInput(`invalid search mode '${value}', expected any|all`)\n}\n\nfunction parseSearchField(value?: string): PlanSearchField {\n if (!value) return \"plan\"\n const normalized = value.trim().toLowerCase()\n if ([\"plan\", \"title\", \"content\", \"comment\", \"steps\", \"goals\", \"all\"].includes(normalized)) {\n return normalized as PlanSearchField\n }\n throw invalidInput(\n `invalid search field '${value}', expected plan|title|content|comment|steps|goals|all`\n )\n}\n\nfunction planMatchesSearch(detail: ReturnType<PlanpilotApp[\"getPlanDetail\"]>, search: PlanSearchQuery): boolean {\n const haystacks: string[] = []\n const addValue = (value: string) => {\n haystacks.push(search.matchCase ? value : value.toLowerCase())\n }\n\n const includePlan = search.field === \"plan\" || search.field === \"all\"\n const includeTitle = search.field === \"title\" || includePlan || search.field === \"all\"\n const includeContent = search.field === \"content\" || includePlan || search.field === \"all\"\n const includeComment = search.field === \"comment\" || includePlan || search.field === \"all\"\n const includeSteps = search.field === \"steps\" || search.field === \"all\"\n const includeGoals = search.field === \"goals\" || search.field === \"all\"\n\n if (includePlan || includeTitle) addValue(detail.plan.title)\n if (includePlan || includeContent) addValue(detail.plan.content)\n if (includePlan || includeComment) {\n if (detail.plan.comment) addValue(detail.plan.comment)\n }\n if (includeSteps) {\n detail.steps.forEach((step) => addValue(step.content))\n }\n if (includeGoals) {\n detail.goals.forEach((goalList) => goalList.forEach((goal) => addValue(goal.content)))\n }\n\n if (!haystacks.length) return false\n if (search.mode === \"any\") {\n return search.terms.some((term) => haystacks.some((value) => value.includes(term)))\n }\n return search.terms.every((term) => haystacks.some((value) => value.includes(term)))\n}\n\nfunction parsePlanAddTreeSteps(args: string[]) {\n if (!args.length) {\n throw invalidInput(\"plan add-tree requires at least one --step\")\n }\n\n const steps: Array<{ content: string; executor?: StepExecutor; goals?: string[] }> = []\n let current: { content: string; executor?: StepExecutor; goals: string[] } | null = null\n let i = 0\n while (i < args.length) {\n const token = args[i]\n if (token === \"--\") {\n i += 1\n continue\n }\n if (token === \"--step\") {\n const value = args[i + 1]\n if (value === undefined) {\n throw invalidInput(\"plan add-tree --step requires a value\")\n }\n if (!value.trim()) {\n throw invalidInput(\"plan add-tree --step cannot be empty\")\n }\n if (current) {\n steps.push({ content: current.content, executor: current.executor, goals: current.goals.length ? current.goals : undefined })\n }\n current = { content: value, goals: [] }\n i += 2\n continue\n }\n if (token === \"--executor\") {\n const value = args[i + 1]\n if (value === undefined) {\n throw invalidInput(\"plan add-tree --executor requires a value\")\n }\n if (!current) {\n throw invalidInput(\"plan add-tree --executor must follow a --step\")\n }\n current.executor = parseStepExecutor(value)\n i += 2\n continue\n }\n if (token === \"--goal\") {\n const value = args[i + 1]\n if (value === undefined) {\n throw invalidInput(\"plan add-tree --goal requires a value\")\n }\n if (!current) {\n throw invalidInput(\"plan add-tree --goal must follow a --step\")\n }\n current.goals.push(value)\n i += 2\n continue\n }\n throw invalidInput(`plan add-tree unexpected argument: ${token}`)\n }\n\n if (current) {\n steps.push({ content: current.content, executor: current.executor, goals: current.goals.length ? current.goals : undefined })\n }\n\n if (!steps.length) {\n throw invalidInput(\"plan add-tree requires at least one --step\")\n }\n return steps\n}\n\nfunction parseCommentPairs(kind: string, pairs: string[]): Array<[number, string]> {\n if (!pairs.length) {\n throw invalidInput(`${kind} comment requires <id> <comment> pairs`)\n }\n if (pairs.length % 2 !== 0) {\n throw invalidInput(`${kind} comment expects <id> <comment> pairs`)\n }\n const entries: Array<[number, string]> = []\n for (let i = 0; i < pairs.length; i += 2) {\n const idValue = pairs[i]\n const comment = pairs[i + 1]\n const id = parseNumber(idValue, `${kind} comment id`)\n ensureNonEmpty(\"comment\", comment)\n entries.push([id, comment])\n }\n return entries\n}\n\nfunction parseStepAddArgs(args: string[]) {\n const contents: string[] = []\n let executor: StepExecutor | undefined\n let at: number | undefined\n let i = 0\n while (i < args.length) {\n const token = args[i]\n if (token === \"--executor\") {\n const value = expectValue(args, i, token)\n executor = parseStepExecutor(value)\n i += 2\n continue\n }\n if (token === \"--at\") {\n const value = expectValue(args, i, token)\n at = parseNumber(value, \"position\")\n i += 2\n continue\n }\n if (token.startsWith(\"--\")) {\n throw invalidInput(`unexpected argument: ${token}`)\n }\n contents.push(token)\n i += 1\n }\n return { contents, executor, at }\n}\n\nfunction parseStepAddTreeArgs(args: string[]) {\n let executor: StepExecutor | undefined\n const goals: string[] = []\n let i = 0\n while (i < args.length) {\n const token = args[i]\n if (token === \"--executor\") {\n const value = expectValue(args, i, token)\n executor = parseStepExecutor(value)\n i += 2\n continue\n }\n if (token === \"--goal\") {\n const value = expectValue(args, i, token)\n goals.push(value)\n i += 2\n continue\n }\n throw invalidInput(`unexpected argument: ${token}`)\n }\n return { executor, goals }\n}\n\nfunction printStatusChanges(changes: ReturnType<typeof createEmptyStatusChanges>) {\n if (statusChangesEmpty(changes)) return\n log(\"Auto status updates:\")\n changes.steps.forEach((change) => {\n log(`- Step ID: ${change.step_id} status auto-updated from ${change.from} to ${change.to} (${change.reason}).`)\n })\n changes.plans.forEach((change) => {\n log(`- Plan ID: ${change.plan_id} status auto-updated from ${change.from} to ${change.to} (${change.reason}).`)\n })\n changes.active_plans_cleared.forEach((change) => {\n log(`- Active plan deactivated for plan ID: ${change.plan_id} (${change.reason}).`)\n })\n}\n\nfunction notifyAfterStepChanges(app: PlanpilotApp, changes: ReturnType<typeof createEmptyStatusChanges>) {\n const planIds = new Set<number>()\n changes.steps.forEach((change) => {\n if (change.to === \"done\") {\n const step = app.getStep(change.step_id)\n planIds.add(step.plan_id)\n }\n })\n planIds.forEach((planId) => notifyNextStepForPlan(app, planId))\n}\n\nfunction notifyPlansCompleted(app: PlanpilotApp, changes: ReturnType<typeof createEmptyStatusChanges>) {\n const planIds = new Set<number>()\n changes.plans.forEach((change) => {\n if (change.to === \"done\") planIds.add(change.plan_id)\n })\n planIds.forEach((planId) => {\n const plan = app.getPlan(planId)\n if (plan.status === \"done\") {\n notifyPlanCompleted(plan.id)\n }\n })\n}\n\nfunction notifyPlanCompleted(planId: number) {\n log(`Plan ID: ${planId} is complete. Summarize the completed results to the user, then end this turn.`)\n}\n\nfunction notifyNextStepForPlan(app: PlanpilotApp, planId: number) {\n const next = app.nextStep(planId)\n if (!next) return\n if (next.executor === \"ai\") {\n log(`Next step is assigned to ai (step ID: ${next.id}). Please end this turn so Planpilot can surface it.`)\n return\n }\n const goals = app.goalsForStep(next.id)\n log(\"Next step requires human action:\")\n log(formatStepDetail(next, goals))\n log(\n \"Tell the user to complete the above step and goals. Confirm each goal when done, then end this turn.\"\n )\n}\n\nconst COL_ID = 6\nconst COL_STAT = 6\nconst COL_STEPS = 9\nconst COL_ORDER = 5\nconst COL_EXEC = 6\nconst COL_GOALS = 9\nconst COL_TEXT = 30\n\nfunction printPlanList(details: ReturnType<PlanpilotApp[\"getPlanDetails\"]>) {\n log(`${pad(\"ID\", COL_ID)} ${pad(\"STAT\", COL_STAT)} ${pad(\"STEPS\", COL_STEPS)} ${pad(\"TITLE\", COL_TEXT)} COMMENT`)\n details.forEach((detail) => {\n const total = detail.steps.length\n const done = detail.steps.filter((step) => step.status === \"done\").length\n log(\n `${pad(String(detail.plan.id), COL_ID)} ${pad(detail.plan.status, COL_STAT)} ${pad(`${done}/${total}`, COL_STEPS)} ${pad(detail.plan.title, COL_TEXT)} ${detail.plan.comment ?? \"\"}`\n )\n })\n}\n\nfunction printStepList(details: ReturnType<PlanpilotApp[\"getStepsDetail\"]>) {\n log(\n `${pad(\"ID\", COL_ID)} ${pad(\"STAT\", COL_STAT)} ${pad(\"ORD\", COL_ORDER)} ${pad(\"EXEC\", COL_EXEC)} ${pad(\"GOALS\", COL_GOALS)} ${pad(\"CONTENT\", COL_TEXT)} COMMENT`\n )\n details.forEach((detail) => {\n const total = detail.goals.length\n const done = detail.goals.filter((goal) => goal.status === \"done\").length\n log(\n `${pad(String(detail.step.id), COL_ID)} ${pad(detail.step.status, COL_STAT)} ${pad(String(detail.step.sort_order), COL_ORDER)} ${pad(detail.step.executor, COL_EXEC)} ${pad(`${done}/${total}`, COL_GOALS)} ${pad(detail.step.content, COL_TEXT)} ${detail.step.comment ?? \"\"}`\n )\n })\n}\n\nfunction printGoalList(goals: ReturnType<PlanpilotApp[\"listGoalsFiltered\"]>) {\n log(`${pad(\"ID\", COL_ID)} ${pad(\"STAT\", COL_STAT)} ${pad(\"CONTENT\", COL_TEXT)} COMMENT`)\n goals.forEach((goal) => {\n log(`${pad(String(goal.id), COL_ID)} ${pad(goal.status, COL_STAT)} ${pad(goal.content, COL_TEXT)} ${goal.comment ?? \"\"}`)\n })\n}\n\nfunction logPageFooter(page: number, limit: number) {\n log(`Page ${page} / Limit ${limit}`)\n}\n\nfunction pad(value: string, width: number) {\n if (value.length >= width) return value\n return value.padEnd(width, \" \")\n}\n\nfunction syncPlanMarkdown(app: PlanpilotApp, planIds: number[]) {\n if (!planIds.length) return\n const unique = Array.from(new Set(planIds))\n const active = app.getActivePlan()\n const activeId = active?.plan_id\n const activeUpdated = active?.updated_at ?? null\n\n unique.forEach((planId) => {\n let detail\n try {\n detail = app.getPlanDetail(planId)\n } catch (err) {\n if (err instanceof AppError && err.kind === \"NotFound\") return\n throw err\n }\n const isActive = activeId === planId\n const activatedAt = isActive ? activeUpdated : null\n const mdPath = resolvePlanMarkdownPath(planId)\n ensureParentDir(mdPath)\n const markdown = formatPlanMarkdown(isActive, activatedAt, detail.plan, detail.steps, detail.goals)\n fs.writeFileSync(mdPath, markdown, \"utf8\")\n })\n}\n","import fs from \"fs\"\nimport path from \"path\"\nimport os from \"os\"\nimport { Database } from \"bun:sqlite\"\nimport { xdgConfig } from \"xdg-basedir\"\n\nexport type DatabaseConnection = Database\n\nlet cachedDb: Database | null = null\n\nexport function resolveConfigRoot(): string {\n if (process.env.OPENCODE_CONFIG_DIR) {\n return process.env.OPENCODE_CONFIG_DIR\n }\n const base = xdgConfig ?? path.join(os.homedir(), \".config\")\n return path.join(base, \"opencode\")\n}\n\nexport function resolvePlanpilotDir(): string {\n const override = process.env.OPENCODE_PLANPILOT_DIR || process.env.OPENCODE_PLANPILOT_HOME\n if (override && override.trim()) return override\n return path.join(resolveConfigRoot(), \".planpilot\")\n}\n\nexport function resolveDbPath(): string {\n return path.join(resolvePlanpilotDir(), \"planpilot.db\")\n}\n\nexport function resolvePlanMarkdownDir(): string {\n return path.join(resolvePlanpilotDir(), \"plans\")\n}\n\nexport function resolvePlanMarkdownPath(planId: number): string {\n return path.join(resolvePlanMarkdownDir(), `plan_${planId}.md`)\n}\n\nexport function ensureParentDir(filePath: string) {\n const dir = path.dirname(filePath)\n fs.mkdirSync(dir, { recursive: true })\n}\n\nexport function openDatabase(): Database {\n if (cachedDb) return cachedDb\n const dbPath = resolveDbPath()\n ensureParentDir(dbPath)\n const db = new Database(dbPath)\n db.exec(\"PRAGMA foreign_keys = ON;\")\n ensureSchema(db)\n cachedDb = db\n return db\n}\n\nexport function ensureSchema(db: Database) {\n db.exec(`\n CREATE TABLE IF NOT EXISTS plans (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n title TEXT NOT NULL,\n content TEXT NOT NULL,\n status TEXT NOT NULL,\n comment TEXT,\n last_session_id TEXT,\n last_cwd TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS steps (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n plan_id INTEGER NOT NULL,\n content TEXT NOT NULL,\n status TEXT NOT NULL,\n executor TEXT NOT NULL,\n sort_order INTEGER NOT NULL,\n comment TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(plan_id) REFERENCES plans(id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS goals (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n step_id INTEGER NOT NULL,\n content TEXT NOT NULL,\n status TEXT NOT NULL,\n comment TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY(step_id) REFERENCES steps(id) ON DELETE CASCADE\n );\n CREATE TABLE IF NOT EXISTS active_plan (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n session_id TEXT NOT NULL,\n plan_id INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n UNIQUE(session_id),\n UNIQUE(plan_id),\n FOREIGN KEY(plan_id) REFERENCES plans(id) ON DELETE CASCADE\n );\n CREATE INDEX IF NOT EXISTS idx_steps_plan_order ON steps(plan_id, sort_order);\n CREATE INDEX IF NOT EXISTS idx_goals_step ON goals(step_id);\n `)\n\n const columns = db\n .prepare(\"PRAGMA table_info(plans)\")\n .all()\n .map((row: any) => row.name as string)\n if (!columns.includes(\"last_cwd\")) {\n db.exec(\"ALTER TABLE plans ADD COLUMN last_cwd TEXT\")\n }\n}\n","export type PlanStatus = \"todo\" | \"done\"\nexport type StepStatus = \"todo\" | \"done\"\nexport type GoalStatus = \"todo\" | \"done\"\nexport type StepExecutor = \"ai\" | \"human\"\n\nexport interface PlanRow {\n id: number\n title: string\n content: string\n status: PlanStatus\n comment: string | null\n last_session_id: string | null\n last_cwd: string | null\n created_at: number\n updated_at: number\n}\n\nexport interface StepRow {\n id: number\n plan_id: number\n content: string\n status: StepStatus\n executor: StepExecutor\n sort_order: number\n comment: string | null\n created_at: number\n updated_at: number\n}\n\nexport interface GoalRow {\n id: number\n step_id: number\n content: string\n status: GoalStatus\n comment: string | null\n created_at: number\n updated_at: number\n}\n\nexport interface ActivePlanRow {\n id: number\n session_id: string\n plan_id: number\n updated_at: number\n}\n\nexport interface PlanDetail {\n plan: PlanRow\n steps: StepRow[]\n goals: Map<number, GoalRow[]>\n}\n\nexport interface StepDetail {\n step: StepRow\n goals: GoalRow[]\n}\n\nexport interface GoalDetail {\n goal: GoalRow\n step: StepRow\n}\n\nexport interface StepInput {\n content: string\n executor: StepExecutor\n goals: string[]\n}\n\nexport interface StepStatusChange {\n step_id: number\n from: string\n to: string\n reason: string\n}\n\nexport interface PlanStatusChange {\n plan_id: number\n from: string\n to: string\n reason: string\n}\n\nexport interface ActivePlanCleared {\n plan_id: number\n reason: string\n}\n\nexport interface StatusChanges {\n steps: StepStatusChange[]\n plans: PlanStatusChange[]\n active_plans_cleared: ActivePlanCleared[]\n}\n\nexport interface PlanChanges {\n title?: string\n content?: string\n status?: PlanStatus\n comment?: string\n}\n\nexport interface StepChanges {\n content?: string\n status?: StepStatus\n executor?: StepExecutor\n comment?: string\n}\n\nexport interface GoalChanges {\n content?: string\n status?: GoalStatus\n comment?: string\n}\n\nexport type PlanOrder = \"id\" | \"title\" | \"created\" | \"updated\"\nexport type StepOrder = \"order\" | \"id\" | \"created\" | \"updated\"\n\nexport interface StepQuery {\n status?: StepStatus | null\n executor?: StepExecutor | null\n limit?: number\n offset?: number\n order?: StepOrder\n desc?: boolean\n}\n\nexport interface GoalQuery {\n status?: GoalStatus | null\n limit?: number\n offset?: number\n}\n\nexport function createEmptyStatusChanges(): StatusChanges {\n return { steps: [], plans: [], active_plans_cleared: [] }\n}\n\nexport function mergeStatusChanges(target: StatusChanges, other: StatusChanges) {\n target.steps.push(...other.steps)\n target.plans.push(...other.plans)\n target.active_plans_cleared.push(...other.active_plans_cleared)\n}\n\nexport function statusChangesEmpty(changes: StatusChanges) {\n return !changes.steps.length && !changes.plans.length && !changes.active_plans_cleared.length\n}\n","import fs from \"fs\"\nimport path from \"path\"\nimport { invalidInput } from \"./errors\"\n\nexport function ensureNonEmpty(label: string, value: string) {\n if (value.trim().length === 0) {\n throw invalidInput(`${label} cannot be empty`)\n }\n}\n\nexport function formatDateTimeUTC(timestamp: number): string {\n const date = new Date(timestamp)\n const yyyy = date.getUTCFullYear()\n const mm = String(date.getUTCMonth() + 1).padStart(2, \"0\")\n const dd = String(date.getUTCDate()).padStart(2, \"0\")\n const hh = String(date.getUTCHours()).padStart(2, \"0\")\n const min = String(date.getUTCMinutes()).padStart(2, \"0\")\n return `${yyyy}-${mm}-${dd} ${hh}:${min}`\n}\n\nexport function uniqueIds(ids: number[]): number[] {\n const seen = new Set<number>()\n const unique: number[] = []\n for (const id of ids) {\n if (!seen.has(id)) {\n seen.add(id)\n unique.push(id)\n }\n }\n return unique\n}\n\nexport function joinIds(ids: number[]): string {\n return ids.map((id) => String(id)).join(\", \")\n}\n\nexport function normalizeCommentEntries(entries: Array<[number, string]>): Array<[number, string]> {\n const seen = new Map<number, number>()\n const ordered: Array<[number, string]> = []\n for (const [id, comment] of entries) {\n const idx = seen.get(id)\n if (idx !== undefined) {\n ordered[idx][1] = comment\n } else {\n seen.set(id, ordered.length)\n ordered.push([id, comment])\n }\n }\n return ordered\n}\n\nconst WAIT_UNTIL_PREFIX = \"@wait-until=\"\nconst WAIT_REASON_PREFIX = \"@wait-reason=\"\n\nexport type WaitComment = {\n until: number\n reason?: string\n}\n\nexport function parseWaitFromComment(comment?: string | null): WaitComment | null {\n if (!comment) return null\n let until: number | null = null\n let reason: string | undefined\n for (const line of comment.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed.startsWith(WAIT_UNTIL_PREFIX)) {\n const raw = trimmed.slice(WAIT_UNTIL_PREFIX.length).trim()\n const value = Number(raw)\n if (Number.isFinite(value)) {\n until = value\n }\n continue\n }\n if (trimmed.startsWith(WAIT_REASON_PREFIX)) {\n const raw = trimmed.slice(WAIT_REASON_PREFIX.length).trim()\n if (raw) reason = raw\n }\n }\n if (until === null) return null\n return { until, reason }\n}\n\nfunction isWaitLine(line: string): boolean {\n const trimmed = line.trim()\n return trimmed.startsWith(WAIT_UNTIL_PREFIX) || trimmed.startsWith(WAIT_REASON_PREFIX)\n}\n\nexport function upsertWaitInComment(comment: string | null, until: number, reason?: string): string {\n const lines = comment ? comment.split(/\\r?\\n/) : []\n const filtered = lines.filter((line) => !isWaitLine(line))\n const waitLines = [`${WAIT_UNTIL_PREFIX}${Math.trunc(until)}`]\n const reasonValue = reason?.trim()\n if (reasonValue) {\n waitLines.push(`${WAIT_REASON_PREFIX}${reasonValue}`)\n }\n return [...waitLines, ...filtered].join(\"\\n\").trimEnd()\n}\n\nexport function removeWaitFromComment(comment?: string | null): string | null {\n if (!comment) return null\n const lines = comment.split(/\\r?\\n/).filter((line) => !isWaitLine(line))\n const cleaned = lines.join(\"\\n\").trimEnd()\n return cleaned.length ? cleaned : null\n}\n\nexport function resolveMaybeRealpath(value: string): string {\n try {\n return fs.realpathSync.native(value)\n } catch {\n return value\n }\n}\n\nexport function normalizePath(value: string): string {\n let resolved = resolveMaybeRealpath(value)\n resolved = path.resolve(resolved)\n if (process.platform === \"win32\") {\n resolved = resolved.toLowerCase()\n }\n return resolved.replace(/[\\\\/]+$/, \"\")\n}\n\nexport function projectMatchesPath(project: string, current: string): boolean {\n const projectNorm = normalizePath(project)\n const currentNorm = normalizePath(current)\n if (projectNorm === currentNorm) return true\n if (currentNorm.startsWith(projectNorm + path.sep)) return true\n if (projectNorm.startsWith(currentNorm + path.sep)) return true\n return false\n}\n","export type AppErrorKind = \"InvalidInput\" | \"NotFound\" | \"Db\" | \"Io\" | \"Json\"\n\nexport class AppError extends Error {\n public readonly kind: AppErrorKind\n public readonly detail: string\n\n constructor(kind: AppErrorKind, detail: string) {\n super(detail)\n this.kind = kind\n this.detail = detail\n }\n\n toDisplayString(): string {\n const label = this.kind === \"InvalidInput\" ? \"Invalid input\" : this.kind === \"NotFound\" ? \"Not found\" : null\n if (!label) {\n return this.detail\n }\n if (this.detail.includes(\"\\n\")) {\n return `${label}:\\n${this.detail}`\n }\n return `${label}: ${this.detail}`\n }\n}\n\nexport function invalidInput(message: string): AppError {\n return new AppError(\"InvalidInput\", message)\n}\n\nexport function notFound(message: string): AppError {\n return new AppError(\"NotFound\", message)\n}\n\nexport function wrapDbError(message: string, err: unknown): AppError {\n const detail = err instanceof Error ? `${message}: ${err.message}` : message\n return new AppError(\"Db\", detail)\n}\n","import type { GoalRow, PlanRow, StepRow, PlanDetail } from \"./models\"\nimport { formatDateTimeUTC } from \"./util\"\n\nfunction hasText(value?: string | null) {\n return value !== undefined && value !== null && value.trim().length > 0\n}\n\nexport function formatStepDetail(step: StepRow, goals: GoalRow[]): string {\n let output = \"\"\n output += `Step ID: ${step.id}\\n`\n output += `Plan ID: ${step.plan_id}\\n`\n output += `Status: ${step.status}\\n`\n output += `Executor: ${step.executor}\\n`\n output += `Content: ${step.content}\\n`\n if (hasText(step.comment)) {\n output += `Comment: ${step.comment ?? \"\"}\\n`\n }\n output += `Created: ${formatDateTimeUTC(step.created_at)}\\n`\n output += `Updated: ${formatDateTimeUTC(step.updated_at)}\\n`\n output += \"\\n\"\n if (!goals.length) {\n output += \"Goals: (none)\"\n return output.trimEnd()\n }\n output += \"Goals:\\n\"\n for (const goal of goals) {\n output += `- [${goal.status}] ${goal.content} (goal id ${goal.id})\\n`\n if (hasText(goal.comment)) {\n output += ` Comment: ${goal.comment ?? \"\"}\\n`\n }\n }\n return output.trimEnd()\n}\n\nexport function formatGoalDetail(goal: GoalRow, step: StepRow): string {\n let output = \"\"\n output += `Goal ID: ${goal.id}\\n`\n output += `Step ID: ${goal.step_id}\\n`\n output += `Plan ID: ${step.plan_id}\\n`\n output += `Status: ${goal.status}\\n`\n output += `Content: ${goal.content}\\n`\n if (hasText(goal.comment)) {\n output += `Comment: ${goal.comment ?? \"\"}\\n`\n }\n output += `Created: ${formatDateTimeUTC(goal.created_at)}\\n`\n output += `Updated: ${formatDateTimeUTC(goal.updated_at)}\\n`\n output += \"\\n\"\n output += `Step Status: ${step.status}\\n`\n output += `Step Executor: ${step.executor}\\n`\n output += `Step Content: ${step.content}\\n`\n if (hasText(step.comment)) {\n output += `Step Comment: ${step.comment ?? \"\"}\\n`\n }\n return output.trimEnd()\n}\n\nexport function formatPlanDetail(plan: PlanRow, steps: StepRow[], goals: Map<number, GoalRow[]>): string {\n let output = \"\"\n output += `Plan ID: ${plan.id}\\n`\n output += `Title: ${plan.title}\\n`\n output += `Status: ${plan.status}\\n`\n output += `Content: ${plan.content}\\n`\n if (hasText(plan.comment)) {\n output += `Comment: ${plan.comment ?? \"\"}\\n`\n }\n output += `Created: ${formatDateTimeUTC(plan.created_at)}\\n`\n output += `Updated: ${formatDateTimeUTC(plan.updated_at)}\\n`\n output += \"\\n\"\n if (!steps.length) {\n output += \"Steps: (none)\"\n return output.trimEnd()\n }\n output += \"Steps:\\n\"\n for (const step of steps) {\n const stepGoals = goals.get(step.id) ?? []\n if (stepGoals.length) {\n const done = stepGoals.filter((goal) => goal.status === \"done\").length\n output += `- [${step.status}] ${step.content} (step id ${step.id}, exec ${step.executor}, goals ${done}/${stepGoals.length})\\n`\n } else {\n output += `- [${step.status}] ${step.content} (step id ${step.id}, exec ${step.executor})\\n`\n }\n if (hasText(step.comment)) {\n output += ` Comment: ${step.comment ?? \"\"}\\n`\n }\n if (stepGoals.length) {\n for (const goal of stepGoals) {\n output += ` - [${goal.status}] ${goal.content} (goal id ${goal.id})\\n`\n if (hasText(goal.comment)) {\n output += ` Comment: ${goal.comment ?? \"\"}\\n`\n }\n }\n }\n }\n return output.trimEnd()\n}\n\nexport function formatPlanMarkdown(\n active: boolean,\n activeUpdated: number | null,\n plan: PlanRow,\n steps: StepRow[],\n goals: Map<number, GoalRow[]>,\n): string {\n const lines: string[] = []\n\n const checkbox = (status: string) => (status === \"done\" ? \"x\" : \" \")\n\n const collapseHeading = (text: string) => {\n const normalized = text.replace(/\\r\\n/g, \"\\n\")\n const parts = normalized\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n if (!parts.length) return \"(untitled)\"\n return parts.join(\" / \")\n }\n\n const splitTaskText = (text: string): [string, string[]] => {\n const normalized = text.replace(/\\r\\n/g, \"\\n\")\n const rawLines = normalized.split(\"\\n\")\n if (!rawLines.length) return [\"(empty)\", []]\n let firstIdx = -1\n for (let i = 0; i < rawLines.length; i += 1) {\n if (rawLines[i].trim()) {\n firstIdx = i\n break\n }\n }\n if (firstIdx === -1) return [\"(empty)\", []]\n return [rawLines[firstIdx], rawLines.slice(firstIdx + 1)]\n }\n\n const pushLine = (indent: number, text: string) => {\n lines.push(`${\" \".repeat(indent)}${text}`)\n }\n const pushBlank = (indent: number) => {\n lines.push(indent === 0 ? \"\" : \" \".repeat(indent))\n }\n\n pushLine(0, \"# Plan\")\n pushBlank(0)\n pushLine(0, `## Plan: ${collapseHeading(plan.title)}`)\n pushBlank(0)\n pushLine(0, `- **Active:** \\`${active ? \"true\" : \"false\"}\\``)\n pushLine(0, `- **Plan ID:** \\`${plan.id}\\``)\n pushLine(0, `- **Status:** \\`${plan.status}\\``)\n if (hasText(plan.comment)) {\n pushLine(0, `- **Comment:** ${plan.comment ?? \"\"}`)\n }\n if (activeUpdated) {\n pushLine(0, `- **Activated:** ${formatDateTimeUTC(activeUpdated)}`)\n }\n pushLine(0, `- **Created:** ${formatDateTimeUTC(plan.created_at)}`)\n pushLine(0, `- **Updated:** ${formatDateTimeUTC(plan.updated_at)}`)\n const stepsDone = steps.filter((step) => step.status === \"done\").length\n pushLine(0, `- **Steps:** ${stepsDone}/${steps.length}`)\n pushBlank(0)\n\n pushLine(0, \"### Plan Content\")\n pushBlank(0)\n if (!plan.content.trim()) {\n pushLine(0, \"*No content*\")\n } else {\n const normalized = plan.content.replace(/\\r\\n/g, \"\\n\")\n for (const line of normalized.split(\"\\n\")) {\n if (!line.length) {\n pushLine(0, \">\")\n } else {\n pushLine(0, `> ${line}`)\n }\n }\n }\n pushBlank(0)\n\n pushLine(0, \"### Steps\")\n pushBlank(0)\n if (!steps.length) {\n pushLine(0, \"*No steps*\")\n return lines.join(\"\\n\").trimEnd()\n }\n\n steps.forEach((step, idx) => {\n const [firstLine, restLines] = splitTaskText(step.content)\n pushLine(0, `- [${checkbox(step.status)}] **${firstLine}** *(id: ${step.id}, exec: ${step.executor}, order: ${step.sort_order})*`)\n\n let hasRest = false\n for (const line of restLines) {\n if (!line.trim()) continue\n if (!hasRest) {\n pushBlank(2)\n hasRest = true\n } else {\n pushBlank(2)\n }\n pushLine(2, line)\n }\n\n pushBlank(2)\n pushLine(2, `- Created: ${formatDateTimeUTC(step.created_at)}`)\n pushLine(2, `- Updated: ${formatDateTimeUTC(step.updated_at)}`)\n if (hasText(step.comment)) {\n pushLine(2, `- Comment: ${step.comment ?? \"\"}`)\n }\n\n const stepGoals = goals.get(step.id)\n if (stepGoals && stepGoals.length) {\n const done = stepGoals.filter((goal) => goal.status === \"done\").length\n pushLine(2, `- Goals: ${done}/${stepGoals.length}`)\n for (const goal of stepGoals) {\n const [goalFirst, goalRest] = splitTaskText(goal.content)\n pushBlank(2)\n pushLine(2, `- [${checkbox(goal.status)}] ${goalFirst} *(id: ${goal.id})*`)\n for (const line of goalRest) {\n if (!line.trim()) continue\n pushBlank(4)\n pushLine(4, line)\n }\n if (hasText(goal.comment)) {\n pushBlank(4)\n pushLine(4, `Comment: ${goal.comment ?? \"\"}`)\n }\n }\n } else {\n pushLine(2, \"- Goals: 0/0\")\n pushBlank(2)\n pushLine(2, \"- (none)\")\n }\n\n if (idx + 1 < steps.length) {\n pushBlank(0)\n }\n })\n\n return lines.join(\"\\n\").trimEnd()\n}\n\nexport function planDetailToMarkdown(detail: PlanDetail, active: boolean, activeUpdated: number | null): string {\n return formatPlanMarkdown(active, activeUpdated, detail.plan, detail.steps, detail.goals)\n}\n","import type { DatabaseConnection } from \"./db\"\nimport {\n createEmptyStatusChanges,\n mergeStatusChanges,\n type ActivePlanRow,\n type GoalChanges,\n type GoalDetail,\n type GoalQuery,\n type GoalRow,\n type GoalStatus,\n type PlanChanges,\n type PlanDetail,\n type PlanOrder,\n type PlanRow,\n type PlanStatus,\n type StatusChanges,\n type StepChanges,\n type StepDetail,\n type StepExecutor,\n type StepInput,\n type StepQuery,\n type StepRow,\n type StepStatus,\n} from \"./models\"\nimport {\n ensureNonEmpty,\n joinIds,\n normalizeCommentEntries,\n parseWaitFromComment,\n removeWaitFromComment,\n uniqueIds,\n upsertWaitInComment,\n} from \"./util\"\nimport { invalidInput, notFound } from \"./errors\"\nimport { formatStepDetail } from \"./format\"\n\nexport class PlanpilotApp {\n private db: DatabaseConnection\n private sessionId: string\n private cwd?: string\n\n constructor(db: DatabaseConnection, sessionId: string, cwd?: string) {\n this.db = db\n this.sessionId = sessionId\n this.cwd = cwd\n }\n\n addPlan(input: { title: string; content: string }): PlanRow {\n ensureNonEmpty(\"plan title\", input.title)\n ensureNonEmpty(\"plan content\", input.content)\n const now = Date.now()\n const result = this.db\n .prepare(\n `INSERT INTO plans (title, content, status, comment, last_session_id, last_cwd, created_at, updated_at)\n VALUES (?, ?, ?, NULL, ?, ?, ?, ?)`\n )\n .run(input.title, input.content, \"todo\", this.sessionId, this.cwd ?? null, now, now)\n const plan = this.getPlan(result.lastInsertRowid as number)\n return plan\n }\n\n addPlanTree(input: { title: string; content: string }, steps: StepInput[]): { plan: PlanRow; stepCount: number; goalCount: number } {\n ensureNonEmpty(\"plan title\", input.title)\n ensureNonEmpty(\"plan content\", input.content)\n steps.forEach((step) => {\n ensureNonEmpty(\"step content\", step.content)\n step.goals.forEach((goal) => ensureNonEmpty(\"goal content\", goal))\n })\n\n const tx = this.db.transaction(() => {\n const now = Date.now()\n const planResult = this.db\n .prepare(\n `INSERT INTO plans (title, content, status, comment, last_session_id, last_cwd, created_at, updated_at)\n VALUES (?, ?, ?, NULL, ?, ?, ?, ?)`\n )\n .run(input.title, input.content, \"todo\", this.sessionId, this.cwd ?? null, now, now)\n const plan = this.getPlan(planResult.lastInsertRowid as number)\n\n let stepCount = 0\n let goalCount = 0\n steps.forEach((step, idx) => {\n const stepResult = this.db\n .prepare(\n `INSERT INTO steps (plan_id, content, status, executor, sort_order, comment, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, ?, ?)`\n )\n .run(plan.id, step.content, \"todo\", step.executor, idx + 1, now, now)\n const stepId = stepResult.lastInsertRowid as number\n stepCount += 1\n step.goals.forEach((goal) => {\n this.db\n .prepare(\n `INSERT INTO goals (step_id, content, status, comment, created_at, updated_at)\n VALUES (?, ?, ?, NULL, ?, ?)`\n )\n .run(stepId, goal, \"todo\", now, now)\n goalCount += 1\n })\n })\n\n return { plan, stepCount, goalCount }\n })\n\n return tx()\n }\n\n listPlans(order?: PlanOrder | null, desc?: boolean): PlanRow[] {\n const orderBy = order ?? \"updated\"\n const direction = desc ? \"DESC\" : \"ASC\"\n const orderColumn =\n orderBy === \"id\" ? \"id\" : orderBy === \"title\" ? \"title\" : orderBy === \"created\" ? \"created_at\" : \"updated_at\"\n\n return this.db\n .prepare(`SELECT * FROM plans ORDER BY ${orderColumn} ${direction}, id ASC`)\n .all() as PlanRow[]\n }\n\n getPlan(id: number): PlanRow {\n const row = this.db.prepare(\"SELECT * FROM plans WHERE id = ?\").get(id) as PlanRow | undefined\n if (!row) throw notFound(`plan id ${id}`)\n return row\n }\n\n getStep(id: number): StepRow {\n const row = this.db.prepare(\"SELECT * FROM steps WHERE id = ?\").get(id) as StepRow | undefined\n if (!row) throw notFound(`step id ${id}`)\n return row\n }\n\n getGoal(id: number): GoalRow {\n const row = this.db.prepare(\"SELECT * FROM goals WHERE id = ?\").get(id) as GoalRow | undefined\n if (!row) throw notFound(`goal id ${id}`)\n return row\n }\n\n planWithSteps(id: number): { plan: PlanRow; steps: StepRow[] } {\n const plan = this.getPlan(id)\n const steps = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(id) as StepRow[]\n return { plan, steps }\n }\n\n getPlanDetail(id: number): PlanDetail {\n const plan = this.getPlan(id)\n const steps = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(id) as StepRow[]\n const stepIds = steps.map((step) => step.id)\n const goals = this.goalsForSteps(stepIds)\n const goalsMap = new Map<number, GoalRow[]>()\n for (const step of steps) {\n goalsMap.set(step.id, goals.get(step.id) ?? [])\n }\n return { plan, steps, goals: goalsMap }\n }\n\n getStepDetail(id: number): StepDetail {\n const step = this.getStep(id)\n const goals = this.goalsForStep(step.id)\n return { step, goals }\n }\n\n getGoalDetail(id: number): GoalDetail {\n const goal = this.getGoal(id)\n const step = this.getStep(goal.step_id)\n return { goal, step }\n }\n\n getPlanDetails(plans: PlanRow[]): PlanDetail[] {\n if (!plans.length) return []\n const planIds = plans.map((plan) => plan.id)\n const steps = this.db\n .prepare(`SELECT * FROM steps WHERE plan_id IN (${planIds.map(() => \"?\").join(\",\")}) ORDER BY plan_id ASC, sort_order ASC, id ASC`)\n .all(...planIds) as StepRow[]\n const stepIds = steps.map((step) => step.id)\n const goalsByStep = this.goalsForSteps(stepIds)\n\n const stepsByPlan = new Map<number, StepRow[]>()\n for (const step of steps) {\n const list = stepsByPlan.get(step.plan_id)\n if (list) list.push(step)\n else stepsByPlan.set(step.plan_id, [step])\n }\n\n return plans.map((plan) => {\n const planSteps = stepsByPlan.get(plan.id) ?? []\n const goalsMap = new Map<number, GoalRow[]>()\n for (const step of planSteps) {\n goalsMap.set(step.id, goalsByStep.get(step.id) ?? [])\n }\n return { plan, steps: planSteps, goals: goalsMap }\n })\n }\n\n getStepsDetail(steps: StepRow[]): StepDetail[] {\n if (!steps.length) return []\n const stepIds = steps.map((step) => step.id)\n const goalsMap = this.goalsForSteps(stepIds)\n return steps.map((step) => ({\n step,\n goals: goalsMap.get(step.id) ?? [],\n }))\n }\n\n getActivePlan(): ActivePlanRow | null {\n const row = this.db\n .prepare(\"SELECT * FROM active_plan WHERE session_id = ?\")\n .get(this.sessionId) as ActivePlanRow | undefined\n return row ?? null\n }\n\n setActivePlan(planId: number, takeover: boolean): ActivePlanRow {\n this.getPlan(planId)\n const tx = this.db.transaction(() => {\n const existing = this.db\n .prepare(\"SELECT * FROM active_plan WHERE plan_id = ?\")\n .get(planId) as ActivePlanRow | undefined\n if (existing && existing.session_id !== this.sessionId && !takeover) {\n throw invalidInput(\n `plan id ${planId} is already active in session ${existing.session_id} (use --force to take over)`\n )\n }\n\n this.db.prepare(\"DELETE FROM active_plan WHERE session_id = ?\").run(this.sessionId)\n this.db.prepare(\"DELETE FROM active_plan WHERE plan_id = ?\").run(planId)\n\n const now = Date.now()\n this.db\n .prepare(\"INSERT INTO active_plan (session_id, plan_id, updated_at) VALUES (?, ?, ?)\")\n .run(this.sessionId, planId, now)\n\n this.touchPlan(planId)\n\n const created = this.db\n .prepare(\"SELECT * FROM active_plan WHERE session_id = ?\")\n .get(this.sessionId) as ActivePlanRow | undefined\n if (!created) throw notFound(\"active plan not found after insert\")\n return created\n })\n\n return tx()\n }\n\n clearActivePlan() {\n this.db.prepare(\"DELETE FROM active_plan WHERE session_id = ?\").run(this.sessionId)\n }\n\n updatePlanWithActiveClear(id: number, changes: PlanChanges): { plan: PlanRow; cleared: boolean } {\n const tx = this.db.transaction(() => {\n const plan = this.updatePlanWithConn(id, changes)\n let cleared = false\n if (plan.status === \"done\") {\n cleared = this.clearActivePlansForPlanWithConn(plan.id)\n }\n return { plan, cleared }\n })\n\n return tx()\n }\n\n deletePlan(id: number) {\n const tx = this.db.transaction(() => {\n this.db.prepare(\"DELETE FROM active_plan WHERE plan_id = ?\").run(id)\n const stepIds = this.db\n .prepare(\"SELECT id FROM steps WHERE plan_id = ?\")\n .all(id)\n .map((row: any) => row.id as number)\n if (stepIds.length) {\n this.db\n .prepare(`DELETE FROM goals WHERE step_id IN (${stepIds.map(() => \"?\").join(\",\")})`)\n .run(...stepIds)\n this.db.prepare(\"DELETE FROM steps WHERE plan_id = ?\").run(id)\n }\n const result = this.db.prepare(\"DELETE FROM plans WHERE id = ?\").run(id)\n if (result.changes === 0) {\n throw notFound(`plan id ${id}`)\n }\n })\n\n tx()\n }\n\n addStepsBatch(\n planId: number,\n contents: string[],\n status: StepStatus,\n executor: StepExecutor,\n at?: number | null,\n ): { steps: StepRow[]; changes: StatusChanges } {\n if (!this.db.prepare(\"SELECT 1 FROM plans WHERE id = ?\").get(planId)) {\n throw notFound(`plan id ${planId}`)\n }\n if (!contents.length) {\n return { steps: [], changes: createEmptyStatusChanges() }\n }\n contents.forEach((content) => ensureNonEmpty(\"step content\", content))\n\n const tx = this.db.transaction(() => {\n const existing = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(planId) as StepRow[]\n this.normalizeStepsInPlace(existing)\n\n const total = existing.length\n const insertPos = at !== undefined && at !== null ? (at > 0 ? Math.min(at, total + 1) : 1) : total + 1\n const now = Date.now()\n const shiftBy = contents.length\n if (shiftBy > 0) {\n for (let idx = existing.length - 1; idx >= 0; idx -= 1) {\n const step = existing[idx]\n if (step.sort_order >= insertPos) {\n const newOrder = step.sort_order + shiftBy\n this.db\n .prepare(\"UPDATE steps SET sort_order = ?, updated_at = ? WHERE id = ?\")\n .run(newOrder, now, step.id)\n step.sort_order = newOrder\n step.updated_at = now\n }\n }\n }\n\n const created: StepRow[] = []\n contents.forEach((content, idx) => {\n const sortOrder = insertPos + idx\n const result = this.db\n .prepare(\n `INSERT INTO steps (plan_id, content, status, executor, sort_order, comment, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, ?, ?)`\n )\n .run(planId, content, status, executor, sortOrder, now, now)\n const step = this.getStep(result.lastInsertRowid as number)\n created.push(step)\n })\n\n const changes = this.refreshPlanStatus(planId)\n this.touchPlan(planId)\n return { steps: created, changes }\n })\n\n return tx()\n }\n\n addStepTree(planId: number, content: string, executor: StepExecutor, goals: string[]): { step: StepRow; goals: GoalRow[]; changes: StatusChanges } {\n ensureNonEmpty(\"step content\", content)\n goals.forEach((goal) => ensureNonEmpty(\"goal content\", goal))\n\n const tx = this.db.transaction(() => {\n if (!this.db.prepare(\"SELECT 1 FROM plans WHERE id = ?\").get(planId)) {\n throw notFound(`plan id ${planId}`)\n }\n const existing = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(planId) as StepRow[]\n this.normalizeStepsInPlace(existing)\n\n const sortOrder = existing.length + 1\n const now = Date.now()\n const stepResult = this.db\n .prepare(\n `INSERT INTO steps (plan_id, content, status, executor, sort_order, comment, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, NULL, ?, ?)`\n )\n .run(planId, content, \"todo\", executor, sortOrder, now, now)\n const step = this.getStep(stepResult.lastInsertRowid as number)\n\n const createdGoals: GoalRow[] = []\n for (const goalContent of goals) {\n const goalResult = this.db\n .prepare(\n `INSERT INTO goals (step_id, content, status, comment, created_at, updated_at)\n VALUES (?, ?, ?, NULL, ?, ?)`\n )\n .run(step.id, goalContent, \"todo\", now, now)\n createdGoals.push(this.getGoal(goalResult.lastInsertRowid as number))\n }\n\n const changes = this.refreshPlanStatus(planId)\n this.touchPlan(planId)\n return { step, goals: createdGoals, changes }\n })\n\n return tx()\n }\n\n listStepsFiltered(planId: number, query: StepQuery): StepRow[] {\n this.getPlan(planId)\n const conditions: string[] = [\"plan_id = ?\"]\n const params: any[] = [planId]\n if (query.status) {\n conditions.push(\"status = ?\")\n params.push(query.status)\n }\n if (query.executor) {\n conditions.push(\"executor = ?\")\n params.push(query.executor)\n }\n const order = query.order ?? \"order\"\n const direction = query.desc ? \"DESC\" : \"ASC\"\n const orderColumn =\n order === \"id\"\n ? \"id\"\n : order === \"created\"\n ? \"created_at\"\n : order === \"updated\"\n ? \"updated_at\"\n : \"sort_order\"\n\n let sql = `SELECT * FROM steps WHERE ${conditions.join(\" AND \")} ORDER BY ${orderColumn} ${direction}, id ASC`\n if (query.limit !== undefined) {\n sql += \" LIMIT ?\"\n params.push(query.limit)\n }\n if (query.offset !== undefined) {\n sql += \" OFFSET ?\"\n params.push(query.offset)\n }\n return this.db.prepare(sql).all(...params) as StepRow[]\n }\n\n countSteps(planId: number, query: StepQuery): number {\n this.getPlan(planId)\n const conditions: string[] = [\"plan_id = ?\"]\n const params: any[] = [planId]\n if (query.status) {\n conditions.push(\"status = ?\")\n params.push(query.status)\n }\n if (query.executor) {\n conditions.push(\"executor = ?\")\n params.push(query.executor)\n }\n const row = this.db\n .prepare(`SELECT COUNT(*) as count FROM steps WHERE ${conditions.join(\" AND \")}`)\n .get(...params) as { count: number }\n return row.count\n }\n\n nextStep(planId: number): StepRow | null {\n const row = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? AND status = ? ORDER BY sort_order ASC, id ASC LIMIT 1\")\n .get(planId, \"todo\") as StepRow | undefined\n return row ?? null\n }\n\n updateStep(id: number, changes: StepChanges): { step: StepRow; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n if (changes.content !== undefined) {\n ensureNonEmpty(\"step content\", changes.content)\n }\n if (changes.status === \"done\") {\n const pending = this.nextGoalForStep(id)\n if (pending) {\n throw invalidInput(`cannot mark step done; next pending goal: ${pending.content} (id ${pending.id})`)\n }\n }\n const existing = this.getStep(id)\n const now = Date.now()\n\n const updated = {\n content: changes.content ?? existing.content,\n status: changes.status ?? existing.status,\n executor: changes.executor ?? existing.executor,\n comment: changes.comment !== undefined ? changes.comment : existing.comment,\n }\n this.db\n .prepare(\n `UPDATE steps SET content = ?, status = ?, executor = ?, comment = ?, updated_at = ? WHERE id = ?`\n )\n .run(updated.content, updated.status, updated.executor, updated.comment, now, id)\n\n const step = this.getStep(id)\n const statusChanges = createEmptyStatusChanges()\n if (changes.status !== undefined) {\n mergeStatusChanges(statusChanges, this.refreshPlanStatus(step.plan_id))\n }\n this.touchPlan(step.plan_id)\n return { step, changes: statusChanges }\n })\n\n return tx()\n }\n\n setStepDoneWithGoals(id: number, allGoals: boolean): { step: StepRow; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n let changes = createEmptyStatusChanges()\n if (allGoals) {\n const goalChanges = this.setAllGoalsDoneForStep(id)\n mergeStatusChanges(changes, goalChanges)\n } else {\n const pending = this.nextGoalForStep(id)\n if (pending) {\n throw invalidInput(`cannot mark step done; next pending goal: ${pending.content} (id ${pending.id})`)\n }\n }\n\n const existing = this.getStep(id)\n if (existing.status !== \"done\") {\n const now = Date.now()\n this.db.prepare(\"UPDATE steps SET status = ?, updated_at = ? WHERE id = ?\").run(\"done\", now, id)\n }\n const step = this.getStep(id)\n mergeStatusChanges(changes, this.refreshPlanStatus(step.plan_id))\n this.touchPlan(step.plan_id)\n return { step, changes }\n })\n\n return tx()\n }\n\n moveStep(id: number, to: number): StepRow[] {\n const tx = this.db.transaction(() => {\n const target = this.getStep(id)\n const planId = target.plan_id\n const steps = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(planId) as StepRow[]\n const currentIndex = steps.findIndex((step) => step.id === id)\n if (currentIndex === -1) throw notFound(`step id ${id}`)\n let desiredIndex = Math.max(to - 1, 0)\n if (desiredIndex >= steps.length) desiredIndex = steps.length - 1\n\n const [moving] = steps.splice(currentIndex, 1)\n if (desiredIndex >= steps.length) steps.push(moving)\n else steps.splice(desiredIndex, 0, moving)\n\n const now = Date.now()\n steps.forEach((step, idx) => {\n const desiredOrder = idx + 1\n if (step.sort_order !== desiredOrder) {\n this.db\n .prepare(\"UPDATE steps SET sort_order = ?, updated_at = ? WHERE id = ?\")\n .run(desiredOrder, now, step.id)\n step.sort_order = desiredOrder\n step.updated_at = now\n }\n })\n return steps\n })\n\n return tx()\n }\n\n deleteSteps(ids: number[]): { deleted: number; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n if (!ids.length) return { deleted: 0, changes: createEmptyStatusChanges() }\n const unique = uniqueIds(ids)\n const steps = this.db\n .prepare(`SELECT * FROM steps WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .all(...unique) as StepRow[]\n const existing = new Set(steps.map((step) => step.id))\n const missing = unique.filter((id) => !existing.has(id))\n if (missing.length) {\n throw notFound(`step id(s) not found: ${joinIds(missing)}`)\n }\n\n const planIds = Array.from(new Set(steps.map((step) => step.plan_id)))\n if (unique.length) {\n this.db\n .prepare(`DELETE FROM goals WHERE step_id IN (${unique.map(() => \"?\").join(\",\")})`)\n .run(...unique)\n }\n const result = this.db\n .prepare(`DELETE FROM steps WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .run(...unique)\n\n planIds.forEach((planId) => this.normalizeStepsForPlan(planId))\n\n const changes = createEmptyStatusChanges()\n planIds.forEach((planId) => mergeStatusChanges(changes, this.refreshPlanStatus(planId)))\n if (planIds.length) {\n this.touchPlans(planIds)\n }\n return { deleted: result.changes, changes }\n })\n\n return tx()\n }\n\n addGoalsBatch(stepId: number, contents: string[], status: GoalStatus): { goals: GoalRow[]; changes: StatusChanges } {\n if (!contents.length) return { goals: [], changes: createEmptyStatusChanges() }\n contents.forEach((content) => ensureNonEmpty(\"goal content\", content))\n\n const tx = this.db.transaction(() => {\n const step = this.getStep(stepId)\n const now = Date.now()\n const created: GoalRow[] = []\n contents.forEach((content) => {\n const result = this.db\n .prepare(\n `INSERT INTO goals (step_id, content, status, comment, created_at, updated_at)\n VALUES (?, ?, ?, NULL, ?, ?)`\n )\n .run(stepId, content, status, now, now)\n created.push(this.getGoal(result.lastInsertRowid as number))\n })\n const changes = this.refreshStepStatus(stepId)\n this.touchPlan(step.plan_id)\n return { goals: created, changes }\n })\n\n return tx()\n }\n\n listGoalsFiltered(stepId: number, query: GoalQuery): GoalRow[] {\n this.getStep(stepId)\n const conditions: string[] = [\"step_id = ?\"]\n const params: any[] = [stepId]\n if (query.status) {\n conditions.push(\"status = ?\")\n params.push(query.status)\n }\n let sql = `SELECT * FROM goals WHERE ${conditions.join(\" AND \")} ORDER BY updated_at DESC, id DESC`\n if (query.limit !== undefined) {\n sql += \" LIMIT ?\"\n params.push(query.limit)\n }\n if (query.offset !== undefined) {\n sql += \" OFFSET ?\"\n params.push(query.offset)\n }\n return this.db.prepare(sql).all(...params) as GoalRow[]\n }\n\n countGoals(stepId: number, query: GoalQuery): number {\n this.getStep(stepId)\n const conditions: string[] = [\"step_id = ?\"]\n const params: any[] = [stepId]\n if (query.status) {\n conditions.push(\"status = ?\")\n params.push(query.status)\n }\n const row = this.db\n .prepare(`SELECT COUNT(*) as count FROM goals WHERE ${conditions.join(\" AND \")}`)\n .get(...params) as { count: number }\n return row.count\n }\n\n updateGoal(id: number, changes: GoalChanges): { goal: GoalRow; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n if (changes.content !== undefined) {\n ensureNonEmpty(\"goal content\", changes.content)\n }\n const existing = this.getGoal(id)\n const now = Date.now()\n const updated = {\n content: changes.content ?? existing.content,\n status: changes.status ?? existing.status,\n comment: changes.comment !== undefined ? changes.comment : existing.comment,\n }\n this.db\n .prepare(\"UPDATE goals SET content = ?, status = ?, comment = ?, updated_at = ? WHERE id = ?\")\n .run(updated.content, updated.status, updated.comment, now, id)\n\n const goal = this.getGoal(id)\n const statusChanges = createEmptyStatusChanges()\n if (changes.status !== undefined) {\n mergeStatusChanges(statusChanges, this.refreshStepStatus(goal.step_id))\n }\n const step = this.getStep(goal.step_id)\n this.touchPlan(step.plan_id)\n return { goal, changes: statusChanges }\n })\n\n return tx()\n }\n\n setGoalStatus(id: number, status: GoalStatus): { goal: GoalRow; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n this.getGoal(id)\n const now = Date.now()\n this.db.prepare(\"UPDATE goals SET status = ?, updated_at = ? WHERE id = ?\").run(status, now, id)\n const goal = this.getGoal(id)\n const changes = this.refreshStepStatus(goal.step_id)\n const step = this.getStep(goal.step_id)\n this.touchPlan(step.plan_id)\n return { goal, changes }\n })\n\n return tx()\n }\n\n setGoalsStatus(ids: number[], status: GoalStatus): { updated: number; changes: StatusChanges } {\n if (!ids.length) return { updated: 0, changes: createEmptyStatusChanges() }\n const tx = this.db.transaction(() => {\n const unique = uniqueIds(ids)\n const goals = this.db\n .prepare(`SELECT * FROM goals WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .all(...unique) as GoalRow[]\n const existing = new Set(goals.map((goal) => goal.id))\n const missing = unique.filter((id) => !existing.has(id))\n if (missing.length) {\n throw notFound(`goal id(s) not found: ${joinIds(missing)}`)\n }\n const now = Date.now()\n const stepIds: number[] = []\n const stepSeen = new Set<number>()\n goals.forEach((goal) => {\n if (!stepSeen.has(goal.step_id)) {\n stepSeen.add(goal.step_id)\n stepIds.push(goal.step_id)\n }\n this.db.prepare(\"UPDATE goals SET status = ?, updated_at = ? WHERE id = ?\").run(status, now, goal.id)\n })\n\n const changes = createEmptyStatusChanges()\n stepIds.forEach((stepId) => mergeStatusChanges(changes, this.refreshStepStatus(stepId)))\n\n const planIds: number[] = []\n if (stepIds.length) {\n const steps = this.db\n .prepare(`SELECT plan_id FROM steps WHERE id IN (${stepIds.map(() => \"?\").join(\",\")})`)\n .all(...stepIds) as Array<{ plan_id: number }>\n const seen = new Set<number>()\n steps.forEach((row) => {\n if (!seen.has(row.plan_id)) {\n seen.add(row.plan_id)\n planIds.push(row.plan_id)\n }\n })\n }\n if (planIds.length) this.touchPlans(planIds)\n\n return { updated: unique.length, changes }\n })\n\n return tx()\n }\n\n deleteGoals(ids: number[]): { deleted: number; changes: StatusChanges } {\n const tx = this.db.transaction(() => {\n if (!ids.length) return { deleted: 0, changes: createEmptyStatusChanges() }\n const unique = uniqueIds(ids)\n const goals = this.db\n .prepare(`SELECT * FROM goals WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .all(...unique) as GoalRow[]\n const existing = new Set(goals.map((goal) => goal.id))\n const missing = unique.filter((id) => !existing.has(id))\n if (missing.length) {\n throw notFound(`goal id(s) not found: ${joinIds(missing)}`)\n }\n\n const stepIds = Array.from(new Set(goals.map((goal) => goal.step_id)))\n const result = this.db\n .prepare(`DELETE FROM goals WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .run(...unique)\n\n const changes = createEmptyStatusChanges()\n stepIds.forEach((stepId) => mergeStatusChanges(changes, this.refreshStepStatus(stepId)))\n\n if (stepIds.length) {\n const planIds: number[] = []\n const steps = this.db\n .prepare(`SELECT plan_id FROM steps WHERE id IN (${stepIds.map(() => \"?\").join(\",\")})`)\n .all(...stepIds) as Array<{ plan_id: number }>\n const seen = new Set<number>()\n steps.forEach((row) => {\n if (!seen.has(row.plan_id)) {\n seen.add(row.plan_id)\n planIds.push(row.plan_id)\n }\n })\n if (planIds.length) this.touchPlans(planIds)\n }\n\n return { deleted: result.changes, changes }\n })\n\n return tx()\n }\n\n commentPlans(entries: Array<[number, string]>): number[] {\n const normalized = normalizeCommentEntries(entries)\n if (!normalized.length) return []\n const ids = normalized.map(([id]) => id)\n const tx = this.db.transaction(() => {\n const existing = this.db\n .prepare(`SELECT id FROM plans WHERE id IN (${ids.map(() => \"?\").join(\",\")})`)\n .all(...ids)\n .map((row: any) => row.id as number)\n const existingSet = new Set(existing)\n const missing = ids.filter((id) => !existingSet.has(id))\n if (missing.length) {\n throw notFound(`plan id(s) not found: ${joinIds(missing)}`)\n }\n const now = Date.now()\n normalized.forEach(([planId, comment]) => {\n if (this.cwd) {\n this.db\n .prepare(\"UPDATE plans SET comment = ?, last_session_id = ?, last_cwd = ?, updated_at = ? WHERE id = ?\")\n .run(comment, this.sessionId, this.cwd, now, planId)\n } else {\n this.db\n .prepare(\"UPDATE plans SET comment = ?, last_session_id = ?, updated_at = ? WHERE id = ?\")\n .run(comment, this.sessionId, now, planId)\n }\n })\n return ids\n })\n\n return tx()\n }\n\n commentSteps(entries: Array<[number, string]>): number[] {\n const normalized = normalizeCommentEntries(entries)\n if (!normalized.length) return []\n const ids = normalized.map(([id]) => id)\n const tx = this.db.transaction(() => {\n const steps = this.db\n .prepare(`SELECT * FROM steps WHERE id IN (${ids.map(() => \"?\").join(\",\")})`)\n .all(...ids) as StepRow[]\n const existing = new Set(steps.map((step) => step.id))\n const missing = ids.filter((id) => !existing.has(id))\n if (missing.length) {\n throw notFound(`step id(s) not found: ${joinIds(missing)}`)\n }\n\n const planIds = Array.from(new Set(steps.map((step) => step.plan_id)))\n const now = Date.now()\n normalized.forEach(([stepId, comment]) => {\n this.db.prepare(\"UPDATE steps SET comment = ?, updated_at = ? WHERE id = ?\").run(comment, now, stepId)\n })\n if (planIds.length) this.touchPlans(planIds)\n return planIds\n })\n\n return tx()\n }\n\n setStepWait(stepId: number, delayMs: number, reason?: string): { step: StepRow; until: number } {\n if (!Number.isFinite(delayMs) || delayMs < 0) {\n throw invalidInput(\"delay must be a non-negative number\")\n }\n const tx = this.db.transaction(() => {\n const step = this.getStep(stepId)\n const now = Date.now()\n const until = now + Math.trunc(delayMs)\n const comment = upsertWaitInComment(step.comment, until, reason)\n this.db.prepare(\"UPDATE steps SET comment = ?, updated_at = ? WHERE id = ?\").run(comment, now, stepId)\n const updated = this.getStep(stepId)\n this.touchPlan(updated.plan_id)\n return { step: updated, until }\n })\n\n return tx()\n }\n\n clearStepWait(stepId: number): { step: StepRow } {\n const tx = this.db.transaction(() => {\n const step = this.getStep(stepId)\n const comment = step.comment ? removeWaitFromComment(step.comment) : null\n const now = Date.now()\n this.db.prepare(\"UPDATE steps SET comment = ?, updated_at = ? WHERE id = ?\").run(comment, now, stepId)\n const updated = this.getStep(stepId)\n this.touchPlan(updated.plan_id)\n return { step: updated }\n })\n\n return tx()\n }\n\n getStepWait(stepId: number): { step: StepRow; wait: { until: number; reason?: string } | null } {\n const step = this.getStep(stepId)\n const wait = parseWaitFromComment(step.comment)\n return { step, wait }\n }\n\n commentGoals(entries: Array<[number, string]>): number[] {\n const normalized = normalizeCommentEntries(entries)\n if (!normalized.length) return []\n const ids = normalized.map(([id]) => id)\n const tx = this.db.transaction(() => {\n const goals = this.db\n .prepare(`SELECT * FROM goals WHERE id IN (${ids.map(() => \"?\").join(\",\")})`)\n .all(...ids) as GoalRow[]\n const existing = new Set(goals.map((goal) => goal.id))\n const missing = ids.filter((id) => !existing.has(id))\n if (missing.length) {\n throw notFound(`goal id(s) not found: ${joinIds(missing)}`)\n }\n\n const stepIds = Array.from(new Set(goals.map((goal) => goal.step_id)))\n const now = Date.now()\n normalized.forEach(([goalId, comment]) => {\n this.db.prepare(\"UPDATE goals SET comment = ?, updated_at = ? WHERE id = ?\").run(comment, now, goalId)\n })\n\n if (stepIds.length) {\n const planIds: number[] = []\n const steps = this.db\n .prepare(`SELECT plan_id FROM steps WHERE id IN (${stepIds.map(() => \"?\").join(\",\")})`)\n .all(...stepIds) as Array<{ plan_id: number }>\n const seen = new Set<number>()\n steps.forEach((row) => {\n if (!seen.has(row.plan_id)) {\n seen.add(row.plan_id)\n planIds.push(row.plan_id)\n }\n })\n if (planIds.length) this.touchPlans(planIds)\n return planIds\n }\n\n return []\n })\n\n return tx()\n }\n\n goalsForStep(stepId: number): GoalRow[] {\n return this.db.prepare(\"SELECT * FROM goals WHERE step_id = ? ORDER BY id ASC\").all(stepId) as GoalRow[]\n }\n\n goalsForSteps(stepIds: number[]): Map<number, GoalRow[]> {\n const grouped = new Map<number, GoalRow[]>()\n if (!stepIds.length) return grouped\n const rows = this.db\n .prepare(`SELECT * FROM goals WHERE step_id IN (${stepIds.map(() => \"?\").join(\",\")}) ORDER BY step_id ASC, id ASC`)\n .all(...stepIds) as GoalRow[]\n rows.forEach((goal) => {\n const list = grouped.get(goal.step_id)\n if (list) list.push(goal)\n else grouped.set(goal.step_id, [goal])\n })\n return grouped\n }\n\n planIdsForSteps(ids: number[]): number[] {\n if (!ids.length) return []\n const unique = uniqueIds(ids)\n const rows = this.db\n .prepare(`SELECT plan_id FROM steps WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .all(...unique) as Array<{ plan_id: number }>\n const seen = new Set<number>()\n const planIds: number[] = []\n rows.forEach((row) => {\n if (!seen.has(row.plan_id)) {\n seen.add(row.plan_id)\n planIds.push(row.plan_id)\n }\n })\n return planIds\n }\n\n planIdsForGoals(ids: number[]): number[] {\n if (!ids.length) return []\n const unique = uniqueIds(ids)\n const goals = this.db\n .prepare(`SELECT step_id FROM goals WHERE id IN (${unique.map(() => \"?\").join(\",\")})`)\n .all(...unique) as Array<{ step_id: number }>\n const stepIds = Array.from(new Set(goals.map((row) => row.step_id)))\n if (!stepIds.length) return []\n const steps = this.db\n .prepare(`SELECT plan_id FROM steps WHERE id IN (${stepIds.map(() => \"?\").join(\",\")})`)\n .all(...stepIds) as Array<{ plan_id: number }>\n const seen = new Set<number>()\n const planIds: number[] = []\n steps.forEach((row) => {\n if (!seen.has(row.plan_id)) {\n seen.add(row.plan_id)\n planIds.push(row.plan_id)\n }\n })\n return planIds\n }\n\n private updatePlanWithConn(id: number, changes: PlanChanges): PlanRow {\n if (changes.title !== undefined) ensureNonEmpty(\"plan title\", changes.title)\n if (changes.content !== undefined) ensureNonEmpty(\"plan content\", changes.content)\n if (changes.status === \"done\") {\n const total = this.db.prepare(\"SELECT COUNT(*) as count FROM steps WHERE plan_id = ?\").get(id) as { count: number }\n if (total.count > 0) {\n const next = this.nextStep(id)\n if (next) {\n const goals = this.goalsForStep(next.id)\n const detail = formatStepDetail(next, goals)\n throw invalidInput(`cannot mark plan done; next pending step:\\n${detail}`)\n }\n }\n }\n\n const existing = this.getPlan(id)\n const now = Date.now()\n const updated = {\n title: changes.title ?? existing.title,\n content: changes.content ?? existing.content,\n status: changes.status ?? existing.status,\n comment: changes.comment !== undefined ? changes.comment : existing.comment,\n }\n\n if (this.cwd) {\n this.db\n .prepare(\n `UPDATE plans SET title = ?, content = ?, status = ?, comment = ?, last_session_id = ?, last_cwd = ?, updated_at = ? WHERE id = ?`\n )\n .run(updated.title, updated.content, updated.status, updated.comment, this.sessionId, this.cwd, now, id)\n } else {\n this.db\n .prepare(\n `UPDATE plans SET title = ?, content = ?, status = ?, comment = ?, last_session_id = ?, updated_at = ? WHERE id = ?`\n )\n .run(updated.title, updated.content, updated.status, updated.comment, this.sessionId, now, id)\n }\n\n return this.getPlan(id)\n }\n\n private refreshPlanStatus(planId: number): StatusChanges {\n const total = this.db.prepare(\"SELECT COUNT(*) as count FROM steps WHERE plan_id = ?\").get(planId) as { count: number }\n if (total.count === 0) return createEmptyStatusChanges()\n const done = this.db\n .prepare(\"SELECT COUNT(*) as count FROM steps WHERE plan_id = ? AND status = ?\")\n .get(planId, \"done\") as { count: number }\n const status: PlanStatus = done.count === total.count ? \"done\" : \"todo\"\n\n const plan = this.getPlan(planId)\n const changes = createEmptyStatusChanges()\n if (plan.status !== status) {\n const now = Date.now()\n const reason = done.count === total.count ? `all steps are done (${done.count}/${total.count})` : `steps done ${done.count}/${total.count}`\n this.db.prepare(\"UPDATE plans SET status = ?, updated_at = ? WHERE id = ?\").run(status, now, planId)\n changes.plans.push({ plan_id: planId, from: plan.status, to: status, reason })\n if (status === \"done\") {\n const clearedCurrent = this.clearActivePlansForPlanWithConn(planId)\n if (clearedCurrent) {\n changes.active_plans_cleared.push({ plan_id: planId, reason: \"plan marked done\" })\n }\n }\n }\n return changes\n }\n\n private refreshStepStatus(stepId: number): StatusChanges {\n const goals = this.db.prepare(\"SELECT * FROM goals WHERE step_id = ? ORDER BY id ASC\").all(stepId) as GoalRow[]\n if (!goals.length) return createEmptyStatusChanges()\n const doneCount = goals.filter((goal) => goal.status === \"done\").length\n const total = goals.length\n const status: StepStatus = doneCount === total ? \"done\" : \"todo\"\n\n const step = this.getStep(stepId)\n const changes = createEmptyStatusChanges()\n if (step.status !== status) {\n const now = Date.now()\n const reason = doneCount === total ? `all goals are done (${doneCount}/${total})` : `goals done ${doneCount}/${total}`\n this.db.prepare(\"UPDATE steps SET status = ?, updated_at = ? WHERE id = ?\").run(status, now, stepId)\n changes.steps.push({ step_id: stepId, from: step.status, to: status, reason })\n }\n mergeStatusChanges(changes, this.refreshPlanStatus(step.plan_id))\n return changes\n }\n\n private nextGoalForStep(stepId: number): GoalRow | null {\n const row = this.db\n .prepare(\"SELECT * FROM goals WHERE step_id = ? AND status = ? ORDER BY id ASC LIMIT 1\")\n .get(stepId, \"todo\") as GoalRow | undefined\n return row ?? null\n }\n\n private setAllGoalsDoneForStep(stepId: number): StatusChanges {\n this.getStep(stepId)\n const goals = this.goalsForStep(stepId)\n if (!goals.length) return createEmptyStatusChanges()\n const ids = goals.map((goal) => goal.id)\n return this.setGoalsStatus(ids, \"done\").changes\n }\n\n private touchPlan(planId: number) {\n const now = Date.now()\n if (this.cwd) {\n const result = this.db\n .prepare(\"UPDATE plans SET last_session_id = ?, last_cwd = ?, updated_at = ? WHERE id = ?\")\n .run(this.sessionId, this.cwd, now, planId)\n if (result.changes === 0) {\n throw notFound(`plan id ${planId}`)\n }\n } else {\n const result = this.db\n .prepare(\"UPDATE plans SET last_session_id = ?, updated_at = ? WHERE id = ?\")\n .run(this.sessionId, now, planId)\n if (result.changes === 0) {\n throw notFound(`plan id ${planId}`)\n }\n }\n }\n\n private touchPlans(planIds: number[]) {\n planIds.forEach((planId) => this.touchPlan(planId))\n }\n\n private normalizeStepsForPlan(planId: number) {\n const steps = this.db\n .prepare(\"SELECT * FROM steps WHERE plan_id = ? ORDER BY sort_order ASC, id ASC\")\n .all(planId) as StepRow[]\n this.normalizeStepsInPlace(steps)\n }\n\n private normalizeStepsInPlace(steps: StepRow[]) {\n const now = Date.now()\n steps.forEach((step, idx) => {\n const desired = idx + 1\n if (step.sort_order !== desired) {\n this.db.prepare(\"UPDATE steps SET sort_order = ?, updated_at = ? WHERE id = ?\").run(desired, now, step.id)\n step.sort_order = desired\n step.updated_at = now\n }\n })\n }\n\n private clearActivePlansForPlanWithConn(planId: number): boolean {\n const existing = this.db\n .prepare(\"SELECT * FROM active_plan WHERE plan_id = ?\")\n .all(planId) as ActivePlanRow[]\n const clearedCurrent = existing.some((row) => row.session_id === this.sessionId)\n this.db.prepare(\"DELETE FROM active_plan WHERE plan_id = ?\").run(planId)\n return clearedCurrent\n }\n}\n","export const PLANPILOT_HELP_TEXT = [\n \"Planpilot - Plan/Step/Goal auto-continue workflow.\",\n \"\",\n \"Model:\",\n \"- plan -> step -> goal\",\n \"- step.executor: ai | human\",\n \"- status rolls up: goals -> steps -> plan\",\n \"\",\n \"Rules (important):\",\n \"- Prefer assigning steps to ai. Use human steps only for actions that require human approval/credentials\",\n \" or elevated permissions / destructive operations (e.g. GitHub web UI, sudo, deleting data/files).\",\n \"- One step = one executor. Do NOT mix ai/human work within the same step.\",\n \" If a person must do something, create a separate human step.\",\n \"- Keep statuses up to date. Mark goals/steps done as soon as they are completed so roll-up and auto-continue stay correct.\",\n \"- `step wait` is ONLY for asynchronous, non-blocking external work that is already in progress\",\n \" (build/test/job/CI/network/remote service).\",\n \" If you can run something now, do it instead of waiting.\",\n \" Do NOT use `step wait` to wait for human action.\",\n \"- Keep comments short and decision-focused.\",\n \"\",\n \"Status propagation:\",\n \"- Step with goals: done iff ALL goals are done; else todo.\",\n \"- Plan with steps: done iff ALL steps are done; else todo.\",\n \"- Step with 0 goals: manual status (`step update` / `step done`).\",\n \"- Plan with 0 steps: manual status (`plan update` / `plan done`).\",\n \"- When a plan becomes done, it is removed from active plan.\",\n \"\",\n \"Auto-continue:\",\n \"- When the session is idle and an active plan exists:\",\n \" - if next pending step.executor is ai: Planpilot auto-sends the next step + goals.\",\n \" - if next pending step.executor is human: no auto-continue.\",\n \"- Pause while waiting on external systems: `step wait`.\",\n \"- Stop auto-continue:\",\n \" - `plan deactivate`, OR\",\n \" - insert a human step BEFORE the next pending ai step (so the next executor becomes human).\",\n \"\",\n \"Invocation:\",\n \"- argv is tokenized: [section, subcommand, ...args]\",\n \"- section: help | plan | step | goal\",\n \"\",\n \"Commands:\",\n \"- help\",\n \"\",\n \"Plan:\",\n \"- plan add-tree <title> <content> --step <content> [--executor ai|human] [--goal <content>]... [--step ...]...\",\n \"- plan list [--scope project|all] [--status todo|done|all] [--limit N] [--page N] [--order id|title|created|updated] [--desc]\",\n \"- plan count [--scope project|all] [--status todo|done|all]\",\n \"- plan search --search <term> [--search <term> ...] [--search-mode any|all] [--search-field plan|title|content|comment|steps|goals|all] [--match-case] [--scope project|all] [--status todo|done|all] [--limit N] [--page N] [--order id|title|created|updated] [--desc]\",\n \"- plan show <id>\",\n \"- plan export <id> <path>\",\n \"- plan comment <id> <comment> [<id> <comment> ...]\",\n \"- plan update <id> [--title <title>] [--content <content>] [--status todo|done] [--comment <comment>]\",\n \"- plan done <id>\",\n \"- plan remove <id>\",\n \"- plan activate <id> [--force]\",\n \"- plan show-active\",\n \"- plan deactivate\",\n \"\",\n \"Step:\",\n \"- step add <plan_id> <content...> [--executor ai|human] [--at <pos>]\",\n \"- step add-tree <plan_id> <content> [--executor ai|human] [--goal <content> ...]\",\n \"- step list <plan_id> [--status todo|done|all] [--executor ai|human] [--limit N] [--page N]\",\n \"- step count <plan_id> [--status todo|done|all] [--executor ai|human]\",\n \"- step show <id>\",\n \"- step show-next\",\n \"- step wait <id> --delay <ms> [--reason <text>]\",\n \"- step wait <id> --clear\",\n \"- step comment <id> <comment> [<id> <comment> ...]\",\n \"- step update <id> [--content <content>] [--status todo|done] [--executor ai|human] [--comment <comment>]\",\n \"- step done <id> [--all-goals]\",\n \"- step move <id> --to <pos>\",\n \"- step remove <id...>\",\n \"\",\n \"Goal:\",\n \"- goal add <step_id> <content...>\",\n \"- goal list <step_id> [--status todo|done|all] [--limit N] [--page N]\",\n \"- goal count <step_id> [--status todo|done|all]\",\n \"- goal show <id>\",\n \"- goal comment <id> <comment> [<id> <comment> ...]\",\n \"- goal update <id> [--content <content>] [--status todo|done] [--comment <comment>]\",\n \"- goal done <id...>\",\n \"- goal remove <id...>\",\n].join(\"\\n\")\n\nexport const PLANPILOT_TOOL_DESCRIPTION = [\n \"Planpilot planner for auto-continue plan workflows.\",\n \"For multi-step and complex tasks, use Planpilot to structure work into plans/steps/goals.\",\n \"Run `planpilot help` for full usage + rules.\",\n].join(\"\\n\")\n\nexport const PLANPILOT_SYSTEM_INJECTION =\n \"If the task is multi-step or complex, must use the `planpilot` plan tool. For full usage + rules, run: planpilot help.\"\n\nexport function formatPlanpilotAutoContinueMessage(input: {\n timestamp: string\n stepDetail: string\n triggerDetail?: string\n}): string {\n const detail = (input.stepDetail ?? \"\").trimEnd()\n const trigger = (input.triggerDetail ?? \"\").trim()\n return [\n `Planpilot @ ${input.timestamp}`,\n \"This message was automatically sent by the Planpilot tool because the next pending step executor is ai.\",\n ...(trigger ? [`Trigger context: ${trigger}`] : []),\n \"For full usage + rules, run: planpilot help\",\n \"Next step details:\",\n detail,\n ].join(\"\\n\")\n}\n","import fs from \"fs\"\nimport path from \"path\"\nimport { resolvePlanpilotDir } from \"./db\"\n\nexport type KeywordRule = {\n any: string[]\n all: string[]\n none: string[]\n matchCase: boolean\n}\n\nexport type EventRule = {\n enabled: boolean\n force: boolean\n keywords: KeywordRule\n}\n\nexport type SessionErrorRule = EventRule & {\n errorNames: string[]\n statusCodes: number[]\n retryableOnly: boolean\n}\n\nexport type SessionRetryRule = EventRule & {\n attemptAtLeast: number\n}\n\nexport type SendRetryConfig = {\n enabled: boolean\n maxAttempts: number\n delaysMs: number[]\n}\n\nexport type AutoContinueConfig = {\n sendRetry: SendRetryConfig\n onSessionError: SessionErrorRule\n onSessionRetry: SessionRetryRule\n onPermissionAsked: EventRule\n onPermissionRejected: EventRule\n onQuestionAsked: EventRule\n onQuestionRejected: EventRule\n}\n\nexport type RuntimeConfig = {\n paused: boolean\n}\n\nexport type PlanpilotConfig = {\n autoContinue: AutoContinueConfig\n runtime: RuntimeConfig\n}\n\nexport type LoadedPlanpilotConfig = {\n path: string\n loadedFromFile: boolean\n config: PlanpilotConfig\n loadError?: string\n}\n\nconst DEFAULT_KEYWORDS: KeywordRule = {\n any: [],\n all: [],\n none: [],\n matchCase: false,\n}\n\nconst DEFAULT_EVENT_RULE: EventRule = {\n enabled: false,\n force: false,\n keywords: DEFAULT_KEYWORDS,\n}\n\nconst DEFAULT_SESSION_ERROR_RULE: SessionErrorRule = {\n enabled: false,\n force: true,\n keywords: DEFAULT_KEYWORDS,\n errorNames: [],\n statusCodes: [],\n retryableOnly: false,\n}\n\nconst DEFAULT_SESSION_RETRY_RULE: SessionRetryRule = {\n enabled: false,\n force: false,\n keywords: DEFAULT_KEYWORDS,\n attemptAtLeast: 1,\n}\n\nconst DEFAULT_SEND_RETRY: SendRetryConfig = {\n enabled: true,\n maxAttempts: 3,\n delaysMs: [1500, 5000, 15000],\n}\n\nexport const DEFAULT_PLANPILOT_CONFIG: PlanpilotConfig = {\n autoContinue: {\n sendRetry: DEFAULT_SEND_RETRY,\n onSessionError: DEFAULT_SESSION_ERROR_RULE,\n onSessionRetry: DEFAULT_SESSION_RETRY_RULE,\n onPermissionAsked: DEFAULT_EVENT_RULE,\n onPermissionRejected: {\n ...DEFAULT_EVENT_RULE,\n force: true,\n },\n onQuestionAsked: DEFAULT_EVENT_RULE,\n onQuestionRejected: {\n ...DEFAULT_EVENT_RULE,\n force: true,\n },\n },\n runtime: {\n paused: false,\n },\n}\n\nexport function resolvePlanpilotConfigPath(): string {\n const override = process.env.OPENCODE_PLANPILOT_CONFIG\n if (override && override.trim()) {\n const value = override.trim()\n return path.isAbsolute(value) ? value : path.resolve(value)\n }\n return path.join(resolvePlanpilotDir(), \"config.json\")\n}\n\ntype RawKeywordRule = {\n any?: unknown\n all?: unknown\n none?: unknown\n matchCase?: unknown\n}\n\ntype RawEventRule = {\n enabled?: unknown\n force?: unknown\n keywords?: RawKeywordRule\n}\n\ntype RawSessionErrorRule = RawEventRule & {\n errorNames?: unknown\n statusCodes?: unknown\n retryableOnly?: unknown\n}\n\ntype RawSessionRetryRule = RawEventRule & {\n attemptAtLeast?: unknown\n}\n\ntype RawSendRetryConfig = {\n enabled?: unknown\n maxAttempts?: unknown\n delaysMs?: unknown\n}\n\ntype RawAutoContinueConfig = {\n sendRetry?: RawSendRetryConfig\n onSessionError?: RawSessionErrorRule\n onSessionRetry?: RawSessionRetryRule\n onPermissionAsked?: RawEventRule\n onPermissionRejected?: RawEventRule\n onQuestionAsked?: RawEventRule\n onQuestionRejected?: RawEventRule\n}\n\ntype RawRuntimeConfig = {\n paused?: unknown\n}\n\ntype RawPlanpilotConfig = {\n autoContinue?: RawAutoContinueConfig\n runtime?: RawRuntimeConfig\n}\n\nfunction cloneDefaultConfig(): PlanpilotConfig {\n return {\n autoContinue: {\n sendRetry: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.sendRetry.enabled,\n maxAttempts: DEFAULT_PLANPILOT_CONFIG.autoContinue.sendRetry.maxAttempts,\n delaysMs: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.sendRetry.delaysMs],\n },\n onSessionError: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.keywords.matchCase,\n },\n errorNames: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.errorNames],\n statusCodes: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.statusCodes],\n retryableOnly: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError.retryableOnly,\n },\n onSessionRetry: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.keywords.matchCase,\n },\n attemptAtLeast: DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry.attemptAtLeast,\n },\n onPermissionAsked: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked.keywords.matchCase,\n },\n },\n onPermissionRejected: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected.keywords.matchCase,\n },\n },\n onQuestionAsked: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked.keywords.matchCase,\n },\n },\n onQuestionRejected: {\n enabled: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.enabled,\n force: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.force,\n keywords: {\n any: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.keywords.any],\n all: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.keywords.all],\n none: [...DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.keywords.none],\n matchCase: DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected.keywords.matchCase,\n },\n },\n },\n runtime: {\n paused: DEFAULT_PLANPILOT_CONFIG.runtime.paused,\n },\n }\n}\n\nfunction parseBoolean(value: unknown, fallback: boolean): boolean {\n if (typeof value === \"boolean\") return value\n return fallback\n}\n\nfunction parseStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const parsed = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0)\n return Array.from(new Set(parsed))\n}\n\nfunction parseNumberArray(value: unknown): number[] {\n if (!Array.isArray(value)) return []\n const parsed = value\n .map((item) => (typeof item === \"number\" ? item : Number.NaN))\n .filter((item) => Number.isFinite(item))\n .map((item) => Math.trunc(item))\n return Array.from(new Set(parsed))\n}\n\nfunction parsePositiveInt(value: unknown, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback\n const parsed = Math.trunc(value)\n return parsed > 0 ? parsed : fallback\n}\n\nfunction parsePositiveNumberArray(value: unknown, fallback: number[]): number[] {\n if (!Array.isArray(value)) return fallback\n const parsed = value\n .map((item) => (typeof item === \"number\" ? item : Number.NaN))\n .filter((item) => Number.isFinite(item))\n .map((item) => Math.trunc(item))\n .filter((item) => item > 0)\n if (!parsed.length) return fallback\n return Array.from(new Set(parsed))\n}\n\nfunction parseKeywordRule(value: RawKeywordRule | undefined, fallback: KeywordRule): KeywordRule {\n return {\n any: parseStringArray(value?.any),\n all: parseStringArray(value?.all),\n none: parseStringArray(value?.none),\n matchCase: parseBoolean(value?.matchCase, fallback.matchCase),\n }\n}\n\nfunction parseEventRule(value: RawEventRule | undefined, fallback: EventRule): EventRule {\n return {\n enabled: parseBoolean(value?.enabled, fallback.enabled),\n force: parseBoolean(value?.force, fallback.force),\n keywords: parseKeywordRule(value?.keywords, fallback.keywords),\n }\n}\n\nfunction parseSessionErrorRule(value: RawSessionErrorRule | undefined, fallback: SessionErrorRule): SessionErrorRule {\n const base = parseEventRule(value, fallback)\n return {\n ...base,\n errorNames: parseStringArray(value?.errorNames),\n statusCodes: parseNumberArray(value?.statusCodes),\n retryableOnly: parseBoolean(value?.retryableOnly, fallback.retryableOnly),\n }\n}\n\nfunction parseSessionRetryRule(value: RawSessionRetryRule | undefined, fallback: SessionRetryRule): SessionRetryRule {\n const base = parseEventRule(value, fallback)\n const rawAttempt = typeof value?.attemptAtLeast === \"number\" ? Math.trunc(value.attemptAtLeast) : fallback.attemptAtLeast\n return {\n ...base,\n attemptAtLeast: rawAttempt > 0 ? rawAttempt : fallback.attemptAtLeast,\n }\n}\n\nfunction parseSendRetryConfig(value: RawSendRetryConfig | undefined, fallback: SendRetryConfig): SendRetryConfig {\n return {\n enabled: parseBoolean(value?.enabled, fallback.enabled),\n maxAttempts: parsePositiveInt(value?.maxAttempts, fallback.maxAttempts),\n delaysMs: parsePositiveNumberArray(value?.delaysMs, fallback.delaysMs),\n }\n}\n\nfunction parseConfig(raw: RawPlanpilotConfig): PlanpilotConfig {\n return {\n autoContinue: {\n sendRetry: parseSendRetryConfig(raw.autoContinue?.sendRetry, DEFAULT_PLANPILOT_CONFIG.autoContinue.sendRetry),\n onSessionError: parseSessionErrorRule(\n raw.autoContinue?.onSessionError,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionError,\n ),\n onSessionRetry: parseSessionRetryRule(\n raw.autoContinue?.onSessionRetry,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onSessionRetry,\n ),\n onPermissionAsked: parseEventRule(\n raw.autoContinue?.onPermissionAsked,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionAsked,\n ),\n onPermissionRejected: parseEventRule(\n raw.autoContinue?.onPermissionRejected,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onPermissionRejected,\n ),\n onQuestionAsked: parseEventRule(\n raw.autoContinue?.onQuestionAsked,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionAsked,\n ),\n onQuestionRejected: parseEventRule(\n raw.autoContinue?.onQuestionRejected,\n DEFAULT_PLANPILOT_CONFIG.autoContinue.onQuestionRejected,\n ),\n },\n runtime: {\n paused: parseBoolean(raw.runtime?.paused, DEFAULT_PLANPILOT_CONFIG.runtime.paused),\n },\n }\n}\n\nexport function normalizePlanpilotConfig(raw: unknown): PlanpilotConfig {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return cloneDefaultConfig()\n }\n return parseConfig(raw as RawPlanpilotConfig)\n}\n\nexport function savePlanpilotConfig(config: PlanpilotConfig): LoadedPlanpilotConfig {\n const filePath = resolvePlanpilotConfigPath()\n const normalized = normalizePlanpilotConfig(config)\n const parentDir = path.dirname(filePath)\n fs.mkdirSync(parentDir, { recursive: true })\n fs.writeFileSync(filePath, `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\")\n return {\n path: filePath,\n loadedFromFile: true,\n config: normalized,\n }\n}\n\nexport function loadPlanpilotConfig(): LoadedPlanpilotConfig {\n const filePath = resolvePlanpilotConfigPath()\n try {\n if (!fs.existsSync(filePath)) {\n return {\n path: filePath,\n loadedFromFile: false,\n config: cloneDefaultConfig(),\n }\n }\n const text = fs.readFileSync(filePath, \"utf8\")\n const parsed = JSON.parse(text) as unknown\n return {\n path: filePath,\n loadedFromFile: true,\n config: normalizePlanpilotConfig(parsed),\n }\n } catch (error) {\n const loadError = error instanceof Error ? error.message : String(error)\n return {\n path: filePath,\n loadedFromFile: false,\n config: cloneDefaultConfig(),\n loadError,\n }\n }\n}\n\nexport function matchesKeywords(text: string, rule: KeywordRule): boolean {\n const source = rule.matchCase ? text : text.toLowerCase()\n const normalize = (value: string) => (rule.matchCase ? value : value.toLowerCase())\n const any = rule.any.map(normalize)\n const all = rule.all.map(normalize)\n const none = rule.none.map(normalize)\n\n if (any.length > 0 && !any.some((term) => source.includes(term))) {\n return false\n }\n if (!all.every((term) => source.includes(term))) {\n return false\n }\n if (none.some((term) => source.includes(term))) {\n return false\n }\n return true\n}\n"],"mappings":"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","names":["fs","fs","path","fs","path","fs","result","fs","path","path","fs","log"]}