@dendelion/paper-camp 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/app/assets/main-B61tEYvn.css +1 -0
- package/dist/app/assets/main-tAEncq68.js +272 -0
- package/dist/app/assets/main-tAEncq68.js.map +1 -0
- package/dist/app/fonts/Luminari-Regular.woff +0 -0
- package/dist/app/index.html +18 -0
- package/dist/chunks/serializer.D1Ts_p8h.js +462 -0
- package/dist/chunks/serializer.D1Ts_p8h.js.map +1 -0
- package/dist/cli/index.js +1250 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/core/env.d.ts +9 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +35 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parser.d.ts +16 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.test.d.ts +2 -0
- package/dist/core/parser.test.d.ts.map +1 -0
- package/dist/core/scaffold.d.ts +14 -0
- package/dist/core/scaffold.d.ts.map +1 -0
- package/dist/core/schemas.d.ts +78 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/serializer.d.ts +51 -0
- package/dist/core/serializer.d.ts.map +1 -0
- package/dist/core.d.ts +2 -0
- package/dist/fonts/Luminari-Regular.woff +0 -0
- package/dist/types/index.d.ts +132 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/app/server/activity.ts","../../src/app/server/agents/claude-code.ts","../../src/app/server/agents/opencode.ts","../../src/app/server/agents/index.ts","../../src/app/server/agent.ts","../../src/app/server/git.ts","../../src/app/server/status.ts","../../src/app/server/api.ts","../../src/cli/dev-server.ts","../../src/cli/index.ts"],"sourcesContent":["import { watch } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport type { ServerResponse } from 'node:http';\nimport { join } from 'node:path';\nimport { parseDecisions, parseOpenQuestions, parsePlans, parseProgress } from '../../core/parser';\nimport type { DecisionEntry, OpenQuestionEntry, PlanEntry, ProgressEntry } from '../../types';\n\nexport interface ActivityEvent {\n message: string;\n timestamp: string;\n}\n\ninterface Snapshot {\n plans: PlanEntry[];\n decisions: DecisionEntry[];\n openQuestions: OpenQuestionEntry[];\n progress: ProgressEntry[];\n}\n\nconst campFile = (root: string, name: string) => join(root, 'papercamp', name);\n\nconst readMaybe = (path: string): Promise<string> => readFile(path, 'utf-8').catch(() => '');\n\nasync function takeSnapshot(root: string): Promise<Snapshot> {\n const [plansRaw, decisionsRaw, questionsRaw, progressRaw] = await Promise.all([\n readMaybe(campFile(root, 'plans.md')),\n readMaybe(campFile(root, 'decisions.md')),\n readMaybe(campFile(root, 'open-questions.md')),\n readMaybe(campFile(root, 'progress.md')),\n ]);\n return {\n plans: parsePlans(plansRaw).entries,\n decisions: parseDecisions(decisionsRaw).entries,\n openQuestions: parseOpenQuestions(questionsRaw).entries,\n progress: parseProgress(progressRaw),\n };\n}\n\nfunction diffAndSynthesize(before: Snapshot, after: Snapshot): ActivityEvent[] {\n const events: ActivityEvent[] = [];\n const ts = new Date().toISOString();\n\n const beforePlans = new Map(before.plans.map((p) => [p.title, p]));\n const afterPlans = new Map(after.plans.map((p) => [p.title, p]));\n\n for (const [title, afterP] of afterPlans) {\n const beforeP = beforePlans.get(title);\n if (!beforeP) {\n events.push({ message: `New plan added: ${title}`, timestamp: ts });\n } else if (beforeP.status !== afterP.status) {\n events.push({ message: `Plan \"${title}\" marked ${afterP.status}`, timestamp: ts });\n } else {\n for (let i = 0; i < afterP.phases.length; i++) {\n const beforePhase = beforeP.phases[i];\n const afterPhase = afterP.phases[i];\n if (beforePhase && beforePhase.done !== afterPhase.done) {\n events.push({\n message: afterPhase.done\n ? `Phase ${i + 1}/${afterP.phases.length} checked off in \"${title}\"`\n : `Phase ${i + 1}/${afterP.phases.length} unchecked in \"${title}\"`,\n timestamp: ts,\n });\n }\n }\n }\n }\n\n for (const [title] of beforePlans) {\n if (!afterPlans.has(title)) {\n events.push({ message: `Plan removed: ${title}`, timestamp: ts });\n }\n }\n\n const beforeDecisions = new Map(before.decisions.map((d) => [d.title, d]));\n const afterDecisions = new Map(after.decisions.map((d) => [d.title, d]));\n for (const [title] of afterDecisions) {\n if (!beforeDecisions.has(title)) {\n events.push({ message: `New decision: ${title}`, timestamp: ts });\n }\n }\n\n const beforeQuestions = new Map(before.openQuestions.map((q) => [q.title, q]));\n const afterQuestions = new Map(after.openQuestions.map((q) => [q.title, q]));\n for (const [title] of afterQuestions) {\n if (!beforeQuestions.has(title)) {\n events.push({ message: `New open question: ${title}`, timestamp: ts });\n }\n }\n\n const beforeProgress = new Map(before.progress.map((p) => [p.date, p]));\n const afterProgress = new Map(after.progress.map((p) => [p.date, p]));\n for (const [date] of afterProgress) {\n if (!beforeProgress.has(date)) {\n events.push({ message: `Progress logged: ${date}`, timestamp: ts });\n }\n }\n\n return events;\n}\n\nexport function createActivityManager(root: string) {\n const clients = new Set<ServerResponse>();\n let snapshot: Snapshot | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const files = ['plans.md', 'decisions.md', 'open-questions.md', 'progress.md'];\n\n async function check() {\n try {\n const next = await takeSnapshot(root);\n if (snapshot) {\n const events = diffAndSynthesize(snapshot, next);\n for (const event of events) {\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\n for (const client of clients) {\n try {\n client.write(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n }\n snapshot = next;\n } catch {\n // re-parse failed, keep the old snapshot\n }\n }\n\n for (const file of files) {\n const filePath = campFile(root, file);\n try {\n watch(filePath, () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(check, 300);\n });\n } catch {\n // file might not exist yet\n }\n }\n\n takeSnapshot(root).then((s) => {\n snapshot = s;\n });\n\n return {\n subscribe(res: ServerResponse) {\n clients.add(res);\n const connected = JSON.stringify({\n message: 'Watching for changes…',\n timestamp: new Date().toISOString(),\n });\n res.write(`data: ${connected}\\n\\n`);\n res.on('close', () => clients.delete(res));\n },\n };\n}\n","export interface ParsedAgentLine {\n text: string;\n done?: boolean;\n error?: boolean;\n}\n\nexport function buildArgs(prompt: string): string[] {\n return ['-p', prompt, '--output-format', 'stream-json', '--verbose', '--permission-mode', 'auto'];\n}\n\n/**\n * Shape confirmed by a live `claude -p ... --output-format stream-json` smoke test\n * (see decisions.md, \"Confirm Claude Code's headless stream-json shape...\"), not guessed\n * from --help. Unknown subtypes fall through to a generic status line rather than being\n * dropped or throwing, since new bookkeeping subtypes (e.g. thinking_tokens) can appear.\n */\nexport function parseLine(line: string): ParsedAgentLine | null {\n let json: Record<string, unknown>;\n try {\n json = JSON.parse(line);\n } catch {\n return null;\n }\n\n switch (json.type) {\n case 'system': {\n if (json.subtype === 'init') {\n return { text: 'Agent session started' };\n }\n if (json.subtype === 'post_turn_summary' && typeof json.status_detail === 'string') {\n return { text: json.status_detail };\n }\n return null;\n }\n case 'rate_limit_event':\n return null;\n case 'assistant': {\n const message = json.message as { content?: unknown[] } | undefined;\n const blocks = message?.content ?? [];\n for (const block of blocks) {\n const b = block as { type?: string; name?: string; text?: string };\n if (b.type === 'tool_use') {\n return { text: `Running ${b.name ?? 'a tool'}…` };\n }\n if (b.type === 'text' && typeof b.text === 'string' && b.text.trim()) {\n return { text: b.text.trim() };\n }\n }\n return null;\n }\n case 'user': {\n const message = json.message as { content?: unknown[] } | undefined;\n const content = message?.content;\n const block = Array.isArray(content) ? (content[0] as Record<string, unknown>) : undefined;\n if (block?.is_error) {\n const text = typeof block.content === 'string' ? block.content : 'Tool call failed';\n return { text: `Error: ${text}`, error: true };\n }\n return { text: 'Tool finished' };\n }\n case 'result': {\n const error = Boolean(json.is_error);\n const result = typeof json.result === 'string' ? json.result.trim() : '';\n const text = result || (error ? 'Agent run failed' : 'Agent run finished');\n return { text, done: true, error };\n }\n default:\n return { text: 'Agent is working…' };\n }\n}\n","import type { ParsedAgentLine } from './claude-code';\n\nexport function buildArgs(prompt: string): string[] {\n return ['run', prompt, '--format', 'json'];\n}\n\nconst TOOL_LABELS: Record<string, string> = {\n bash: 'Running command',\n read: 'Reading file',\n edit: 'Editing file',\n write: 'Writing file',\n glob: 'Searching files',\n grep: 'Searching code',\n websearch: 'Searching web',\n webfetch: 'Fetching URL',\n question: 'Asking for input',\n};\n\nexport function parseLine(line: string): ParsedAgentLine | null {\n let json: Record<string, unknown>;\n try {\n json = JSON.parse(line);\n } catch {\n return null;\n }\n\n const type = json.type as string | undefined;\n const part = json.part as Record<string, unknown> | undefined;\n\n if (!type || !part) return null;\n\n switch (type) {\n case 'step_start':\n return null;\n case 'text': {\n const text = part.text as string | undefined;\n if (text?.trim()) return { text: text.trim() };\n return null;\n }\n case 'tool_use': {\n const tool = part.tool as string | undefined;\n const input = part.state ? (part.state as Record<string, unknown>).input : undefined;\n const desc = input ? (input as Record<string, unknown>).description : undefined;\n const label = tool ? TOOL_LABELS[tool] : 'Running tool';\n const detail = typeof desc === 'string' && desc.trim() ? `: ${desc.trim()}` : '';\n return tool ? { text: `${label}${detail}…` } : null;\n }\n case 'step_finish': {\n const reason = part.reason as string | undefined;\n const text = reason === 'tool-calls' ? null : reason === 'stop' ? 'Done' : 'Step finished';\n if (!text) return null;\n return { text };\n }\n default:\n return null;\n }\n}\n","import type { AgentId, DefaultAgentsMap, TaskKind } from '../../../types/index';\nimport * as claudeCode from './claude-code';\nimport type { ParsedAgentLine } from './claude-code';\nimport * as opencode from './opencode';\n\nexport interface AgentAdapter {\n command: string;\n buildArgs: (prompt: string) => string[];\n parseLine: (line: string) => ParsedAgentLine | null;\n}\n\nexport const DEFAULT_AGENT_ID: AgentId = 'claude-code';\n\nexport const AGENTS: Record<AgentId, AgentAdapter> = {\n 'claude-code': {\n command: 'claude',\n buildArgs: claudeCode.buildArgs,\n parseLine: claudeCode.parseLine,\n },\n opencode: {\n command: 'opencode',\n buildArgs: opencode.buildArgs,\n parseLine: opencode.parseLine,\n },\n};\n\nconst TASK_KIND_TO_DEFAULT_KEY: Record<TaskKind, keyof DefaultAgentsMap> = {\n phase: 'phase',\n audit: 'phase',\n draft: 'planDraft',\n extend: 'ideaExtend',\n};\n\nexport function resolveAgent(opts: {\n agentId: AgentId | undefined;\n defaultAgents?: DefaultAgentsMap;\n taskKind?: TaskKind;\n}): { id: AgentId; adapter: AgentAdapter } {\n const { agentId, defaultAgents, taskKind } = opts;\n if (agentId && agentId in AGENTS) return { id: agentId, adapter: AGENTS[agentId] };\n if (taskKind && defaultAgents) {\n const key = TASK_KIND_TO_DEFAULT_KEY[taskKind];\n const fallback = defaultAgents[key];\n if (fallback && fallback in AGENTS) return { id: fallback, adapter: AGENTS[fallback] };\n }\n return { id: DEFAULT_AGENT_ID, adapter: AGENTS[DEFAULT_AGENT_ID] };\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport type { ServerResponse } from 'node:http';\nimport { join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { parseIdeas, parsePlans } from '../../core/parser';\nimport {\n type AgentId,\n type AgentTaskState,\n type AgentTaskStatus,\n DEFAULT_AGENTS,\n type DefaultAgentsMap,\n type IdeaEntry,\n type PaperCampConfig,\n type PhaseItem,\n type PlanEntry,\n type TaskKind,\n} from '../../types/index';\nimport { type AgentAdapter, resolveAgent } from './agents';\n\nconst MAX_LINES = 50;\n\ninterface AgentTask {\n taskKind: TaskKind;\n planTitle: string;\n planId?: string;\n // Absent for a plan-scoped task (e.g. a convergence audit spanning every phase),\n // present for a single-phase task.\n phaseIndex?: number;\n // Only set for plan-scoped tasks, to check success against: did Phases or Log grow?\n planBaseline?: { phases: number; log: number };\n // Only set for an idea-drafting task, which has neither planId nor phaseIndex since\n // the plan doesn't exist yet — success is checked by idea id instead.\n ideaId?: string;\n // For idea-extend tasks: snapshot the idea's body before launch so we can detect changes.\n ideaBodyBaseline?: string;\n status: AgentTaskStatus;\n agentId: AgentId;\n adapter: AgentAdapter;\n proc: ChildProcess;\n lines: string[];\n}\n\nfunction readDefaultAgentIds(root: string): DefaultAgentsMap {\n try {\n const raw = readFileSync(join(root, '.paper-camp', 'config.json'), 'utf-8');\n const config = JSON.parse(raw) as PaperCampConfig & { defaultAgent?: AgentId };\n if (config.defaultAgents) return config.defaultAgents;\n if (config.defaultAgent) {\n return {\n phase: config.defaultAgent,\n planDraft: config.defaultAgent,\n ideaExtend: config.defaultAgent,\n };\n }\n return DEFAULT_AGENTS;\n } catch {\n return DEFAULT_AGENTS;\n }\n}\n\ntype Result = { ok: true } | { ok: false; error: string };\n\nfunction buildAgentPrompt(plan: PlanEntry, phase: PhaseItem, phaseIndex: number): string {\n return `You're working on phase ${phaseIndex + 1} (\"${phase.text}\") of the plan \"${plan.title}\" (${plan.id ?? 'no id'}) in papercamp/plans.md.\n\n${phase.description ?? ''}\n\nPlan context: ${plan.body}\n\nDo only this phase. When done, check it off in plans.md (- [ ] -> - [x]) and append what you did to progress.md. If this was the last unchecked phase, set the plan's Status to \\`review\\`, not \\`done\\`, per this repo's AGENTS.md.`;\n}\n\nexport function createAgentManager(\n root: string,\n ensureBranch: (plan: PlanEntry) => void = () => {},\n) {\n const clients = new Set<ServerResponse>();\n let current: AgentTask | null = null;\n\n function broadcast(message: string) {\n const data = `data: ${JSON.stringify({ message, timestamp: new Date().toISOString(), type: 'agent' })}\\n\\n`;\n for (const client of clients) {\n try {\n client.write(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n\n function pushLine(task: AgentTask, text: string) {\n task.lines.push(text);\n if (task.lines.length > MAX_LINES) task.lines.shift();\n broadcast(text);\n }\n\n function setStatus(task: AgentTask, status: AgentTaskStatus) {\n task.status = status;\n broadcast(`agent: ${status}`);\n }\n\n async function didTaskProgress(task: AgentTask): Promise<boolean | null> {\n try {\n if (task.taskKind === 'extend') {\n const raw = await readFile(join(root, 'papercamp', 'ideas.md'), 'utf-8');\n const entries = parseIdeas(raw);\n const idea = entries.find((e) => e.id === task.ideaId);\n if (!idea) return null;\n if (task.ideaBodyBaseline === undefined) return null;\n return idea.body !== task.ideaBodyBaseline;\n }\n const raw = await readFile(join(root, 'papercamp', 'plans.md'), 'utf-8');\n const { entries } = parsePlans(raw);\n if (task.ideaId !== undefined) {\n return entries.some((p) => p.idea === task.ideaId);\n }\n const plan =\n entries.find((p) => p.id === task.planId) ??\n entries.find((p) => p.title === task.planTitle);\n if (!plan) return null;\n if (task.phaseIndex !== undefined) {\n return plan.phases[task.phaseIndex]?.done ?? null;\n }\n if (!task.planBaseline) return null;\n return (\n plan.phases.length > task.planBaseline.phases ||\n (plan.log?.length ?? 0) > task.planBaseline.log\n );\n } catch {\n return null;\n }\n }\n\n function finishTask(task: AgentTask, error: boolean) {\n setStatus(task, error ? 'error' : 'done');\n if (error) return;\n didTaskProgress(task).then((progressed) => {\n if (current === task && progressed === false) {\n const warning =\n task.taskKind === 'extend'\n ? `Warning: agent finished but the idea body for ${task.ideaId} did not change — verify manually`\n : task.ideaId !== undefined\n ? `Warning: agent finished but no plan linking idea: ${task.ideaId} appeared in plans.md — verify manually`\n : task.phaseIndex !== undefined\n ? 'Warning: agent finished but did not check off this phase in plans.md — verify manually'\n : 'Warning: agent finished but appended nothing to Phases or Log — verify manually';\n pushLine(task, warning);\n }\n });\n }\n\n function attachReader(task: AgentTask) {\n if (!task.proc.stdout) return;\n const rl = createInterface({ input: task.proc.stdout });\n rl.on('line', (line) => {\n if (current !== task || !line.trim()) return;\n const parsed = task.adapter.parseLine(line);\n if (!parsed) return;\n pushLine(task, parsed.text);\n if (parsed.done) {\n finishTask(task, Boolean(parsed.error));\n }\n });\n\n task.proc.on('close', (code) => {\n if (current !== task) return;\n if (task.status === 'starting' || task.status === 'running') {\n finishTask(task, code !== 0);\n } else if (task.status === 'stopping') {\n setStatus(task, 'done');\n }\n });\n\n task.proc.on('error', (err) => {\n if (current !== task) return;\n pushLine(task, `Failed to spawn agent: ${err.message}`);\n setStatus(task, 'error');\n });\n }\n\n function spawnAgent(adapter: AgentAdapter, args: string[]): ChildProcess {\n return spawn(adapter.command, args, {\n cwd: root,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n }\n\n function isBusy(): boolean {\n return current !== null && current.status !== 'done' && current.status !== 'error';\n }\n\n // Shared by start()/startForPlan()/startForIdea(): synchronous on purpose, same\n // race-avoidance reasoning as the busy-guard above — no `await` between the guard\n // check and reserving `current`.\n function launch(\n identity: { planTitle: string; planId?: string; agentOverride?: AgentId },\n prompt: string,\n scope: Pick<\n AgentTask,\n 'taskKind' | 'phaseIndex' | 'planBaseline' | 'ideaId' | 'ideaBodyBaseline'\n >,\n ): Result {\n if (isBusy()) {\n return { ok: false, error: 'An agent task is already running' };\n }\n const defaultAgents = readDefaultAgentIds(root);\n const { id: agentId, adapter } = resolveAgent({\n agentId: identity.agentOverride,\n defaultAgents,\n taskKind: scope.taskKind,\n });\n const proc = spawnAgent(adapter, adapter.buildArgs(prompt));\n const task: AgentTask = {\n planTitle: identity.planTitle,\n planId: identity.planId,\n status: 'starting',\n agentId,\n adapter,\n proc,\n lines: [],\n ...scope,\n };\n current = task;\n attachReader(task);\n setStatus(task, 'running');\n return { ok: true };\n }\n\n function start(plan: PlanEntry, phaseIndex: number): Result {\n if (isBusy()) {\n return { ok: false, error: 'An agent task is already running' };\n }\n const phase = plan.phases[phaseIndex];\n if (!phase) {\n return { ok: false, error: 'Phase not found' };\n }\n ensureBranch(plan);\n const prompt = buildAgentPrompt(plan, phase, phaseIndex);\n return launch({ planTitle: plan.title, planId: plan.id, agentOverride: plan.agent }, prompt, {\n taskKind: 'phase',\n phaseIndex,\n });\n }\n\n // Plan-scoped launch mode: no single phase, so success is judged by whether the\n // agent appended anything to Phases or Log rather than whether one checkbox flipped.\n function startForPlan(plan: PlanEntry, prompt: string): Result {\n return launch({ planTitle: plan.title, planId: plan.id, agentOverride: plan.agent }, prompt, {\n taskKind: 'audit',\n planBaseline: { phases: plan.phases.length, log: plan.log?.length ?? 0 },\n });\n }\n\n // Idea-drafting launch mode: there's no plan yet (and so no per-plan agent override\n // either) — the plan only exists once the agent writes it, so success is judged by\n // whether a new plan entry linking this idea's id shows up in plans.md.\n function startForIdea(idea: IdeaEntry, prompt: string): Result {\n if (!idea.id) {\n return { ok: false, error: 'Idea has no id to link a drafted plan back to' };\n }\n return launch({ planTitle: `Draft plan for ${idea.id}` }, prompt, {\n taskKind: 'draft',\n ideaId: idea.id,\n });\n }\n\n // Idea-extend launch mode: given an idea, explores the codebase and rewrites its\n // body in place in ideas.md. Success is judged by whether that idea's body text\n // actually changed.\n function startForIdeaExtend(idea: IdeaEntry, prompt: string): Result {\n if (!idea.id) {\n return { ok: false, error: 'Idea has no id to extend' };\n }\n return launch({ planTitle: `Extend ${idea.id}` }, prompt, {\n taskKind: 'extend',\n ideaId: idea.id,\n ideaBodyBaseline: idea.body,\n });\n }\n\n function stop(): Result {\n if (!current) {\n return { ok: false, error: 'No agent task running' };\n }\n const task = current;\n setStatus(task, 'stopping');\n if (!task.proc.killed) task.proc.kill('SIGTERM');\n // SIGTERM can be ignored or delayed indefinitely; without this escalation a hung\n // process leaves `current` stuck in 'stopping' forever, permanently blocking start().\n setTimeout(() => {\n if (current === task && task.status === 'stopping') {\n task.proc.kill('SIGKILL');\n }\n }, 5000);\n return { ok: true };\n }\n\n function getStatus(): AgentTaskState | null {\n if (!current) return null;\n return {\n status: current.status,\n taskKind: current.taskKind,\n planTitle: current.planTitle,\n planId: current.planId,\n phaseIndex: current.phaseIndex,\n ideaId: current.ideaId,\n agentId: current.agentId,\n lines: [...current.lines],\n };\n }\n\n return {\n start,\n startForPlan,\n startForIdea,\n startForIdeaExtend,\n stop,\n getStatus,\n subscribe(res: ServerResponse) {\n clients.add(res);\n res.on('close', () => clients.delete(res));\n },\n killCurrent() {\n if (current?.proc && !current.proc.killed) {\n current.proc.kill();\n }\n },\n };\n}\n\nexport interface AgentManager {\n start: (plan: PlanEntry, phaseIndex: number) => Result;\n startForPlan: (plan: PlanEntry, prompt: string) => Result;\n startForIdea: (idea: IdeaEntry, prompt: string) => Result;\n startForIdeaExtend: (idea: IdeaEntry, prompt: string) => Result;\n stop: () => Result;\n getStatus: () => AgentTaskState | null;\n subscribe: (res: ServerResponse) => void;\n killCurrent: () => void;\n}\n","import { spawn, spawnSync } from 'node:child_process';\nimport { watch } from 'node:fs';\nimport type { ServerResponse } from 'node:http';\nimport { join } from 'node:path';\nimport type { GitStatusEntry, PlanEntry } from '../../types';\n\nexport function createGitManager(root: string) {\n const clients = new Set<ServerResponse>();\n\n function broadcast(event: { message: string; timestamp: string }) {\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\n for (const client of clients) {\n try {\n client.write(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n\n function parsePorcelain(output: string): GitStatusEntry[] {\n const entries: GitStatusEntry[] = [];\n for (const line of output.split('\\n')) {\n if (!line.trim()) continue;\n const x = line[0] ?? ' ';\n const y = line[1] ?? ' ';\n const rest = line.slice(3);\n const path = rest.split(' -> ').pop() ?? rest;\n entries.push({\n path,\n status: `${x}${y}`,\n staged: x !== ' ' && x !== '?',\n });\n }\n return entries;\n }\n\n function runGit(args: string[]): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd: root,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n let stdout = '';\n let stderr = '';\n proc.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString();\n });\n proc.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString();\n });\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout);\n } else {\n reject(new Error(stderr || `git ${args[0]} exited with code ${code}`));\n }\n });\n proc.on('error', reject);\n });\n }\n\n function runGitStatus(): Promise<GitStatusEntry[]> {\n return runGit(['status', '--porcelain=v1']).then(parsePorcelain);\n }\n\n async function commit(files: string[], title: string, message?: string): Promise<void> {\n if (files.length > 0) {\n await runGit(['add', '--', ...files]);\n }\n const args = ['commit', '-m', title];\n if (message) args.push('-m', message);\n await runGit(args);\n }\n\n function ensureBranch(plan: PlanEntry): void {\n if (!plan.kind || !plan.id) return;\n\n const kind = plan.kind.toLowerCase();\n const id = plan.id.toLowerCase();\n const title = plan.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n const branch = `${kind}/${id}-${title}`;\n\n const currentResult = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: root });\n if (currentResult.status !== 0) {\n throw new Error(\n currentResult.stderr.toString().trim() || 'Unable to read current git branch',\n );\n }\n const currentBranch = currentResult.stdout.toString().trim();\n if (currentBranch === branch) return;\n\n const result = spawnSync('git', ['checkout', '-b', branch, 'main'], { cwd: root });\n if (result.status !== 0) {\n // Branch already exists — just check it out\n const checkoutResult = spawnSync('git', ['checkout', branch], { cwd: root });\n if (checkoutResult.status !== 0) {\n throw new Error(\n checkoutResult.stderr.toString().trim() ||\n result.stderr.toString().trim() ||\n `Unable to check out ${branch}`,\n );\n }\n }\n }\n\n async function refresh() {\n try {\n await runGitStatus();\n broadcast({\n message: 'Working tree status updated',\n timestamp: new Date().toISOString(),\n });\n } catch {\n // git not available or not a repo\n }\n }\n\n const gitDir = join(root, '.git');\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n watch(gitDir, { recursive: true }, (eventType, filename) => {\n if (filename === 'index') {\n if (timer) clearTimeout(timer);\n timer = setTimeout(refresh, 500);\n }\n });\n } catch {\n // watcher not available\n }\n\n const srcDir = join(root, 'src');\n let srcTimer: ReturnType<typeof setTimeout> | null = null;\n try {\n watch(srcDir, { recursive: true }, () => {\n if (srcTimer) clearTimeout(srcTimer);\n srcTimer = setTimeout(refresh, 500);\n });\n } catch {\n // src/ doesn't exist or watcher not available\n }\n\n function getCurrentBranch(): string {\n const result = spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: root });\n return result.stdout.toString().trim();\n }\n\n function getFeatureBranchPlanId(): string | null {\n const branch = getCurrentBranch();\n const match = branch.match(/^[a-z]+\\/([a-z]+-\\d+)-/);\n return match ? match[1].toUpperCase() : null;\n }\n\n return {\n async getStatus(): Promise<GitStatusEntry[]> {\n return runGitStatus();\n },\n getCurrentBranch,\n commit,\n ensureBranch,\n getFeatureBranchPlanId,\n subscribe(res: ServerResponse) {\n clients.add(res);\n res.on('close', () => clients.delete(res));\n },\n };\n}\n","import { spawn } from 'node:child_process';\nimport { watch } from 'node:fs';\nimport type { ServerResponse } from 'node:http';\nimport { join } from 'node:path';\nimport type { CheckName, CheckResult, CheckStatus } from '../../types';\n\ninterface StatusSnapshot {\n lint: CheckResult;\n format: CheckResult;\n test: CheckResult;\n}\n\nconst CHECK_COMMANDS: Record<CheckName, string> = {\n lint: 'npx biome lint .',\n format: 'npx biome format .',\n test: 'npx vitest run',\n};\n\nexport function createStatusManager(root: string) {\n const clients = new Set<ServerResponse>();\n const snapshot: StatusSnapshot = {\n lint: { status: 'stale', lastRun: null, output: '' },\n format: { status: 'stale', lastRun: null, output: '' },\n test: { status: 'stale', lastRun: null, output: '' },\n };\n const running = new Set<CheckName>();\n const queued = new Set<CheckName>();\n\n function broadcast(event: { message: string; timestamp: string }) {\n const data = `data: ${JSON.stringify(event)}\\n\\n`;\n for (const client of clients) {\n try {\n client.write(data);\n } catch {\n clients.delete(client);\n }\n }\n }\n\n function setResult(name: CheckName, status: CheckStatus, output: string) {\n snapshot[name] = { status, lastRun: new Date().toISOString(), output };\n broadcast({\n message: `${name}: ${status}`,\n timestamp: snapshot[name].lastRun!,\n });\n if (status !== 'running' && queued.has(name)) {\n queued.delete(name);\n runCheck(name);\n }\n }\n\n function runCheck(name: CheckName) {\n if (running.has(name)) {\n queued.add(name);\n return;\n }\n running.add(name);\n setResult(name, 'running', '');\n\n const cmd = CHECK_COMMANDS[name];\n const proc = spawn(cmd, {\n cwd: root,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n let stdout = '';\n let stderr = '';\n proc.stdout?.on('data', (d: Buffer) => {\n stdout += d.toString();\n });\n proc.stderr?.on('data', (d: Buffer) => {\n stderr += d.toString();\n });\n\n proc.on('close', (code) => {\n running.delete(name);\n const output = stdout + stderr;\n if (code === 0) {\n setResult(name, 'pass', output);\n } else {\n setResult(name, 'fail', output);\n }\n });\n\n proc.on('error', (err) => {\n running.delete(name);\n setResult(name, 'fail', `Failed to spawn process: ${err.message}`);\n });\n }\n\n function runQualityFix() {\n if (running.has('lint') || running.has('format')) return;\n setResult('lint', 'running', 'Applying automatic fixes…');\n setResult('format', 'running', 'Applying automatic fixes…');\n\n const proc = spawn('npx biome check . --write', {\n cwd: root,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n proc.on('close', () => {\n runCheck('lint');\n runCheck('format');\n });\n\n proc.on('error', (err) => {\n const message = `Failed to spawn fix process: ${err.message}`;\n setResult('lint', 'fail', message);\n setResult('format', 'fail', message);\n });\n }\n\n const srcDir = join(root, 'src');\n let srcTimer: ReturnType<typeof setTimeout> | null = null;\n try {\n watch(srcDir, { recursive: true }, () => {\n if (srcTimer) clearTimeout(srcTimer);\n srcTimer = setTimeout(() => {\n runCheck('lint');\n runCheck('format');\n }, 1000);\n });\n } catch {\n // watcher not available (src/ doesn't exist or platform doesn't support recursive)\n }\n\n return {\n getStatus(): StatusSnapshot {\n return {\n lint: { ...snapshot.lint },\n format: { ...snapshot.format },\n test: { ...snapshot.test },\n };\n },\n runCheck,\n runQualityFix,\n subscribe(res: ServerResponse) {\n clients.add(res);\n for (const name of ['lint', 'format', 'test'] as CheckName[]) {\n const result = snapshot[name];\n if (result.status !== 'stale') {\n res.write(\n `data: ${JSON.stringify({ message: `${name}: ${result.status}`, timestamp: result.lastRun })}\\n\\n`,\n );\n }\n }\n res.on('close', () => clients.delete(res));\n },\n };\n}\n","import { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { extname, join } from 'node:path';\nimport { applyEnvEntries, parseEnv } from '../../core/env';\nimport {\n findConsistencyIssues,\n parseDecisions,\n parseIdeas,\n parseOpenQuestions,\n parsePlans,\n parseProgress,\n} from '../../core/parser';\nimport {\n appendBlock,\n assignPlanId,\n formatPlanEntry,\n formatPlans,\n todayDateString,\n} from '../../core/serializer';\nimport {\n AGENT_IDS,\n type AgentId,\n DEFAULT_AGENTS,\n type DefaultAgentsMap,\n type EnvEntry,\n type LogEntry,\n PLAN_KINDS,\n type PaperCampConfig,\n type PhaseItem,\n type PlanEntry,\n type PlanStatus,\n} from '../../types/index';\nimport { createActivityManager } from './activity';\nimport { type AgentManager, createAgentManager } from './agent';\nimport { createGitManager } from './git';\nimport { createStatusManager } from './status';\n\nasync function readMaybe(path: string): Promise<string> {\n try {\n return await readFile(path, 'utf-8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return '';\n throw error;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => resolve(body));\n req.on('error', reject);\n });\n}\n\ninterface ApiRoute {\n path: string;\n handler: (root: string) => Promise<unknown>;\n}\n\nconst campFile = (root: string, name: string) => join(root, 'papercamp', name);\n\nconst CONFIG_ALLOWLIST = [\n 'biome.json',\n 'tsconfig.json',\n 'tailwind.config.ts',\n 'vite.config.ts',\n 'vite.app.config.ts',\n 'postcss.config.js',\n 'package.json',\n];\n\nasync function checkBranchConflictForPlan(\n root: string,\n git: { getFeatureBranchPlanId: () => string | null },\n targetPlanId?: string,\n): Promise<string | null> {\n const activePlanId = git.getFeatureBranchPlanId();\n if (!activePlanId) return null;\n if (targetPlanId && activePlanId === targetPlanId) return null;\n const plansRaw = await readMaybe(campFile(root, 'plans.md'));\n if (!plansRaw) return null;\n const { entries } = parsePlans(plansRaw);\n const activePlan = entries.find((p) => p.id === activePlanId);\n if (!activePlan || activePlan.status === 'done' || activePlan.status === 'dropped') return null;\n return `Finish \\`${activePlanId}\\` — ${activePlan.title} — before starting another plan`;\n}\n\nconst apiRoutes: ApiRoute[] = [\n {\n path: '/api/package-name',\n handler: async (root) => {\n const raw = await readMaybe(join(root, 'package.json'));\n if (!raw) return null;\n try {\n const pkg = JSON.parse(raw);\n return pkg.name ?? null;\n } catch {\n return null;\n }\n },\n },\n {\n path: '/api/plans',\n handler: async (root) => parsePlans(await readMaybe(campFile(root, 'plans.md'))),\n },\n {\n path: '/api/progress',\n handler: async (root) => ({\n entries: parseProgress(await readMaybe(campFile(root, 'progress.md'))),\n }),\n },\n {\n path: '/api/decisions',\n handler: async (root) => parseDecisions(await readMaybe(campFile(root, 'decisions.md'))),\n },\n {\n path: '/api/open-questions',\n handler: async (root) =>\n parseOpenQuestions(await readMaybe(campFile(root, 'open-questions.md'))),\n },\n {\n path: '/api/ideas',\n handler: async (root) => ({\n content: await readMaybe(campFile(root, 'ideas.md')),\n }),\n },\n {\n path: '/api/consistency',\n handler: async (root) => {\n const [decisionsRaw, openQuestionsRaw, plansRaw] = await Promise.all([\n readMaybe(campFile(root, 'decisions.md')),\n readMaybe(campFile(root, 'open-questions.md')),\n readMaybe(campFile(root, 'plans.md')),\n ]);\n const decisions = parseDecisions(decisionsRaw);\n const openQuestions = parseOpenQuestions(openQuestionsRaw);\n const plans = parsePlans(plansRaw);\n return findConsistencyIssues(decisions.entries, openQuestions.entries, plans.entries);\n },\n },\n {\n path: '/api/config',\n handler: async (root) => {\n const raw = await readMaybe(join(root, '.paper-camp', 'config.json'));\n return raw ? JSON.parse(raw) : null;\n },\n },\n {\n path: '/api/docs',\n handler: async (root) => {\n const docNames = ['MAIN.md', 'README.md', 'CHANGELOG.md', 'LICENSE'];\n const files: { name: string; content: string }[] = [];\n for (const name of docNames) {\n const content = await readMaybe(join(root, name));\n if (content) files.push({ name, content });\n }\n return { files };\n },\n },\n {\n path: '/api/configs',\n handler: async (root) => {\n const configNames = [\n 'biome.json',\n 'tsconfig.json',\n 'tailwind.config.ts',\n 'vite.config.ts',\n 'vite.app.config.ts',\n 'postcss.config.js',\n 'package.json',\n ];\n const files: string[] = [];\n for (const name of configNames) {\n const content = await readMaybe(join(root, name));\n if (content) files.push(name);\n }\n return { files };\n },\n },\n];\n\nexport interface ApiMiddleware {\n (req: IncomingMessage, res: ServerResponse, next: () => void): Promise<void>;\n agent: AgentManager;\n}\n\nexport function createApiMiddleware(root: string): ApiMiddleware {\n const activity = createActivityManager(root);\n const git = createGitManager(root);\n const status = createStatusManager(root);\n const agent = createAgentManager(root, (plan) => git.ensureBranch(plan));\n const handler = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const pathname = (req.url ?? '').split('?')[0];\n\n // DELETE /api/plans?title=... — remove a plan entry\n if (req.method === 'DELETE' && pathname === '/api/plans') {\n try {\n const url = new URL(req.url ?? '', `http://${req.headers.host ?? 'localhost'}`);\n const title = url.searchParams.get('title');\n if (!title?.trim()) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'title is required' }));\n return;\n }\n const filePath = campFile(root, 'plans.md');\n const parsed = parsePlans(await readMaybe(filePath));\n const trimmed = title.trim();\n const remaining = parsed.entries.filter((entry) => entry.title !== trimmed);\n if (remaining.length === parsed.entries.length) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'plan not found' }));\n return;\n }\n await writeFile(filePath, formatPlans(remaining));\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/plans — append a new idea entry\n if (req.method === 'POST' && pathname === '/api/plans') {\n try {\n const body = await readBody(req);\n const { title, content, kind } = JSON.parse(body) as {\n title: string;\n content?: string;\n kind?: string;\n };\n if (!title?.trim()) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'title is required' }));\n return;\n }\n const planKind =\n kind && PLAN_KINDS.includes(kind as (typeof PLAN_KINDS)[number]) ? kind : 'feat';\n\n const configPath = join(root, '.paper-camp', 'config.json');\n const id = await assignPlanId(configPath, planKind);\n\n const entry = formatPlanEntry({\n title: title.trim(),\n status: 'idea',\n kind: planKind,\n id,\n created: todayDateString(),\n body: content?.trim(),\n });\n await appendBlock(campFile(root, 'plans.md'), entry);\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true, id }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // PATCH /api/plans?title=... — update an existing plan entry\n if (req.method === 'PATCH' && pathname === '/api/plans') {\n try {\n const url = new URL(req.url ?? '', `http://${req.headers.host ?? 'localhost'}`);\n const title = url.searchParams.get('title');\n if (!title?.trim()) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'title is required' }));\n return;\n }\n const body = await readBody(req);\n const updates = JSON.parse(body) as {\n phases?: PhaseItem[];\n status?: PlanStatus;\n log?: LogEntry[];\n agent?: AgentId | null;\n };\n if (updates.agent && !AGENT_IDS.includes(updates.agent)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'agent must be a known agent id' }));\n return;\n }\n const filePath = campFile(root, 'plans.md');\n const parsed = parsePlans(await readMaybe(filePath));\n const trimmed = title.trim();\n let found = false;\n const updated = parsed.entries.map((entry: PlanEntry) => {\n if (entry.title === trimmed) {\n found = true;\n return {\n ...entry,\n ...(updates.status !== undefined && { status: updates.status }),\n ...(updates.phases !== undefined && { phases: updates.phases }),\n ...(updates.log !== undefined && { log: updates.log }),\n ...(updates.agent !== undefined && { agent: updates.agent ?? undefined }),\n updated: todayDateString(),\n };\n }\n // Starting a plan puts it in focus — only one other plan is ever \"in focus\"\n // (in-progress) at a time. A `review` plan isn't in focus, it's done and\n // awaiting approval, so starting a different plan must never touch it.\n if (updates.status === 'in-progress' && entry.status === 'in-progress') {\n return { ...entry, status: 'planned' as const, updated: todayDateString() };\n }\n return entry;\n });\n if (!found) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'plan not found' }));\n return;\n }\n if (updates.status === 'done') {\n const targetEntry = parsed.entries.find((e: PlanEntry) => e.title === trimmed);\n const conflict = await checkBranchConflictForPlan(root, git, targetEntry?.id);\n if (conflict) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: conflict }));\n return;\n }\n }\n await writeFile(filePath, formatPlans(updated));\n\n if (updates.status === 'done') {\n const finalEntry = updated.find((e: PlanEntry) => e.title === trimmed);\n if (finalEntry) {\n try {\n git.ensureBranch(finalEntry);\n } catch {\n // Non-fatal: git operations may fail (not a repo, etc.)\n }\n }\n }\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/ideas — append a new idea entry to ideas.md\n if (req.method === 'POST' && pathname === '/api/ideas') {\n try {\n const body = await readBody(req);\n const { title, content } = JSON.parse(body) as { title?: string; content?: string };\n if (!title?.trim()) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'title is required' }));\n return;\n }\n const filePath = campFile(root, 'ideas.md');\n const existing = await readMaybe(filePath);\n const parsed = parseIdeas(existing);\n const maxNum = parsed.reduce((max, idea) => {\n if (idea.id) {\n const num = Number.parseInt(idea.id.replace('IDEA-', ''), 10);\n return Number.isNaN(num) ? max : Math.max(max, num);\n }\n return max;\n }, 0);\n const newId = `IDEA-${maxNum + 1}`;\n const section = `### ${newId}: ${title.trim()}\\n\\n${content?.trim() ?? ''}`;\n const trimmed = existing.trimEnd();\n const separator = trimmed.length === 0 ? '' : '\\n\\n---\\n\\n';\n await writeFile(filePath, `${trimmed}${separator}${section}\\n`);\n res.statusCode = 201;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true, id: newId }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // GET /api/icon — serve project icon\n if (req.method === 'GET' && pathname === '/api/icon') {\n const assetsDir = join(root, '.paper-camp', 'assets');\n const mimeMap: Record<string, string> = {\n svg: 'image/svg+xml',\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n };\n for (const [ext, mime] of Object.entries(mimeMap)) {\n try {\n const data = await readFile(join(assetsDir, `icon.${ext}`));\n res.statusCode = 200;\n res.setHeader('Content-Type', mime);\n res.setHeader('Cache-Control', 'no-cache');\n res.end(data);\n return;\n } catch {\n /* try next */\n }\n }\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'no icon uploaded' }));\n return;\n }\n\n // POST /api/icon — upload project icon\n if (req.method === 'POST' && pathname === '/api/icon') {\n try {\n const body = await readBody(req);\n const { dataUri } = JSON.parse(body) as { dataUri?: string };\n if (!dataUri) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'dataUri is required' }));\n return;\n }\n const match = dataUri.match(/^data:(image\\/[a-z0-9+.-]+);base64,(.+)$/);\n if (!match) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'invalid data URI' }));\n return;\n }\n const mime = match[1];\n const ext = mime === 'image/svg+xml' ? 'svg' : mime.split('/')[1];\n const buffer = Buffer.from(match[2], 'base64');\n const assetsDir = join(root, '.paper-camp', 'assets');\n await mkdir(assetsDir, { recursive: true });\n await writeFile(join(assetsDir, `icon.${ext}`), buffer);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // GET /api/git/status — return working tree status\n if (req.method === 'GET' && pathname === '/api/git/status') {\n try {\n const entries = await git.getStatus();\n const branch = git.getCurrentBranch();\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ branch, entries }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/git/commit — stage files and create a commit\n if (req.method === 'POST' && pathname === '/api/git/commit') {\n try {\n const body = await readBody(req);\n const { files, title, message } = JSON.parse(body) as {\n files: string[];\n title: string;\n message?: string;\n };\n if (!title?.trim()) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'title is required' }));\n return;\n }\n await git.commit(files ?? [], title.trim(), message?.trim());\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // GET /api/status — return current lint/format/test check results\n if (req.method === 'GET' && pathname === '/api/status') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(status.getStatus()));\n return;\n }\n\n // POST /api/status/check?name=lint|format|test — trigger a one-off check run\n if (req.method === 'POST' && pathname === '/api/status/check') {\n const url = new URL(req.url ?? '', `http://${req.headers.host ?? 'localhost'}`);\n const name = url.searchParams.get('name');\n if (name !== 'lint' && name !== 'format' && name !== 'test') {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'name must be lint, format, or test' }));\n return;\n }\n status.runCheck(name);\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // POST /api/status/fix — run `biome check . --write` to auto-fix lint/format issues\n if (req.method === 'POST' && pathname === '/api/status/fix') {\n status.runQualityFix();\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // GET /api/activity/stream — SSE endpoint for live activity events\n if (req.method === 'GET' && pathname === '/api/activity/stream') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.flushHeaders();\n activity.subscribe(res);\n git.subscribe(res);\n status.subscribe(res);\n agent.subscribe(res);\n return;\n }\n\n // GET /api/agent/status — current agent task state, if any\n if (req.method === 'GET' && pathname === '/api/agent/status') {\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(agent.getStatus()));\n return;\n }\n\n // POST /api/agent/launch — start a headless agent on one plan phase\n if (req.method === 'POST' && pathname === '/api/agent/launch') {\n try {\n const body = await readBody(req);\n const { planId, phaseIndex } = JSON.parse(body) as { planId?: string; phaseIndex?: number };\n if (!planId || typeof phaseIndex !== 'number') {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'planId and phaseIndex are required' }));\n return;\n }\n const parsed = parsePlans(await readMaybe(campFile(root, 'plans.md')));\n const plan = parsed.entries.find((p) => p.id === planId);\n if (!plan) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'plan not found' }));\n return;\n }\n const conflict = await checkBranchConflictForPlan(root, git, plan.id);\n if (conflict) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: conflict }));\n return;\n }\n const result = await agent.start(plan, phaseIndex);\n if (!result.ok) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n return;\n }\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/agent/launch-audit — start a headless agent on a plan-scoped convergence audit\n if (req.method === 'POST' && pathname === '/api/agent/launch-audit') {\n try {\n const body = await readBody(req);\n const { planId, prompt } = JSON.parse(body) as { planId?: string; prompt?: string };\n if (!planId || !prompt) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'planId and prompt are required' }));\n return;\n }\n const parsed = parsePlans(await readMaybe(campFile(root, 'plans.md')));\n const plan = parsed.entries.find((p) => p.id === planId);\n if (!plan) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'plan not found' }));\n return;\n }\n const conflict = await checkBranchConflictForPlan(root, git, plan.id);\n if (conflict) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: conflict }));\n return;\n }\n const result = agent.startForPlan(plan, prompt);\n if (!result.ok) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n return;\n }\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/agent/launch-draft — start a headless agent that drafts a new plan from an idea\n if (req.method === 'POST' && pathname === '/api/agent/launch-draft') {\n try {\n const body = await readBody(req);\n const { ideaId, prompt } = JSON.parse(body) as { ideaId?: string; prompt?: string };\n if (!ideaId || !prompt) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'ideaId and prompt are required' }));\n return;\n }\n const ideas = parseIdeas(await readMaybe(campFile(root, 'ideas.md')));\n const idea = ideas.find((i) => i.id === ideaId);\n if (!idea) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'idea not found' }));\n return;\n }\n const conflict = await checkBranchConflictForPlan(root, git);\n if (conflict) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: conflict }));\n return;\n }\n const result = agent.startForIdea(idea, prompt);\n if (!result.ok) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n return;\n }\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/agent/launch-extend — start a headless agent to extend an idea's body\n if (req.method === 'POST' && pathname === '/api/agent/launch-extend') {\n try {\n const body = await readBody(req);\n const { ideaId, prompt } = JSON.parse(body) as { ideaId?: string; prompt?: string };\n if (!ideaId || !prompt) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'ideaId and prompt are required' }));\n return;\n }\n const ideas = parseIdeas(await readMaybe(campFile(root, 'ideas.md')));\n const idea = ideas.find((i) => i.id === ideaId);\n if (!idea) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'idea not found' }));\n return;\n }\n const conflict = await checkBranchConflictForPlan(root, git);\n if (conflict) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: conflict }));\n return;\n }\n const result = agent.startForIdeaExtend(idea, prompt);\n if (!result.ok) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n return;\n }\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/agent/stop — kill the running agent task\n if (req.method === 'POST' && pathname === '/api/agent/stop') {\n const result = agent.stop();\n if (!result.ok) {\n res.statusCode = 409;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: result.error }));\n return;\n }\n res.statusCode = 202;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // POST /api/config — update editable fields in .paper-camp/config.json (port, projectName)\n if (req.method === 'POST' && pathname === '/api/config') {\n try {\n const configPath = join(root, '.paper-camp', 'config.json');\n const raw = await readMaybe(configPath);\n if (!raw) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'config not found' }));\n return;\n }\n const body = await readBody(req);\n const { port, projectName, defaultAgent, defaultAgents } = JSON.parse(body) as {\n port?: number;\n projectName?: string;\n defaultAgent?: AgentId;\n defaultAgents?: DefaultAgentsMap;\n };\n if (port !== undefined && (!Number.isInteger(port) || port <= 0)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'port must be a positive integer' }));\n return;\n }\n if (projectName !== undefined && projectName.trim().length === 0) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'projectName must not be empty' }));\n return;\n }\n if (defaultAgent !== undefined && !AGENT_IDS.includes(defaultAgent)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'defaultAgent must be a known agent id' }));\n return;\n }\n if (defaultAgents !== undefined) {\n for (const key of ['phase', 'planDraft', 'ideaExtend'] as const) {\n if (!AGENT_IDS.includes(defaultAgents[key])) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `defaultAgents.${key} must be a known agent id` }));\n return;\n }\n }\n }\n const config = JSON.parse(raw) as PaperCampConfig;\n const resolvedDefaultAgents =\n defaultAgents ??\n (defaultAgent !== undefined\n ? { phase: defaultAgent, planDraft: defaultAgent, ideaExtend: defaultAgent }\n : undefined);\n const configWithOld = config as PaperCampConfig & { defaultAgent?: AgentId };\n const { defaultAgent: _oldAgent, ...configRest } = configWithOld;\n const updated: PaperCampConfig = {\n ...configRest,\n ...(port !== undefined && { port }),\n ...(projectName !== undefined && { projectName: projectName.trim() }),\n ...(resolvedDefaultAgents && { defaultAgents: resolvedDefaultAgents }),\n };\n await writeFile(configPath, JSON.stringify(updated, null, 2));\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // GET /api/env — read the project root's .env, masked client-side only\n if (req.method === 'GET' && pathname === '/api/env') {\n try {\n const envPath = join(root, '.env');\n const examplePath = join(root, '.env.example');\n const [exists, exampleExists] = await Promise.all([\n fileExists(envPath),\n fileExists(examplePath),\n ]);\n const entries = exists ? parseEnv(await readMaybe(envPath)) : [];\n const exampleKeys = exampleExists\n ? parseEnv(await readMaybe(examplePath)).map((e) => e.key)\n : [];\n const envKeys = new Set(entries.map((e) => e.key));\n const missingKeys = exampleKeys.filter((key) => !envKeys.has(key));\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ exists, exampleExists, entries, missingKeys }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // POST /api/env — write the full desired entry set back to .env\n if (req.method === 'POST' && pathname === '/api/env') {\n try {\n const body = await readBody(req);\n const { entries } = JSON.parse(body) as { entries?: EnvEntry[] };\n if (!Array.isArray(entries)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'entries is required' }));\n return;\n }\n const keys = new Set<string>();\n for (const entry of entries) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(entry.key)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `invalid key: ${entry.key}` }));\n return;\n }\n if (keys.has(entry.key)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: `duplicate key: ${entry.key}` }));\n return;\n }\n keys.add(entry.key);\n }\n const envPath = join(root, '.env');\n const current = await readMaybe(envPath);\n await writeFile(envPath, applyEnvEntries(current, entries));\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ ok: true }));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n return;\n }\n\n // GET /api/configs?name=... — read a specific config file's content\n if (req.method === 'GET' && pathname === '/api/configs') {\n const url = new URL(req.url ?? '', `http://${req.headers.host ?? 'localhost'}`);\n const name = url.searchParams.get('name');\n if (name) {\n try {\n if (!CONFIG_ALLOWLIST.includes(name)) {\n res.statusCode = 400;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'invalid config file name' }));\n return;\n }\n const content = await readMaybe(join(root, name));\n if (!content) {\n res.statusCode = 404;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: 'config file not found' }));\n return;\n }\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ name, content }));\n return;\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n return;\n }\n }\n // No name param: fall through to the generic route handler for listing\n }\n\n const route = apiRoutes.find((r) => r.path === pathname);\n if (!route) {\n next();\n return;\n }\n\n try {\n const data = await route.handler(root);\n res.statusCode = 200;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(data));\n } catch (error) {\n res.statusCode = 500;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify({ error: (error as Error).message }));\n }\n };\n\n (handler as ApiMiddleware).agent = agent;\n return handler as ApiMiddleware;\n}\n","import { readFile, stat } from 'node:fs/promises';\nimport { type IncomingMessage, type ServerResponse, createServer } from 'node:http';\nimport { dirname, extname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createApiMiddleware } from '../app/server/api';\n\nconst MIME: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.mjs': 'text/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nfunction appDir(): string {\n return join(dirname(fileURLToPath(import.meta.url)), '..', 'app');\n}\n\nexport interface DevServerOptions {\n root: string;\n port: number;\n}\n\n/**\n * Serves the pre-built dashboard SPA (dist/app) plus the papercamp/ API, for an\n * installed package where there's no Vite runtime available (it's a devDependency).\n */\nexport async function startDevServer({ root, port }: DevServerOptions): Promise<void> {\n const staticDir = appDir();\n const indexPath = join(staticDir, 'index.html');\n const indexHtml = await readFile(indexPath, 'utf-8').catch(() => null);\n if (indexHtml === null) {\n throw new Error(\n `Dashboard assets not found at ${staticDir}. Run \\`pnpm build\\` (or reinstall the package) so dist/app exists.`,\n );\n }\n\n const apiMiddleware = createApiMiddleware(root);\n\n async function serveStatic(req: IncomingMessage, res: ServerResponse) {\n const pathname = decodeURIComponent((req.url ?? '/').split('?')[0]);\n const filePath = join(staticDir, pathname === '/' ? 'index.html' : pathname);\n\n try {\n const fileStat = await stat(filePath);\n if (fileStat.isFile()) {\n res.statusCode = 200;\n res.setHeader('Content-Type', MIME[extname(filePath)] ?? 'application/octet-stream');\n res.end(await readFile(filePath));\n return;\n }\n } catch {\n // not a file on disk — fall through to the SPA fallback below\n }\n\n res.statusCode = 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n res.end(indexHtml);\n }\n\n const server = createServer((req, res) => {\n apiMiddleware(req, res, () => {\n serveStatic(req, res).catch((error) => {\n res.statusCode = 500;\n res.end(String(error));\n });\n });\n });\n\n const shutdown = () => {\n apiMiddleware.agent.killCurrent();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n await new Promise<void>((resolve) => server.listen(port, resolve));\n}\n","#!/usr/bin/env node\nimport { basename, resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { AlreadyInitializedError, PAPER_CAMP_VERSION, initProject } from '../core/scaffold';\nimport { appendBlock, assignPlanId, formatPlanEntry, todayDateString } from '../core/serializer';\nimport { PLAN_KINDS } from '../types/index';\nimport { startDevServer } from './dev-server';\n\nconst program = new Command();\n\nprogram\n .name('paper-camp')\n .description('Local-first, AI-native project companion.')\n .version(PAPER_CAMP_VERSION);\n\nprogram\n .command('init [project-name]')\n .description('Initialize Paper Camp in the current directory')\n .option('-i, --intent <text>', 'one-line description of what you are building')\n .action(async (projectName: string | undefined, opts: { intent?: string }) => {\n const targetDir = process.cwd();\n const name = projectName ?? basename(targetDir);\n try {\n await initProject(targetDir, { projectName: name, intent: opts.intent });\n console.log(`Initialized Paper Camp in ${targetDir}`);\n console.log(' .paper-camp/config.json');\n console.log(' papercamp/ideas.md, plans.md, progress.md, decisions.md, open-questions.md');\n } catch (error) {\n if (error instanceof AlreadyInitializedError) {\n console.error(error.message);\n process.exitCode = 1;\n return;\n }\n throw error;\n }\n });\n\nprogram\n .command('dev')\n .description('Start the local dashboard')\n .option('-p, --port <number>', 'port to listen on', '3333')\n .action(async (opts: { port: string }) => {\n const port = Number(opts.port);\n const root = process.cwd();\n try {\n await startDevServer({ root, port });\n console.log(`Paper Camp dashboard running at http://localhost:${port}`);\n } catch (error) {\n console.error((error as Error).message);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command('add <type> [name]')\n .description('Add a new entry (currently supports: plan)')\n .option('-k, --kind <kind>', `plan kind (${PLAN_KINDS.join('|')})`, 'feat')\n .action(async (type: string, name: string | undefined, opts: { kind: string }) => {\n if (type !== 'plan') {\n console.error(`Unknown type \"${type}\". Supported types: plan`);\n process.exitCode = 1;\n return;\n }\n if (!name) {\n console.error('Usage: paper-camp add plan <name> [--kind feat|fix|chore|docs|refactor]');\n process.exitCode = 1;\n return;\n }\n if (!PLAN_KINDS.includes(opts.kind as (typeof PLAN_KINDS)[number])) {\n console.error(`Unknown kind \"${opts.kind}\". Supported kinds: ${PLAN_KINDS.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n\n const kind = opts.kind;\n const configPath = resolve(process.cwd(), '.paper-camp', 'config.json');\n const id = await assignPlanId(configPath, kind);\n\n const filePath = resolve(process.cwd(), 'papercamp', 'plans.md');\n const block = formatPlanEntry({\n title: name,\n status: 'idea',\n kind,\n id,\n created: todayDateString(),\n });\n await appendBlock(filePath, block);\n console.log(`Added plan \"${name}\"${id ? ` (${id})` : ''} to papercamp/plans.md`);\n });\n\nprogram.parseAsync(process.argv);\n"],"names":["campFile","root","name","join","readMaybe","path","readFile","takeSnapshot","plansRaw","decisionsRaw","questionsRaw","progressRaw","parsePlans","parseDecisions","parseOpenQuestions","parseProgress","diffAndSynthesize","before","after","events","ts","beforePlans","p","afterPlans","title","afterP","beforeP","i","beforePhase","afterPhase","beforeDecisions","d","afterDecisions","beforeQuestions","q","afterQuestions","beforeProgress","afterProgress","date","createActivityManager","clients","snapshot","timer","files","check","next","event","data","client","file","filePath","watch","s","res","connected","buildArgs","prompt","parseLine","line","json","message","blocks","block","b","content","error","TOOL_LABELS","type","part","text","tool","input","desc","label","detail","reason","DEFAULT_AGENT_ID","AGENTS","claudeCode.buildArgs","claudeCode.parseLine","opencode.buildArgs","opencode.parseLine","TASK_KIND_TO_DEFAULT_KEY","resolveAgent","opts","agentId","defaultAgents","taskKind","key","fallback","MAX_LINES","readDefaultAgentIds","raw","readFileSync","config","DEFAULT_AGENTS","buildAgentPrompt","plan","phase","phaseIndex","createAgentManager","ensureBranch","current","broadcast","pushLine","task","setStatus","status","didTaskProgress","idea","parseIdeas","e","entries","_a","_b","finishTask","progressed","warning","attachReader","createInterface","parsed","code","err","spawnAgent","adapter","args","spawn","isBusy","launch","identity","scope","proc","start","startForPlan","startForIdea","startForIdeaExtend","stop","getStatus","createGitManager","parsePorcelain","output","x","y","rest","runGit","resolve","reject","stdout","stderr","runGitStatus","commit","kind","id","branch","currentResult","spawnSync","result","checkoutResult","refresh","gitDir","eventType","filename","srcDir","srcTimer","getCurrentBranch","getFeatureBranchPlanId","match","CHECK_COMMANDS","createStatusManager","running","queued","setResult","runCheck","cmd","runQualityFix","fileExists","stat","readBody","req","body","chunk","CONFIG_ALLOWLIST","checkBranchConflictForPlan","git","targetPlanId","activePlanId","activePlan","apiRoutes","openQuestionsRaw","decisions","openQuestions","plans","findConsistencyIssues","docNames","configNames","createApiMiddleware","activity","agent","handler","pathname","trimmed","remaining","entry","writeFile","formatPlans","planKind","PLAN_KINDS","configPath","assignPlanId","formatPlanEntry","todayDateString","appendBlock","updates","AGENT_IDS","found","updated","targetEntry","conflict","finalEntry","existing","newId","max","num","section","separator","assetsDir","mimeMap","ext","mime","dataUri","buffer","mkdir","planId","ideaId","port","projectName","defaultAgent","resolvedDefaultAgents","configWithOld","_oldAgent","configRest","envPath","examplePath","exists","exampleExists","parseEnv","exampleKeys","envKeys","missingKeys","keys","applyEnvEntries","route","r","MIME","appDir","dirname","fileURLToPath","startDevServer","staticDir","indexPath","indexHtml","apiMiddleware","serveStatic","extname","server","createServer","shutdown","program","Command","PAPER_CAMP_VERSION","targetDir","basename","initProject","AlreadyInitializedError"],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EnvEntry } from '../types/index';
|
|
2
|
+
/** Parses `KEY=value` lines, skipping comments and blank lines. */
|
|
3
|
+
export declare function parseEnv(content: string): EnvEntry[];
|
|
4
|
+
/**
|
|
5
|
+
* Replaces matched-key lines in place, drops keys no longer present, and appends
|
|
6
|
+
* new keys at the end — preserving comments and the ordering of every untouched line.
|
|
7
|
+
*/
|
|
8
|
+
export declare function applyEnvEntries(content: string, entries: EnvEntry[]): string;
|
|
9
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA2B/C,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAOpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAuB5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { A as e, P as r, a as n, b as i, c as t, d as o, e as p, f as E, g as d, h as S, i as l, j as m, k as P, l as A, o as c, p as f, m as y, n as I, q as N, r as _, s as g, t as u, u as D, v as T, w as h } from "../chunks/serializer.D1Ts_p8h.js";
|
|
2
|
+
import { AGENT_IDS as v, AGENT_LABELS as C, DEFAULT_AGENTS as F, PLAN_KINDS as G, PLAN_STATUSES as O } from "../types/index.js";
|
|
3
|
+
export {
|
|
4
|
+
v as AGENT_IDS,
|
|
5
|
+
C as AGENT_LABELS,
|
|
6
|
+
e as AlreadyInitializedError,
|
|
7
|
+
F as DEFAULT_AGENTS,
|
|
8
|
+
r as PAPER_CAMP_VERSION,
|
|
9
|
+
G as PLAN_KINDS,
|
|
10
|
+
O as PLAN_STATUSES,
|
|
11
|
+
n as appendBlock,
|
|
12
|
+
i as applyEnvEntries,
|
|
13
|
+
t as assignPlanId,
|
|
14
|
+
o as decisionFieldsSchema,
|
|
15
|
+
p as deriveIdeaStatuses,
|
|
16
|
+
E as findConsistencyIssues,
|
|
17
|
+
d as formatDecisionEntry,
|
|
18
|
+
S as formatOpenQuestionEntry,
|
|
19
|
+
l as formatPlanEntry,
|
|
20
|
+
m as formatPlans,
|
|
21
|
+
P as formatProgressEntry,
|
|
22
|
+
A as initProject,
|
|
23
|
+
c as openQuestionFieldsSchema,
|
|
24
|
+
f as paperCampConfigSchema,
|
|
25
|
+
y as parseDecisions,
|
|
26
|
+
I as parseEnv,
|
|
27
|
+
N as parseIdeas,
|
|
28
|
+
_ as parseOpenQuestions,
|
|
29
|
+
g as parsePlans,
|
|
30
|
+
u as parseProgress,
|
|
31
|
+
D as parseRawEntries,
|
|
32
|
+
T as planFieldsSchema,
|
|
33
|
+
h as todayDateString
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ConsistencyIssue, DecisionEntry, IdeaEntry, OpenQuestionEntry, ParseResult, PlanEntry, ProgressEntry, RawEntry } from '../types/index';
|
|
2
|
+
export declare function parseRawEntries(markdown: string): RawEntry[];
|
|
3
|
+
export declare function parsePlans(markdown: string): ParseResult<PlanEntry>;
|
|
4
|
+
export declare function parseDecisions(markdown: string): ParseResult<DecisionEntry>;
|
|
5
|
+
export declare function parseOpenQuestions(markdown: string): ParseResult<OpenQuestionEntry>;
|
|
6
|
+
/** ideas.md is split into sections by `---` separators. Each section has an optional
|
|
7
|
+
* `### IDEA-N:` heading prefix followed by a short title, and a prose body. */
|
|
8
|
+
export declare function parseIdeas(markdown: string): IdeaEntry[];
|
|
9
|
+
export declare function deriveIdeaStatuses(ideas: IdeaEntry[], plans: PlanEntry[]): IdeaEntry[];
|
|
10
|
+
/** Read-only cross-reference checks over already-parsed decisions/open-questions/plans —
|
|
11
|
+
* dangling `resolved-by`/`superseded-by` titles, and open questions blocking an
|
|
12
|
+
* already-active plan. */
|
|
13
|
+
export declare function findConsistencyIssues(decisions: DecisionEntry[], openQuestions: OpenQuestionEntry[], plans: PlanEntry[]): ConsistencyIssue[];
|
|
14
|
+
/** progress.md is an append-only date log, not a record-based file — no fields, no validation. */
|
|
15
|
+
export declare function parseProgress(markdown: string): ProgressEntry[];
|
|
16
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,SAAS,EAET,iBAAiB,EACjB,WAAW,EAEX,SAAS,EACT,aAAa,EACb,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAgHxB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAwC5D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAqCnE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,CAwB3E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAyBnF;AAMD;+EAC+E;AAC/E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAYxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAYtF;AAED;;0BAE0B;AAC1B,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,EAAE,EAC1B,aAAa,EAAE,iBAAiB,EAAE,EAClC,KAAK,EAAE,SAAS,EAAE,GACjB,gBAAgB,EAAE,CA0CpB;AAKD,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAwB/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../src/core/parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const PAPER_CAMP_VERSION = "0.1.0";
|
|
2
|
+
export declare class AlreadyInitializedError extends Error {
|
|
3
|
+
constructor(targetDir: string);
|
|
4
|
+
}
|
|
5
|
+
export interface InitOptions {
|
|
6
|
+
projectName: string;
|
|
7
|
+
intent?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Scaffolds .paper-camp/config.json and papercamp/*.md. Never overwrites existing
|
|
11
|
+
* files — a project's memory is never something `init` should clobber.
|
|
12
|
+
*/
|
|
13
|
+
export declare function initProject(targetDir: string, options: InitOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,SAAS,EAAE,MAAM;CAG9B;AAaD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCxF"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const planFieldsSchema: z.ZodObject<{
|
|
3
|
+
status: z.ZodEnum<{
|
|
4
|
+
idea: "idea";
|
|
5
|
+
planned: "planned";
|
|
6
|
+
"in-progress": "in-progress";
|
|
7
|
+
review: "review";
|
|
8
|
+
done: "done";
|
|
9
|
+
dropped: "dropped";
|
|
10
|
+
}>;
|
|
11
|
+
kind: z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
feat: "feat";
|
|
13
|
+
fix: "fix";
|
|
14
|
+
chore: "chore";
|
|
15
|
+
docs: "docs";
|
|
16
|
+
refactor: "refactor";
|
|
17
|
+
}>>;
|
|
18
|
+
id: z.ZodOptional<z.ZodString>;
|
|
19
|
+
idea: z.ZodOptional<z.ZodString>;
|
|
20
|
+
agent: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
"claude-code": "claude-code";
|
|
22
|
+
opencode: "opencode";
|
|
23
|
+
}>>;
|
|
24
|
+
created: z.ZodString;
|
|
25
|
+
updated: z.ZodOptional<z.ZodString>;
|
|
26
|
+
tags: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const decisionFieldsSchema: z.ZodObject<{
|
|
29
|
+
date: z.ZodString;
|
|
30
|
+
status: z.ZodEnum<{
|
|
31
|
+
decided: "decided";
|
|
32
|
+
superseded: "superseded";
|
|
33
|
+
}>;
|
|
34
|
+
'superseded-by': z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export declare const openQuestionFieldsSchema: z.ZodObject<{
|
|
37
|
+
status: z.ZodEnum<{
|
|
38
|
+
open: "open";
|
|
39
|
+
resolved: "resolved";
|
|
40
|
+
}>;
|
|
41
|
+
raised: z.ZodString;
|
|
42
|
+
'resolved-by': z.ZodOptional<z.ZodString>;
|
|
43
|
+
blocks: z.ZodOptional<z.ZodString>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export declare const paperCampConfigSchema: z.ZodObject<{
|
|
46
|
+
version: z.ZodString;
|
|
47
|
+
projectName: z.ZodString;
|
|
48
|
+
initializedAt: z.ZodString;
|
|
49
|
+
nextId: z.ZodOptional<z.ZodObject<{
|
|
50
|
+
feat: z.ZodNumber;
|
|
51
|
+
fix: z.ZodNumber;
|
|
52
|
+
chore: z.ZodNumber;
|
|
53
|
+
docs: z.ZodNumber;
|
|
54
|
+
refactor: z.ZodNumber;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
defaultAgent: z.ZodOptional<z.ZodEnum<{
|
|
57
|
+
"claude-code": "claude-code";
|
|
58
|
+
opencode: "opencode";
|
|
59
|
+
}>>;
|
|
60
|
+
defaultAgents: z.ZodOptional<z.ZodObject<{
|
|
61
|
+
phase: z.ZodEnum<{
|
|
62
|
+
"claude-code": "claude-code";
|
|
63
|
+
opencode: "opencode";
|
|
64
|
+
}>;
|
|
65
|
+
planDraft: z.ZodEnum<{
|
|
66
|
+
"claude-code": "claude-code";
|
|
67
|
+
opencode: "opencode";
|
|
68
|
+
}>;
|
|
69
|
+
ideaExtend: z.ZodEnum<{
|
|
70
|
+
"claude-code": "claude-code";
|
|
71
|
+
opencode: "opencode";
|
|
72
|
+
}>;
|
|
73
|
+
}, z.core.$strip>>;
|
|
74
|
+
}, z.core.$strip>;
|
|
75
|
+
export type PlanFields = z.infer<typeof planFieldsSchema>;
|
|
76
|
+
export type DecisionFields = z.infer<typeof decisionFieldsSchema>;
|
|
77
|
+
export type OpenQuestionFields = z.infer<typeof openQuestionFieldsSchema>;
|
|
78
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;iBAS3B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAKnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBhC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { LogEntry, PhaseItem } from '../types/index';
|
|
2
|
+
export declare function todayDateString(): string;
|
|
3
|
+
/**
|
|
4
|
+
* Mints the next `<KIND>-<N>` plan ID from the persistent counter in `.paper-camp/config.json`,
|
|
5
|
+
* incrementing and writing it back. Calls are chained through a module-level promise so two
|
|
6
|
+
* near-simultaneous calls within this process never read the same counter value and mint a
|
|
7
|
+
* duplicate ID — this does not protect against a concurrent call from a separate process (e.g.
|
|
8
|
+
* the CLI racing the dev server), which is an accepted gap for a local single-user tool.
|
|
9
|
+
* Returns undefined if the config file is missing or has no `nextId` counters yet.
|
|
10
|
+
*/
|
|
11
|
+
export declare function assignPlanId(configPath: string, kind: string): Promise<string | undefined>;
|
|
12
|
+
interface NewPlanInput {
|
|
13
|
+
title: string;
|
|
14
|
+
status: string;
|
|
15
|
+
kind?: string;
|
|
16
|
+
id?: string;
|
|
17
|
+
idea?: string;
|
|
18
|
+
agent?: string;
|
|
19
|
+
created: string;
|
|
20
|
+
updated?: string;
|
|
21
|
+
tags?: string[];
|
|
22
|
+
body?: string;
|
|
23
|
+
phases?: PhaseItem[];
|
|
24
|
+
log?: LogEntry[];
|
|
25
|
+
clarifications?: LogEntry[];
|
|
26
|
+
}
|
|
27
|
+
export declare function formatPlanEntry(input: NewPlanInput): string;
|
|
28
|
+
interface NewDecisionInput {
|
|
29
|
+
title: string;
|
|
30
|
+
date: string;
|
|
31
|
+
status: string;
|
|
32
|
+
supersededBy?: string;
|
|
33
|
+
body?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function formatDecisionEntry(input: NewDecisionInput): string;
|
|
36
|
+
interface NewOpenQuestionInput {
|
|
37
|
+
title: string;
|
|
38
|
+
raised: string;
|
|
39
|
+
status: string;
|
|
40
|
+
resolvedBy?: string;
|
|
41
|
+
blocks?: string;
|
|
42
|
+
body?: string;
|
|
43
|
+
}
|
|
44
|
+
export declare function formatOpenQuestionEntry(input: NewOpenQuestionInput): string;
|
|
45
|
+
export declare function formatProgressEntry(date: string, items: string[]): string;
|
|
46
|
+
/** Serializes an array of plan entries back to a plans.md file. */
|
|
47
|
+
export declare function formatPlans(entries: NewPlanInput[]): string;
|
|
48
|
+
/** Appends a pre-formatted block to a papercamp file, separated by a single blank line. */
|
|
49
|
+
export declare function appendBlock(filePath: string, block: string): Promise<void>;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/core/serializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE1D,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAID;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmBhG;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAqC3D;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAMnE;AAED,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAY3E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEzE;AAED,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAG3D;AAED,2FAA2F;AAC3F,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhF"}
|
package/dist/core.d.ts
ADDED
|
Binary file
|