md-task-viewer 0.1.1 → 0.1.2

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/dist/cli.js CHANGED
@@ -21,6 +21,12 @@ import { promises as fs } from "fs";
21
21
  // src/types.ts
22
22
  var CONFIG_FILE_NAME = ".md-task-viewer.json";
23
23
 
24
+ // src/slugify.ts
25
+ function slugify(value) {
26
+ const slug = value.normalize("NFC").replace(/[\s\u3000]+/g, "-").replace(/[^\p{L}\p{N}-]+/gu, "").replace(/^-+|-+$/g, "");
27
+ return slug || "untitled-task";
28
+ }
29
+
24
30
  // src/taskStore.ts
25
31
  var MARKDOWN_EXTENSIONS = /* @__PURE__ */ new Set([".md", ".markdown"]);
26
32
  var REQUIRED_PRIORITY = ["MUST", "WANT"];
@@ -45,10 +51,6 @@ function ensureMarkdownExtension(filePath) {
45
51
  function asUtcISOString(date) {
46
52
  return date.toISOString();
47
53
  }
48
- function slugify(value) {
49
- const slug = value.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
50
- return slug || "untitled-task";
51
- }
52
54
  function buildDefaults(filePath, stats) {
53
55
  const basename = path.basename(filePath, path.extname(filePath));
54
56
  const title = basename.replace(/[-_]+/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/taskStore.ts","../src/types.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport open from \"open\";\nimport { createServer } from \"./server.js\";\n\ninterface CliOptions {\n rootDir: string;\n port: number;\n host: string;\n shouldOpen: boolean;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n let rootDir = process.cwd();\n let port = 3847;\n let host = \"127.0.0.1\";\n let shouldOpen = true;\n\n for (let index = 0; index < argv.length; index += 1) {\n const current = argv[index];\n if (current === \"--port\") {\n port = Number(argv[index + 1] ?? port);\n index += 1;\n continue;\n }\n if (current === \"--host\") {\n host = argv[index + 1] ?? host;\n index += 1;\n continue;\n }\n if (current === \"--no-open\") {\n shouldOpen = false;\n continue;\n }\n if (!current.startsWith(\"--\")) {\n rootDir = path.resolve(current);\n }\n }\n\n return { rootDir, port, host, shouldOpen };\n}\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n const app = await createServer({ rootDir: options.rootDir });\n const address = await app.listen({\n port: options.port,\n host: options.host\n });\n\n const browserUrl = address.replace(options.host, options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host);\n process.stdout.write(`Markdown Task Viewer\\nRoot: ${options.rootDir}\\nURL: ${browserUrl}\\n`);\n\n if (options.shouldOpen) {\n await open(browserUrl);\n }\n\n const shutdown = async (): Promise<void> => {\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\\n`);\n process.exit(1);\n});\n","import Fastify, { type FastifyInstance } from \"fastify\";\nimport fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ConflictError,\n ValidationError,\n createTask,\n deleteTask,\n listTasks,\n parseOrderPayload,\n patchTaskFields,\n readConfig,\n saveConfig,\n saveOrder,\n updateTask\n} from \"./taskStore.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CreateServerOptions {\n rootDir: string;\n clientDir?: string | null;\n}\n\nfunction resolveClientDir(explicitClientDir?: string | null): string | null {\n if (explicitClientDir === null) {\n return null;\n }\n if (explicitClientDir) {\n return explicitClientDir;\n }\n return path.resolve(__dirname, \"client\");\n}\n\nfunction sendJsonError(reply: { code: (statusCode: number) => { send: (payload: unknown) => void } }, error: unknown): void {\n if (error instanceof ValidationError) {\n reply.code(400).send({ error: error.message });\n return;\n }\n if (error instanceof ConflictError) {\n reply.code(409).send({ error: error.message });\n return;\n }\n reply.code(500).send({ error: error instanceof Error ? error.message : \"Internal server error\" });\n}\n\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n const listeners = new Set<{ send: (payload: string) => void; close: () => void }>();\n const clientDir = resolveClientDir(options.clientDir);\n\n app.addHook(\"onClose\", async () => {\n for (const listener of listeners) {\n listener.close();\n }\n });\n\n app.get(\"/api/tasks\", async () => listTasks(options.rootDir));\n\n app.post(\"/api/tasks\", async (request, reply) => {\n try {\n const task = await createTask(options.rootDir, (request.body ?? {}) as never);\n return reply.code(201).send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await updateTask(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.delete(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n await deleteTask(options.rootDir, currentPath);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/task-fields/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await patchTaskFields(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.put(\"/api/order\", async (request, reply) => {\n try {\n const order = parseOrderPayload((request.body as { order?: unknown } | null)?.order ?? []);\n await saveOrder(options.rootDir, order);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/config\", async () => {\n try {\n return await readConfig(options.rootDir);\n } catch (error) {\n return { version: 1, taskDirs: [\".\"], order: [] };\n }\n });\n\n app.put(\"/api/config\", async (request, reply) => {\n try {\n const body = request.body as { taskDirs?: unknown; ignorePaths?: unknown } | null;\n const taskDirs = body?.taskDirs;\n if (!Array.isArray(taskDirs) || taskDirs.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"taskDirs must be an array of strings.\");\n }\n let ignorePaths: string[] | undefined;\n if (body?.ignorePaths !== undefined) {\n if (!Array.isArray(body.ignorePaths) || body.ignorePaths.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"ignorePaths must be an array of strings.\");\n }\n ignorePaths = body.ignorePaths as string[];\n }\n const config = await saveConfig(options.rootDir, taskDirs as string[], ignorePaths);\n return reply.send(config);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/events\", async (_request, reply) => {\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\"\n });\n reply.raw.write(\"\\n\");\n\n const listener = {\n send(payload: string) {\n reply.raw.write(`data: ${payload}\\n\\n`);\n },\n close() {\n reply.raw.end();\n }\n };\n\n listeners.add(listener);\n reply.raw.on(\"close\", () => {\n listeners.delete(listener);\n });\n\n return reply.hijack();\n });\n\n const watcher = chokidar.watch(options.rootDir, {\n ignoreInitial: true,\n ignored: (watchPath) => watchPath.includes(`${path.sep}.git`) || watchPath.includes(`${path.sep}node_modules`)\n });\n\n watcher.on(\"all\", (eventName, changedPath) => {\n const isMarkdown = changedPath.endsWith(\".md\") || changedPath.endsWith(\".markdown\");\n const isConfigFile = path.basename(changedPath) === \".md-task-viewer.json\";\n if (!isMarkdown && !isConfigFile) {\n return;\n }\n\n const payload = JSON.stringify({\n type: \"tasks-changed\",\n eventName,\n path: path.relative(options.rootDir, changedPath)\n });\n\n for (const listener of listeners) {\n listener.send(payload);\n }\n });\n\n app.addHook(\"onClose\", async () => {\n await watcher.close();\n });\n\n if (clientDir) {\n await app.register(fastifyStatic, {\n root: clientDir,\n prefix: \"/\"\n });\n\n app.setNotFoundHandler(async (request, reply) => {\n if (request.raw.url?.startsWith(\"/api/\")) {\n return reply.code(404).send({ error: \"Not found\" });\n }\n return reply.sendFile(\"index.html\");\n });\n }\n\n return app;\n}\n","import matter from \"gray-matter\";\nimport picomatch from \"picomatch\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport {\n CONFIG_FILE_NAME,\n type ConfigFile,\n type CreateTaskInput,\n type PatchTaskFieldsInput,\n type TaskFrontmatter,\n type TaskListResponse,\n type TaskParseError,\n type TaskPriority,\n type TaskRecord,\n type TaskStatus,\n type UpdateTaskInput\n} from \"./types.js\";\n\nconst MARKDOWN_EXTENSIONS = new Set([\".md\", \".markdown\"]);\nconst REQUIRED_PRIORITY: TaskPriority[] = [\"MUST\", \"WANT\"];\nconst REQUIRED_STATUS: TaskStatus[] = [\"TODO\", \"WIP\", \"DONE\"];\n\nexport class ConflictError extends Error {}\nexport class ValidationError extends Error {}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction normalizeRelativePath(candidate: string): string {\n const normalized = toPosixPath(path.posix.normalize(candidate.trim()));\n if (!normalized || normalized === \".\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"Path must stay within the workspace root.\");\n }\n\n return normalized.replace(/^\\.\\/+/, \"\");\n}\n\nfunction ensureMarkdownExtension(filePath: string): string {\n return path.posix.extname(filePath) ? filePath : `${filePath}.md`;\n}\n\nfunction asUtcISOString(date: Date): string {\n return date.toISOString();\n}\n\nfunction slugify(value: string): string {\n const slug = value\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n return slug || \"untitled-task\";\n}\n\nfunction buildDefaults(filePath: string, stats: { birthtime: Date; mtime: Date }): TaskFrontmatter {\n const basename = path.basename(filePath, path.extname(filePath));\n const title = basename.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n\n return {\n title,\n priority: \"WANT\",\n status: \"TODO\",\n createdAt: asUtcISOString(stats.birthtime),\n updatedAt: asUtcISOString(stats.mtime)\n };\n}\n\nfunction splitFrontmatter(data: Record<string, unknown>, statsDefaults: TaskFrontmatter): {\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n normalized: boolean;\n} {\n const extraFrontmatter: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (![\"title\", \"priority\", \"status\", \"createdAt\", \"updatedAt\"].includes(key)) {\n extraFrontmatter[key] = value;\n }\n }\n\n const title = typeof data.title === \"string\" && data.title.trim() ? data.title : statsDefaults.title;\n const priority = REQUIRED_PRIORITY.includes(data.priority as TaskPriority)\n ? (data.priority as TaskPriority)\n : statsDefaults.priority;\n const status = REQUIRED_STATUS.includes(data.status as TaskStatus)\n ? (data.status as TaskStatus)\n : statsDefaults.status;\n const createdAt =\n typeof data.createdAt === \"string\" && !Number.isNaN(Date.parse(data.createdAt))\n ? new Date(data.createdAt).toISOString()\n : statsDefaults.createdAt;\n const updatedAt =\n typeof data.updatedAt === \"string\" && !Number.isNaN(Date.parse(data.updatedAt))\n ? new Date(data.updatedAt).toISOString()\n : statsDefaults.updatedAt;\n\n const normalized =\n title !== data.title ||\n priority !== data.priority ||\n status !== data.status ||\n createdAt !== data.createdAt ||\n updatedAt !== data.updatedAt;\n\n return {\n frontmatter: { title, priority, status, createdAt, updatedAt },\n extraFrontmatter,\n normalized\n };\n}\n\nexport function serializeTask(record: TaskRecord): string {\n const data = {\n ...record.extraFrontmatter,\n title: record.frontmatter.title,\n priority: record.frontmatter.priority,\n status: record.frontmatter.status,\n createdAt: record.frontmatter.createdAt,\n updatedAt: record.frontmatter.updatedAt\n };\n\n return matter.stringify(record.content, data);\n}\n\nasync function readDirectoryRecursive(rootDir: string, currentDir: string, results: string[]): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === \".git\" || entry.name === \"node_modules\") {\n continue;\n }\n\n const absolutePath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n await readDirectoryRecursive(rootDir, absolutePath, results);\n continue;\n }\n\n if (entry.name === CONFIG_FILE_NAME) {\n continue;\n }\n\n if (!MARKDOWN_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n\n results.push(toPosixPath(path.relative(rootDir, absolutePath)));\n }\n}\n\nasync function listMarkdownFiles(rootDir: string, taskDirs: string[], ignorePaths: string[]): Promise<string[]> {\n const results: string[] = [];\n const seen = new Set<string>();\n\n const isIgnored = ignorePaths.length > 0 ? picomatch(ignorePaths) : null;\n\n for (const taskDir of taskDirs) {\n const scanDir = path.resolve(rootDir, taskDir);\n try {\n await fs.access(scanDir);\n } catch {\n continue;\n }\n const dirResults: string[] = [];\n await readDirectoryRecursive(rootDir, scanDir, dirResults);\n for (const filePath of dirResults) {\n if (!seen.has(filePath)) {\n seen.add(filePath);\n if (isIgnored && isIgnored(filePath)) {\n continue;\n }\n results.push(filePath);\n }\n }\n }\n\n return results.sort();\n}\n\nexport async function parseTask(rootDir: string, relativePath: string): Promise<TaskRecord> {\n const absolutePath = path.join(rootDir, relativePath);\n const raw = await fs.readFile(absolutePath, \"utf8\");\n const stats = await fs.stat(absolutePath);\n const parsed = matter(raw);\n const defaults = buildDefaults(relativePath, stats);\n const { frontmatter, extraFrontmatter, normalized } = splitFrontmatter(parsed.data, defaults);\n\n return {\n path: toPosixPath(relativePath),\n content: parsed.content,\n frontmatter,\n extraFrontmatter,\n raw,\n normalized\n };\n}\n\nexport async function readConfig(rootDir: string): Promise<ConfigFile> {\n const configFilePath = path.join(rootDir, CONFIG_FILE_NAME);\n\n try {\n const raw = await fs.readFile(configFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ConfigFile>;\n const taskDirs = Array.isArray(parsed.taskDirs)\n ? parsed.taskDirs.filter((item): item is string => typeof item === \"string\")\n : [\".\"];\n const ignorePaths = Array.isArray(parsed.ignorePaths)\n ? parsed.ignorePaths.filter((item): item is string => typeof item === \"string\")\n : [];\n const order = Array.isArray(parsed.order)\n ? parsed.order.filter((item): item is string => typeof item === \"string\")\n : [];\n return { version: parsed.version ?? 1, taskDirs, ignorePaths, order };\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code !== \"ENOENT\") {\n throw error;\n }\n return { version: 1, taskDirs: [\".\"], ignorePaths: [], order: [] };\n }\n}\n\nasync function reconcileOrder(rootDir: string, taskPaths: string[]): Promise<{ order: string[]; changed: boolean }> {\n const config = await readConfig(rootDir);\n const order = config.order;\n\n const known = new Set(taskPaths);\n const nextOrder = order.filter((item) => known.has(item));\n for (const taskPath of taskPaths) {\n if (!nextOrder.includes(taskPath)) {\n nextOrder.push(taskPath);\n }\n }\n\n const changed = nextOrder.length !== order.length || nextOrder.some((item, index) => item !== order[index]);\n return { order: nextOrder, changed };\n}\n\nexport async function saveOrder(rootDir: string, order: string[]): Promise<void> {\n const normalized = Array.from(\n new Set(\n order.map((item) => ensureMarkdownExtension(normalizeRelativePath(item)))\n )\n );\n const existing = await readConfig(rootDir);\n const payload: ConfigFile = { version: 1, taskDirs: existing.taskDirs, ignorePaths: existing.ignorePaths, order: normalized };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function saveConfig(rootDir: string, taskDirs: string[], ignorePaths?: string[]): Promise<ConfigFile> {\n const validated = taskDirs.map((dir) => {\n const normalized = dir.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\") || \".\";\n if (normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"taskDirs must stay within the workspace root.\");\n }\n return normalized;\n });\n if (validated.length === 0) {\n throw new ValidationError(\"taskDirs must contain at least one directory.\");\n }\n const existing = await readConfig(rootDir);\n const validatedIgnorePaths = ignorePaths ?? existing.ignorePaths;\n const payload: ConfigFile = { version: 1, taskDirs: validated, ignorePaths: validatedIgnorePaths, order: existing.order };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n return payload;\n}\n\nexport async function listTasks(rootDir: string): Promise<TaskListResponse> {\n const config = await readConfig(rootDir);\n const files = await listMarkdownFiles(rootDir, config.taskDirs, config.ignorePaths);\n const errors: TaskParseError[] = [];\n const tasks = await Promise.all(\n files.map(async (relativePath) => {\n try {\n return await parseTask(rootDir, relativePath);\n } catch (error) {\n errors.push({\n path: relativePath,\n message: error instanceof Error ? error.message : \"Unknown parse error\"\n });\n return null;\n }\n })\n );\n\n const taskRecords = tasks.filter((task): task is TaskRecord => task !== null);\n const { order, changed } = await reconcileOrder(\n rootDir,\n taskRecords.map((task) => task.path)\n );\n\n if (changed) {\n await saveOrder(rootDir, order);\n }\n\n const orderIndex = new Map(order.map((item, index) => [item, index]));\n taskRecords.sort((left, right) => {\n const leftIndex = orderIndex.get(left.path) ?? Number.MAX_SAFE_INTEGER;\n const rightIndex = orderIndex.get(right.path) ?? Number.MAX_SAFE_INTEGER;\n return leftIndex - rightIndex || left.path.localeCompare(right.path);\n });\n\n return { tasks: taskRecords, errors };\n}\n\nasync function ensureDirectoryForFile(rootDir: string, relativeFilePath: string): Promise<string> {\n const normalized = ensureMarkdownExtension(normalizeRelativePath(relativeFilePath));\n const absolutePath = path.join(rootDir, normalized);\n const directory = path.dirname(absolutePath);\n await fs.mkdir(directory, { recursive: true });\n return normalized;\n}\n\nasync function nextAvailablePath(rootDir: string, directory: string, title: string): Promise<string> {\n const safeDirectory = directory ? normalizeRelativePath(directory) : \"\";\n const slug = slugify(title);\n const base = safeDirectory ? `${safeDirectory}/${slug}` : slug;\n\n let attempt = 0;\n while (true) {\n const candidate = ensureMarkdownExtension(attempt === 0 ? base : `${base}-${attempt + 1}`);\n try {\n await fs.access(path.join(rootDir, candidate));\n attempt += 1;\n } catch {\n return candidate;\n }\n }\n}\n\nexport async function createTask(rootDir: string, input: CreateTaskInput): Promise<TaskRecord> {\n if (!input.title.trim()) {\n throw new ValidationError(\"Title is required.\");\n }\n\n const now = asUtcISOString(new Date());\n const relativePath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : await nextAvailablePath(rootDir, input.directory ?? \"\", input.title);\n const absolutePath = path.join(rootDir, relativePath);\n\n try {\n await fs.access(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at that path.\");\n }\n }\n\n const record: TaskRecord = {\n path: relativePath,\n content: input.content ?? \"\",\n raw: \"\",\n normalized: false,\n extraFrontmatter: input.extraFrontmatter ?? {},\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority ?? \"MUST\",\n status: input.status ?? \"TODO\",\n createdAt: now,\n updatedAt: now\n }\n };\n\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, serializeTask(record), \"utf8\");\n\n const current = await listTasks(rootDir);\n await saveOrder(rootDir, current.tasks.map((task) => task.path).concat(relativePath));\n return parseTask(rootDir, relativePath);\n}\n\nexport async function updateTask(rootDir: string, currentPath: string, input: UpdateTaskInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n if (input.baseUpdatedAt && existing.frontmatter.updatedAt !== input.baseUpdatedAt) {\n throw new ConflictError(\"The task changed on disk. Reload before saving.\");\n }\n\n const nextPath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : normalizedCurrentPath;\n const absoluteNextPath = path.join(rootDir, nextPath);\n\n if (nextPath !== normalizedCurrentPath) {\n try {\n await fs.access(absoluteNextPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at the target path.\");\n }\n }\n }\n\n const record: TaskRecord = {\n path: nextPath,\n raw: existing.raw,\n normalized: false,\n content: input.content,\n extraFrontmatter: input.extraFrontmatter ?? existing.extraFrontmatter,\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority,\n status: input.status,\n createdAt: existing.frontmatter.createdAt,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n if (nextPath !== normalizedCurrentPath) {\n await fs.mkdir(path.dirname(absoluteNextPath), { recursive: true });\n await fs.rename(absoluteCurrentPath, absoluteNextPath);\n }\n\n const current = await listTasks(rootDir);\n const updatedOrder = current.tasks.map((task) => task.path);\n await saveOrder(rootDir, updatedOrder);\n return parseTask(rootDir, nextPath);\n}\n\nexport async function deleteTask(rootDir: string, relativePath: string): Promise<void> {\n const normalizedPath = ensureMarkdownExtension(normalizeRelativePath(relativePath));\n const absolutePath = path.join(rootDir, normalizedPath);\n\n try {\n await fs.unlink(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const current = await listTasks(rootDir);\n await saveOrder(\n rootDir,\n current.tasks.map((task) => task.path)\n );\n}\n\nexport async function patchTaskFields(rootDir: string, currentPath: string, input: PatchTaskFieldsInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const priority = input.priority && REQUIRED_PRIORITY.includes(input.priority) ? input.priority : existing.frontmatter.priority;\n const status = input.status && REQUIRED_STATUS.includes(input.status) ? input.status : existing.frontmatter.status;\n\n if (priority === existing.frontmatter.priority && status === existing.frontmatter.status) {\n return existing;\n }\n\n const record: TaskRecord = {\n path: normalizedCurrentPath,\n raw: existing.raw,\n normalized: false,\n content: existing.content,\n extraFrontmatter: existing.extraFrontmatter,\n frontmatter: {\n ...existing.frontmatter,\n priority,\n status,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n return parseTask(rootDir, normalizedCurrentPath);\n}\n\nexport function parseOrderPayload(input: unknown): string[] {\n if (!Array.isArray(input)) {\n throw new ValidationError(\"Order payload must be an array.\");\n }\n\n return input.map((item) => ensureMarkdownExtension(normalizeRelativePath(String(item))));\n}\n\nexport async function readOrder(rootDir: string): Promise<ConfigFile> {\n const config = await readConfig(rootDir);\n const { order } = await reconcileOrder(\n rootDir,\n (await listTasks(rootDir)).tasks.map((task) => task.path)\n );\n return { version: 1, taskDirs: config.taskDirs, ignorePaths: config.ignorePaths, order };\n}\n\nexport const taskStoreUtils = {\n slugify,\n normalizeRelativePath,\n ensureMarkdownExtension,\n splitFrontmatter,\n buildDefaults\n};\n","export const CONFIG_FILE_NAME = \".md-task-viewer.json\";\n\nexport type TaskPriority = \"MUST\" | \"WANT\";\nexport type TaskStatus = \"TODO\" | \"WIP\" | \"DONE\";\n\nexport interface TaskFrontmatter {\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n createdAt: string;\n updatedAt: string;\n [key: string]: unknown;\n}\n\nexport interface TaskRecord {\n path: string;\n content: string;\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n raw: string;\n normalized: boolean;\n}\n\nexport interface TaskParseError {\n path: string;\n message: string;\n}\n\nexport interface TaskListResponse {\n tasks: TaskRecord[];\n errors: TaskParseError[];\n}\n\nexport interface CreateTaskInput {\n title: string;\n priority?: TaskPriority;\n status?: TaskStatus;\n content?: string;\n directory?: string;\n path?: string;\n extraFrontmatter?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskInput {\n path?: string;\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n content: string;\n extraFrontmatter?: Record<string, unknown>;\n baseUpdatedAt?: string;\n}\n\nexport interface PatchTaskFieldsInput {\n priority?: TaskPriority;\n status?: TaskStatus;\n}\n\nexport interface ConfigFile {\n version: number;\n taskDirs: string[];\n ignorePaths: string[];\n order: string[];\n}\n"],"mappings":";;;AACA,OAAOA,WAAU;AACjB,OAAO,aAAa;AACpB,OAAO,UAAU;;;ACHjB,OAAO,aAAuC;AAC9C,OAAO,mBAAmB;AAC1B,OAAO,cAAc;AACrB,OAAOC,WAAU;AACjB,SAAS,qBAAqB;;;ACJ9B,OAAO,YAAY;AACnB,OAAO,eAAe;AACtB,OAAO,UAAU;AACjB,SAAS,YAAY,UAAU;;;ACHxB,IAAM,mBAAmB;;;ADkBhC,IAAM,sBAAsB,oBAAI,IAAI,CAAC,OAAO,WAAW,CAAC;AACxD,IAAM,oBAAoC,CAAC,QAAQ,MAAM;AACzD,IAAM,kBAAgC,CAAC,QAAQ,OAAO,MAAM;AAErD,IAAM,gBAAN,cAA4B,MAAM;AAAC;AACnC,IAAM,kBAAN,cAA8B,MAAM;AAAC;AAE5C,SAAS,YAAY,UAA0B;AAC7C,SAAO,SAAS,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AAC1C;AAEA,SAAS,sBAAsB,WAA2B;AACxD,QAAM,aAAa,YAAY,KAAK,MAAM,UAAU,UAAU,KAAK,CAAC,CAAC;AACrE,MAAI,CAAC,cAAc,eAAe,OAAO,WAAW,WAAW,KAAK,KAAK,WAAW,SAAS,MAAM,GAAG;AACpG,UAAM,IAAI,gBAAgB,2CAA2C;AAAA,EACvE;AAEA,SAAO,WAAW,QAAQ,UAAU,EAAE;AACxC;AAEA,SAAS,wBAAwB,UAA0B;AACzD,SAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI,WAAW,GAAG,QAAQ;AAC9D;AAEA,SAAS,eAAe,MAAoB;AAC1C,SAAO,KAAK,YAAY;AAC1B;AAEA,SAAS,QAAQ,OAAuB;AACtC,QAAM,OAAO,MACV,YAAY,EACZ,UAAU,MAAM,EAChB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAEzB,SAAO,QAAQ;AACjB;AAEA,SAAS,cAAc,UAAkB,OAA0D;AACjG,QAAM,WAAW,KAAK,SAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAC/D,QAAM,QAAQ,SAAS,QAAQ,UAAU,GAAG,EAAE,QAAQ,SAAS,CAAC,SAAS,KAAK,YAAY,CAAC;AAE3F,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW,eAAe,MAAM,SAAS;AAAA,IACzC,WAAW,eAAe,MAAM,KAAK;AAAA,EACvC;AACF;AAEA,SAAS,iBAAiB,MAA+B,eAIvD;AACA,QAAM,mBAA4C,CAAC;AAEnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,CAAC,CAAC,SAAS,YAAY,UAAU,aAAa,WAAW,EAAE,SAAS,GAAG,GAAG;AAC5E,uBAAiB,GAAG,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,QAAQ,cAAc;AAC/F,QAAM,WAAW,kBAAkB,SAAS,KAAK,QAAwB,IACpE,KAAK,WACN,cAAc;AAClB,QAAM,SAAS,gBAAgB,SAAS,KAAK,MAAoB,IAC5D,KAAK,SACN,cAAc;AAClB,QAAM,YACJ,OAAO,KAAK,cAAc,YAAY,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,IAC1E,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY,IACrC,cAAc;AACpB,QAAM,YACJ,OAAO,KAAK,cAAc,YAAY,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC,IAC1E,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY,IACrC,cAAc;AAEpB,QAAM,aACJ,UAAU,KAAK,SACf,aAAa,KAAK,YAClB,WAAW,KAAK,UAChB,cAAc,KAAK,aACnB,cAAc,KAAK;AAErB,SAAO;AAAA,IACL,aAAa,EAAE,OAAO,UAAU,QAAQ,WAAW,UAAU;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,cAAc,QAA4B;AACxD,QAAM,OAAO;AAAA,IACX,GAAG,OAAO;AAAA,IACV,OAAO,OAAO,YAAY;AAAA,IAC1B,UAAU,OAAO,YAAY;AAAA,IAC7B,QAAQ,OAAO,YAAY;AAAA,IAC3B,WAAW,OAAO,YAAY;AAAA,IAC9B,WAAW,OAAO,YAAY;AAAA,EAChC;AAEA,SAAO,OAAO,UAAU,OAAO,SAAS,IAAI;AAC9C;AAEA,eAAe,uBAAuB,SAAiB,YAAoB,SAAkC;AAC3G,QAAM,UAAU,MAAM,GAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAEpE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,UAAU,MAAM,SAAS,gBAAgB;AAC1D;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,KAAK,YAAY,MAAM,IAAI;AACrD,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,uBAAuB,SAAS,cAAc,OAAO;AAC3D;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,kBAAkB;AACnC;AAAA,IACF;AAEA,QAAI,CAAC,oBAAoB,IAAI,KAAK,QAAQ,MAAM,IAAI,EAAE,YAAY,CAAC,GAAG;AACpE;AAAA,IACF;AAEA,YAAQ,KAAK,YAAY,KAAK,SAAS,SAAS,YAAY,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,eAAe,kBAAkB,SAAiB,UAAoB,aAA0C;AAC9G,QAAM,UAAoB,CAAC;AAC3B,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,YAAY,YAAY,SAAS,IAAI,UAAU,WAAW,IAAI;AAEpE,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,KAAK,QAAQ,SAAS,OAAO;AAC7C,QAAI;AACF,YAAM,GAAG,OAAO,OAAO;AAAA,IACzB,QAAQ;AACN;AAAA,IACF;AACA,UAAM,aAAuB,CAAC;AAC9B,UAAM,uBAAuB,SAAS,SAAS,UAAU;AACzD,eAAW,YAAY,YAAY;AACjC,UAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,aAAK,IAAI,QAAQ;AACjB,YAAI,aAAa,UAAU,QAAQ,GAAG;AACpC;AAAA,QACF;AACA,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK;AACtB;AAEA,eAAsB,UAAU,SAAiB,cAA2C;AAC1F,QAAM,eAAe,KAAK,KAAK,SAAS,YAAY;AACpD,QAAM,MAAM,MAAM,GAAG,SAAS,cAAc,MAAM;AAClD,QAAM,QAAQ,MAAM,GAAG,KAAK,YAAY;AACxC,QAAM,SAAS,OAAO,GAAG;AACzB,QAAM,WAAW,cAAc,cAAc,KAAK;AAClD,QAAM,EAAE,aAAa,kBAAkB,WAAW,IAAI,iBAAiB,OAAO,MAAM,QAAQ;AAE5F,SAAO;AAAA,IACL,MAAM,YAAY,YAAY;AAAA,IAC9B,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,SAAsC;AACrE,QAAM,iBAAiB,KAAK,KAAK,SAAS,gBAAgB;AAE1D,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,SAAS,gBAAgB,MAAM;AACpD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,SAAS,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IACzE,CAAC,GAAG;AACR,UAAM,cAAc,MAAM,QAAQ,OAAO,WAAW,IAChD,OAAO,YAAY,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAC5E,CAAC;AACL,UAAM,QAAQ,MAAM,QAAQ,OAAO,KAAK,IACpC,OAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IACtE,CAAC;AACL,WAAO,EAAE,SAAS,OAAO,WAAW,GAAG,UAAU,aAAa,MAAM;AAAA,EACtE,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM;AAAA,IACR;AACA,WAAO,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACnE;AACF;AAEA,eAAe,eAAe,SAAiB,WAAqE;AAClH,QAAM,SAAS,MAAM,WAAW,OAAO;AACvC,QAAM,QAAQ,OAAO;AAErB,QAAM,QAAQ,IAAI,IAAI,SAAS;AAC/B,QAAM,YAAY,MAAM,OAAO,CAAC,SAAS,MAAM,IAAI,IAAI,CAAC;AACxD,aAAW,YAAY,WAAW;AAChC,QAAI,CAAC,UAAU,SAAS,QAAQ,GAAG;AACjC,gBAAU,KAAK,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,UAAU,UAAU,WAAW,MAAM,UAAU,UAAU,KAAK,CAAC,MAAM,UAAU,SAAS,MAAM,KAAK,CAAC;AAC1G,SAAO,EAAE,OAAO,WAAW,QAAQ;AACrC;AAEA,eAAsB,UAAU,SAAiB,OAAgC;AAC/E,QAAM,aAAa,MAAM;AAAA,IACvB,IAAI;AAAA,MACF,MAAM,IAAI,CAAC,SAAS,wBAAwB,sBAAsB,IAAI,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,QAAM,WAAW,MAAM,WAAW,OAAO;AACzC,QAAM,UAAsB,EAAE,SAAS,GAAG,UAAU,SAAS,UAAU,aAAa,SAAS,aAAa,OAAO,WAAW;AAC5H,QAAM,GAAG,UAAU,KAAK,KAAK,SAAS,gBAAgB,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC1G;AAEA,eAAsB,WAAW,SAAiB,UAAoB,aAA6C;AACjH,QAAM,YAAY,SAAS,IAAI,CAAC,QAAQ;AACtC,UAAM,aAAa,IAAI,KAAK,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE,KAAK;AACzE,QAAI,WAAW,WAAW,KAAK,KAAK,WAAW,SAAS,MAAM,GAAG;AAC/D,YAAM,IAAI,gBAAgB,+CAA+C;AAAA,IAC3E;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI,gBAAgB,+CAA+C;AAAA,EAC3E;AACA,QAAM,WAAW,MAAM,WAAW,OAAO;AACzC,QAAM,uBAAuB,eAAe,SAAS;AACrD,QAAM,UAAsB,EAAE,SAAS,GAAG,UAAU,WAAW,aAAa,sBAAsB,OAAO,SAAS,MAAM;AACxH,QAAM,GAAG,UAAU,KAAK,KAAK,SAAS,gBAAgB,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACxG,SAAO;AACT;AAEA,eAAsB,UAAU,SAA4C;AAC1E,QAAM,SAAS,MAAM,WAAW,OAAO;AACvC,QAAM,QAAQ,MAAM,kBAAkB,SAAS,OAAO,UAAU,OAAO,WAAW;AAClF,QAAM,SAA2B,CAAC;AAClC,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,MAAM,IAAI,OAAO,iBAAiB;AAChC,UAAI;AACF,eAAO,MAAM,UAAU,SAAS,YAAY;AAAA,MAC9C,SAAS,OAAO;AACd,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,MAAM,OAAO,CAAC,SAA6B,SAAS,IAAI;AAC5E,QAAM,EAAE,OAAO,QAAQ,IAAI,MAAM;AAAA,IAC/B;AAAA,IACA,YAAY,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EACrC;AAEA,MAAI,SAAS;AACX,UAAM,UAAU,SAAS,KAAK;AAAA,EAChC;AAEA,QAAM,aAAa,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;AACpE,cAAY,KAAK,CAAC,MAAM,UAAU;AAChC,UAAM,YAAY,WAAW,IAAI,KAAK,IAAI,KAAK,OAAO;AACtD,UAAM,aAAa,WAAW,IAAI,MAAM,IAAI,KAAK,OAAO;AACxD,WAAO,YAAY,cAAc,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EACrE,CAAC;AAED,SAAO,EAAE,OAAO,aAAa,OAAO;AACtC;AAEA,eAAe,uBAAuB,SAAiB,kBAA2C;AAChG,QAAM,aAAa,wBAAwB,sBAAsB,gBAAgB,CAAC;AAClF,QAAM,eAAe,KAAK,KAAK,SAAS,UAAU;AAClD,QAAM,YAAY,KAAK,QAAQ,YAAY;AAC3C,QAAM,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,SAAO;AACT;AAEA,eAAe,kBAAkB,SAAiB,WAAmB,OAAgC;AACnG,QAAM,gBAAgB,YAAY,sBAAsB,SAAS,IAAI;AACrE,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,OAAO,gBAAgB,GAAG,aAAa,IAAI,IAAI,KAAK;AAE1D,MAAI,UAAU;AACd,SAAO,MAAM;AACX,UAAM,YAAY,wBAAwB,YAAY,IAAI,OAAO,GAAG,IAAI,IAAI,UAAU,CAAC,EAAE;AACzF,QAAI;AACF,YAAM,GAAG,OAAO,KAAK,KAAK,SAAS,SAAS,CAAC;AAC7C,iBAAW;AAAA,IACb,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,SAAiB,OAA6C;AAC7F,MAAI,CAAC,MAAM,MAAM,KAAK,GAAG;AACvB,UAAM,IAAI,gBAAgB,oBAAoB;AAAA,EAChD;AAEA,QAAM,MAAM,eAAe,oBAAI,KAAK,CAAC;AACrC,QAAM,eAAe,MAAM,MAAM,KAAK,IAClC,MAAM,uBAAuB,SAAS,MAAM,IAAI,IAChD,MAAM,kBAAkB,SAAS,MAAM,aAAa,IAAI,MAAM,KAAK;AACvE,QAAM,eAAe,KAAK,KAAK,SAAS,YAAY;AAEpD,MAAI;AACF,UAAM,GAAG,OAAO,YAAY;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,QAAI,WAAW,SAAS,UAAU;AAAA,IAElC,WAAW,WAAW,MAAM;AAC1B,YAAM;AAAA,IACR,OAAO;AACL,YAAM,IAAI,gBAAgB,qCAAqC;AAAA,IACjE;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM;AAAA,IACN,SAAS,MAAM,WAAW;AAAA,IAC1B,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,kBAAkB,MAAM,oBAAoB,CAAC;AAAA,IAC7C,aAAa;AAAA,MACX,OAAO,MAAM,MAAM,KAAK;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,MAC5B,QAAQ,MAAM,UAAU;AAAA,MACxB,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,GAAG,MAAM,KAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,QAAM,GAAG,UAAU,cAAc,cAAc,MAAM,GAAG,MAAM;AAE9D,QAAM,UAAU,MAAM,UAAU,OAAO;AACvC,QAAM,UAAU,SAAS,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,OAAO,YAAY,CAAC;AACpF,SAAO,UAAU,SAAS,YAAY;AACxC;AAEA,eAAsB,WAAW,SAAiB,aAAqB,OAA6C;AAClH,QAAM,wBAAwB,wBAAwB,sBAAsB,WAAW,CAAC;AACxF,QAAM,sBAAsB,KAAK,KAAK,SAAS,qBAAqB;AAEpE,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,UAAU,SAAS,qBAAqB;AAAA,EAC3D,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,IAAI,cAAc,4BAA4B;AAAA,IACtD;AACA,UAAM;AAAA,EACR;AAEA,MAAI,MAAM,iBAAiB,SAAS,YAAY,cAAc,MAAM,eAAe;AACjF,UAAM,IAAI,cAAc,iDAAiD;AAAA,EAC3E;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK,IAC9B,MAAM,uBAAuB,SAAS,MAAM,IAAI,IAChD;AACJ,QAAM,mBAAmB,KAAK,KAAK,SAAS,QAAQ;AAEpD,MAAI,aAAa,uBAAuB;AACtC,QAAI;AACF,YAAM,GAAG,OAAO,gBAAgB;AAAA,IAClC,SAAS,OAAO;AACd,YAAM,aAAa;AACnB,UAAI,WAAW,SAAS,UAAU;AAAA,MAElC,WAAW,WAAW,MAAM;AAC1B,cAAM;AAAA,MACR,OAAO;AACL,cAAM,IAAI,gBAAgB,2CAA2C;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM;AAAA,IACN,KAAK,SAAS;AAAA,IACd,YAAY;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,kBAAkB,MAAM,oBAAoB,SAAS;AAAA,IACrD,aAAa;AAAA,MACX,OAAO,MAAM,MAAM,KAAK;AAAA,MACxB,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM;AAAA,MACd,WAAW,SAAS,YAAY;AAAA,MAChC,WAAW,eAAe,oBAAI,KAAK,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,GAAG,UAAU,qBAAqB,cAAc,MAAM,GAAG,MAAM;AACrE,MAAI,aAAa,uBAAuB;AACtC,UAAM,GAAG,MAAM,KAAK,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE,UAAM,GAAG,OAAO,qBAAqB,gBAAgB;AAAA,EACvD;AAEA,QAAM,UAAU,MAAM,UAAU,OAAO;AACvC,QAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAC1D,QAAM,UAAU,SAAS,YAAY;AACrC,SAAO,UAAU,SAAS,QAAQ;AACpC;AAEA,eAAsB,WAAW,SAAiB,cAAqC;AACrF,QAAM,iBAAiB,wBAAwB,sBAAsB,YAAY,CAAC;AAClF,QAAM,eAAe,KAAK,KAAK,SAAS,cAAc;AAEtD,MAAI;AACF,UAAM,GAAG,OAAO,YAAY;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,IAAI,cAAc,4BAA4B;AAAA,IACtD;AACA,UAAM;AAAA,EACR;AAEA,QAAM,UAAU,MAAM,UAAU,OAAO;AACvC,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EACvC;AACF;AAEA,eAAsB,gBAAgB,SAAiB,aAAqB,OAAkD;AAC5H,QAAM,wBAAwB,wBAAwB,sBAAsB,WAAW,CAAC;AACxF,QAAM,sBAAsB,KAAK,KAAK,SAAS,qBAAqB;AAEpE,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,UAAU,SAAS,qBAAqB;AAAA,EAC3D,SAAS,OAAO;AACd,UAAM,aAAa;AACnB,QAAI,WAAW,SAAS,UAAU;AAChC,YAAM,IAAI,cAAc,4BAA4B;AAAA,IACtD;AACA,UAAM;AAAA,EACR;AAEA,QAAM,WAAW,MAAM,YAAY,kBAAkB,SAAS,MAAM,QAAQ,IAAI,MAAM,WAAW,SAAS,YAAY;AACtH,QAAM,SAAS,MAAM,UAAU,gBAAgB,SAAS,MAAM,MAAM,IAAI,MAAM,SAAS,SAAS,YAAY;AAE5G,MAAI,aAAa,SAAS,YAAY,YAAY,WAAW,SAAS,YAAY,QAAQ;AACxF,WAAO;AAAA,EACT;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM;AAAA,IACN,KAAK,SAAS;AAAA,IACd,YAAY;AAAA,IACZ,SAAS,SAAS;AAAA,IAClB,kBAAkB,SAAS;AAAA,IAC3B,aAAa;AAAA,MACX,GAAG,SAAS;AAAA,MACZ;AAAA,MACA;AAAA,MACA,WAAW,eAAe,oBAAI,KAAK,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,GAAG,UAAU,qBAAqB,cAAc,MAAM,GAAG,MAAM;AACrE,SAAO,UAAU,SAAS,qBAAqB;AACjD;AAEO,SAAS,kBAAkB,OAA0B;AAC1D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,IAAI,gBAAgB,iCAAiC;AAAA,EAC7D;AAEA,SAAO,MAAM,IAAI,CAAC,SAAS,wBAAwB,sBAAsB,OAAO,IAAI,CAAC,CAAC,CAAC;AACzF;;;AD7eA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYC,MAAK,QAAQ,UAAU;AAOzC,SAAS,iBAAiB,mBAAkD;AAC1E,MAAI,sBAAsB,MAAM;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB;AACrB,WAAO;AAAA,EACT;AACA,SAAOA,MAAK,QAAQ,WAAW,QAAQ;AACzC;AAEA,SAAS,cAAc,OAA+E,OAAsB;AAC1H,MAAI,iBAAiB,iBAAiB;AACpC,UAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAC7C;AAAA,EACF;AACA,MAAI,iBAAiB,eAAe;AAClC,UAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,MAAM,QAAQ,CAAC;AAC7C;AAAA,EACF;AACA,QAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,wBAAwB,CAAC;AAClG;AAEA,eAAsB,aAAa,SAAwD;AACzF,QAAM,MAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC;AACrC,QAAM,YAAY,oBAAI,IAA4D;AAClF,QAAM,YAAY,iBAAiB,QAAQ,SAAS;AAEpD,MAAI,QAAQ,WAAW,YAAY;AACjC,eAAW,YAAY,WAAW;AAChC,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,MAAI,IAAI,cAAc,YAAY,UAAU,QAAQ,OAAO,CAAC;AAE5D,MAAI,KAAK,cAAc,OAAO,SAAS,UAAU;AAC/C,QAAI;AACF,YAAM,OAAO,MAAM,WAAW,QAAQ,SAAU,QAAQ,QAAQ,CAAC,CAAW;AAC5E,aAAO,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI;AAAA,IAClC,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,MAAM,gBAAgB,OAAO,SAAS,UAAU;AAClD,UAAM,cAAc,mBAAoB,QAAQ,OAA2B,GAAG,KAAK,EAAE;AACrF,QAAI;AACF,YAAM,OAAO,MAAM,WAAW,QAAQ,SAAS,aAAc,QAAQ,QAAQ,CAAC,CAAW;AACzF,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,OAAO,gBAAgB,OAAO,SAAS,UAAU;AACnD,UAAM,cAAc,mBAAoB,QAAQ,OAA2B,GAAG,KAAK,EAAE;AACrF,QAAI;AACF,YAAM,WAAW,QAAQ,SAAS,WAAW;AAC7C,aAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,IAC9B,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,MAAM,sBAAsB,OAAO,SAAS,UAAU;AACxD,UAAM,cAAc,mBAAoB,QAAQ,OAA2B,GAAG,KAAK,EAAE;AACrF,QAAI;AACF,YAAM,OAAO,MAAM,gBAAgB,QAAQ,SAAS,aAAc,QAAQ,QAAQ,CAAC,CAAW;AAC9F,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,IAAI,cAAc,OAAO,SAAS,UAAU;AAC9C,QAAI;AACF,YAAM,QAAQ,kBAAmB,QAAQ,MAAqC,SAAS,CAAC,CAAC;AACzF,YAAM,UAAU,QAAQ,SAAS,KAAK;AACtC,aAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,IAC9B,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,IAAI,eAAe,YAAY;AACjC,QAAI;AACF,aAAO,MAAM,WAAW,QAAQ,OAAO;AAAA,IACzC,SAAS,OAAO;AACd,aAAO,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE;AAAA,IAClD;AAAA,EACF,CAAC;AAED,MAAI,IAAI,eAAe,OAAO,SAAS,UAAU;AAC/C,QAAI;AACF,YAAM,OAAO,QAAQ;AACrB,YAAM,WAAW,MAAM;AACvB,UAAI,CAAC,MAAM,QAAQ,QAAQ,KAAK,SAAS,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AACjF,cAAM,IAAI,gBAAgB,uCAAuC;AAAA,MACnE;AACA,UAAI;AACJ,UAAI,MAAM,gBAAgB,QAAW;AACnC,YAAI,CAAC,MAAM,QAAQ,KAAK,WAAW,KAAK,KAAK,YAAY,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AACjG,gBAAM,IAAI,gBAAgB,0CAA0C;AAAA,QACtE;AACA,sBAAc,KAAK;AAAA,MACrB;AACA,YAAM,SAAS,MAAM,WAAW,QAAQ,SAAS,UAAsB,WAAW;AAClF,aAAO,MAAM,KAAK,MAAM;AAAA,IAC1B,SAAS,OAAO;AACd,oBAAc,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,MAAI,IAAI,eAAe,OAAO,UAAU,UAAU;AAChD,UAAM,IAAI,UAAU,KAAK;AAAA,MACvB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,IACd,CAAC;AACD,UAAM,IAAI,MAAM,IAAI;AAEpB,UAAM,WAAW;AAAA,MACf,KAAK,SAAiB;AACpB,cAAM,IAAI,MAAM,SAAS,OAAO;AAAA;AAAA,CAAM;AAAA,MACxC;AAAA,MACA,QAAQ;AACN,cAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF;AAEA,cAAU,IAAI,QAAQ;AACtB,UAAM,IAAI,GAAG,SAAS,MAAM;AAC1B,gBAAU,OAAO,QAAQ;AAAA,IAC3B,CAAC;AAED,WAAO,MAAM,OAAO;AAAA,EACtB,CAAC;AAED,QAAM,UAAU,SAAS,MAAM,QAAQ,SAAS;AAAA,IAC9C,eAAe;AAAA,IACf,SAAS,CAAC,cAAc,UAAU,SAAS,GAAGA,MAAK,GAAG,MAAM,KAAK,UAAU,SAAS,GAAGA,MAAK,GAAG,cAAc;AAAA,EAC/G,CAAC;AAED,UAAQ,GAAG,OAAO,CAAC,WAAW,gBAAgB;AAC5C,UAAM,aAAa,YAAY,SAAS,KAAK,KAAK,YAAY,SAAS,WAAW;AAClF,UAAM,eAAeA,MAAK,SAAS,WAAW,MAAM;AACpD,QAAI,CAAC,cAAc,CAAC,cAAc;AAChC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU;AAAA,MAC7B,MAAM;AAAA,MACN;AAAA,MACA,MAAMA,MAAK,SAAS,QAAQ,SAAS,WAAW;AAAA,IAClD,CAAC;AAED,eAAW,YAAY,WAAW;AAChC,eAAS,KAAK,OAAO;AAAA,IACvB;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,WAAW,YAAY;AACjC,UAAM,QAAQ,MAAM;AAAA,EACtB,CAAC;AAED,MAAI,WAAW;AACb,UAAM,IAAI,SAAS,eAAe;AAAA,MAChC,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,mBAAmB,OAAO,SAAS,UAAU;AAC/C,UAAI,QAAQ,IAAI,KAAK,WAAW,OAAO,GAAG;AACxC,eAAO,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,MACpD;AACA,aAAO,MAAM,SAAS,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ADlMA,SAAS,UAAU,MAA4B;AAC7C,MAAI,UAAU,QAAQ,IAAI;AAC1B,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,aAAa;AAEjB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,YAAY,UAAU;AACxB,aAAO,OAAO,KAAK,QAAQ,CAAC,KAAK,IAAI;AACrC,eAAS;AACT;AAAA,IACF;AACA,QAAI,YAAY,UAAU;AACxB,aAAO,KAAK,QAAQ,CAAC,KAAK;AAC1B,eAAS;AACT;AAAA,IACF;AACA,QAAI,YAAY,aAAa;AAC3B,mBAAa;AACb;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,WAAW,IAAI,GAAG;AAC7B,gBAAUC,MAAK,QAAQ,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,MAAM,MAAM,WAAW;AAC3C;AAEA,eAAe,OAAsB;AACnC,QAAM,UAAU,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC/C,QAAM,MAAM,MAAM,aAAa,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAC3D,QAAM,UAAU,MAAM,IAAI,OAAO;AAAA,IAC/B,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,EAChB,CAAC;AAED,QAAM,aAAa,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,YAAY,cAAc,QAAQ,IAAI;AACxG,UAAQ,OAAO,MAAM;AAAA,QAA+B,QAAQ,OAAO;AAAA,OAAU,UAAU;AAAA,CAAI;AAE3F,MAAI,QAAQ,YAAY;AACtB,UAAM,KAAK,UAAU;AAAA,EACvB;AAEA,QAAM,WAAW,YAA2B;AAC1C,UAAM,IAAI,MAAM;AAChB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,SAAS,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,CAAI;AACjG,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["path","path","path","path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/taskStore.ts","../src/types.ts","../src/slugify.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport open from \"open\";\nimport { createServer } from \"./server.js\";\n\ninterface CliOptions {\n rootDir: string;\n port: number;\n host: string;\n shouldOpen: boolean;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n let rootDir = process.cwd();\n let port = 3847;\n let host = \"127.0.0.1\";\n let shouldOpen = true;\n\n for (let index = 0; index < argv.length; index += 1) {\n const current = argv[index];\n if (current === \"--port\") {\n port = Number(argv[index + 1] ?? port);\n index += 1;\n continue;\n }\n if (current === \"--host\") {\n host = argv[index + 1] ?? host;\n index += 1;\n continue;\n }\n if (current === \"--no-open\") {\n shouldOpen = false;\n continue;\n }\n if (!current.startsWith(\"--\")) {\n rootDir = path.resolve(current);\n }\n }\n\n return { rootDir, port, host, shouldOpen };\n}\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n const app = await createServer({ rootDir: options.rootDir });\n const address = await app.listen({\n port: options.port,\n host: options.host\n });\n\n const browserUrl = address.replace(options.host, options.host === \"0.0.0.0\" ? \"127.0.0.1\" : options.host);\n process.stdout.write(`Markdown Task Viewer\\nRoot: ${options.rootDir}\\nURL: ${browserUrl}\\n`);\n\n if (options.shouldOpen) {\n await open(browserUrl);\n }\n\n const shutdown = async (): Promise<void> => {\n await app.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((error) => {\n process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\\n`);\n process.exit(1);\n});\n","import Fastify, { type FastifyInstance } from \"fastify\";\nimport fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ConflictError,\n ValidationError,\n createTask,\n deleteTask,\n listTasks,\n parseOrderPayload,\n patchTaskFields,\n readConfig,\n saveConfig,\n saveOrder,\n updateTask\n} from \"./taskStore.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CreateServerOptions {\n rootDir: string;\n clientDir?: string | null;\n}\n\nfunction resolveClientDir(explicitClientDir?: string | null): string | null {\n if (explicitClientDir === null) {\n return null;\n }\n if (explicitClientDir) {\n return explicitClientDir;\n }\n return path.resolve(__dirname, \"client\");\n}\n\nfunction sendJsonError(reply: { code: (statusCode: number) => { send: (payload: unknown) => void } }, error: unknown): void {\n if (error instanceof ValidationError) {\n reply.code(400).send({ error: error.message });\n return;\n }\n if (error instanceof ConflictError) {\n reply.code(409).send({ error: error.message });\n return;\n }\n reply.code(500).send({ error: error instanceof Error ? error.message : \"Internal server error\" });\n}\n\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n const listeners = new Set<{ send: (payload: string) => void; close: () => void }>();\n const clientDir = resolveClientDir(options.clientDir);\n\n app.addHook(\"onClose\", async () => {\n for (const listener of listeners) {\n listener.close();\n }\n });\n\n app.get(\"/api/tasks\", async () => listTasks(options.rootDir));\n\n app.post(\"/api/tasks\", async (request, reply) => {\n try {\n const task = await createTask(options.rootDir, (request.body ?? {}) as never);\n return reply.code(201).send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await updateTask(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.delete(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n await deleteTask(options.rootDir, currentPath);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/task-fields/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await patchTaskFields(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.put(\"/api/order\", async (request, reply) => {\n try {\n const order = parseOrderPayload((request.body as { order?: unknown } | null)?.order ?? []);\n await saveOrder(options.rootDir, order);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/config\", async () => {\n try {\n return await readConfig(options.rootDir);\n } catch (error) {\n return { version: 1, taskDirs: [\".\"], order: [] };\n }\n });\n\n app.put(\"/api/config\", async (request, reply) => {\n try {\n const body = request.body as { taskDirs?: unknown; ignorePaths?: unknown } | null;\n const taskDirs = body?.taskDirs;\n if (!Array.isArray(taskDirs) || taskDirs.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"taskDirs must be an array of strings.\");\n }\n let ignorePaths: string[] | undefined;\n if (body?.ignorePaths !== undefined) {\n if (!Array.isArray(body.ignorePaths) || body.ignorePaths.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"ignorePaths must be an array of strings.\");\n }\n ignorePaths = body.ignorePaths as string[];\n }\n const config = await saveConfig(options.rootDir, taskDirs as string[], ignorePaths);\n return reply.send(config);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/events\", async (_request, reply) => {\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\"\n });\n reply.raw.write(\"\\n\");\n\n const listener = {\n send(payload: string) {\n reply.raw.write(`data: ${payload}\\n\\n`);\n },\n close() {\n reply.raw.end();\n }\n };\n\n listeners.add(listener);\n reply.raw.on(\"close\", () => {\n listeners.delete(listener);\n });\n\n return reply.hijack();\n });\n\n const watcher = chokidar.watch(options.rootDir, {\n ignoreInitial: true,\n ignored: (watchPath) => watchPath.includes(`${path.sep}.git`) || watchPath.includes(`${path.sep}node_modules`)\n });\n\n watcher.on(\"all\", (eventName, changedPath) => {\n const isMarkdown = changedPath.endsWith(\".md\") || changedPath.endsWith(\".markdown\");\n const isConfigFile = path.basename(changedPath) === \".md-task-viewer.json\";\n if (!isMarkdown && !isConfigFile) {\n return;\n }\n\n const payload = JSON.stringify({\n type: \"tasks-changed\",\n eventName,\n path: path.relative(options.rootDir, changedPath)\n });\n\n for (const listener of listeners) {\n listener.send(payload);\n }\n });\n\n app.addHook(\"onClose\", async () => {\n await watcher.close();\n });\n\n if (clientDir) {\n await app.register(fastifyStatic, {\n root: clientDir,\n prefix: \"/\"\n });\n\n app.setNotFoundHandler(async (request, reply) => {\n if (request.raw.url?.startsWith(\"/api/\")) {\n return reply.code(404).send({ error: \"Not found\" });\n }\n return reply.sendFile(\"index.html\");\n });\n }\n\n return app;\n}\n","import matter from \"gray-matter\";\nimport picomatch from \"picomatch\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport {\n CONFIG_FILE_NAME,\n type ConfigFile,\n type CreateTaskInput,\n type PatchTaskFieldsInput,\n type TaskFrontmatter,\n type TaskListResponse,\n type TaskParseError,\n type TaskPriority,\n type TaskRecord,\n type TaskStatus,\n type UpdateTaskInput\n} from \"./types.js\";\nimport { slugify } from \"./slugify.js\";\n\nconst MARKDOWN_EXTENSIONS = new Set([\".md\", \".markdown\"]);\nconst REQUIRED_PRIORITY: TaskPriority[] = [\"MUST\", \"WANT\"];\nconst REQUIRED_STATUS: TaskStatus[] = [\"TODO\", \"WIP\", \"DONE\"];\n\nexport class ConflictError extends Error {}\nexport class ValidationError extends Error {}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction normalizeRelativePath(candidate: string): string {\n const normalized = toPosixPath(path.posix.normalize(candidate.trim()));\n if (!normalized || normalized === \".\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"Path must stay within the workspace root.\");\n }\n\n return normalized.replace(/^\\.\\/+/, \"\");\n}\n\nfunction ensureMarkdownExtension(filePath: string): string {\n return path.posix.extname(filePath) ? filePath : `${filePath}.md`;\n}\n\nfunction asUtcISOString(date: Date): string {\n return date.toISOString();\n}\n\nfunction buildDefaults(filePath: string, stats: { birthtime: Date; mtime: Date }): TaskFrontmatter {\n const basename = path.basename(filePath, path.extname(filePath));\n const title = basename.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n\n return {\n title,\n priority: \"WANT\",\n status: \"TODO\",\n createdAt: asUtcISOString(stats.birthtime),\n updatedAt: asUtcISOString(stats.mtime)\n };\n}\n\nfunction splitFrontmatter(data: Record<string, unknown>, statsDefaults: TaskFrontmatter): {\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n normalized: boolean;\n} {\n const extraFrontmatter: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (![\"title\", \"priority\", \"status\", \"createdAt\", \"updatedAt\"].includes(key)) {\n extraFrontmatter[key] = value;\n }\n }\n\n const title = typeof data.title === \"string\" && data.title.trim() ? data.title : statsDefaults.title;\n const priority = REQUIRED_PRIORITY.includes(data.priority as TaskPriority)\n ? (data.priority as TaskPriority)\n : statsDefaults.priority;\n const status = REQUIRED_STATUS.includes(data.status as TaskStatus)\n ? (data.status as TaskStatus)\n : statsDefaults.status;\n const createdAt =\n typeof data.createdAt === \"string\" && !Number.isNaN(Date.parse(data.createdAt))\n ? new Date(data.createdAt).toISOString()\n : statsDefaults.createdAt;\n const updatedAt =\n typeof data.updatedAt === \"string\" && !Number.isNaN(Date.parse(data.updatedAt))\n ? new Date(data.updatedAt).toISOString()\n : statsDefaults.updatedAt;\n\n const normalized =\n title !== data.title ||\n priority !== data.priority ||\n status !== data.status ||\n createdAt !== data.createdAt ||\n updatedAt !== data.updatedAt;\n\n return {\n frontmatter: { title, priority, status, createdAt, updatedAt },\n extraFrontmatter,\n normalized\n };\n}\n\nexport function serializeTask(record: TaskRecord): string {\n const data = {\n ...record.extraFrontmatter,\n title: record.frontmatter.title,\n priority: record.frontmatter.priority,\n status: record.frontmatter.status,\n createdAt: record.frontmatter.createdAt,\n updatedAt: record.frontmatter.updatedAt\n };\n\n return matter.stringify(record.content, data);\n}\n\nasync function readDirectoryRecursive(rootDir: string, currentDir: string, results: string[]): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === \".git\" || entry.name === \"node_modules\") {\n continue;\n }\n\n const absolutePath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n await readDirectoryRecursive(rootDir, absolutePath, results);\n continue;\n }\n\n if (entry.name === CONFIG_FILE_NAME) {\n continue;\n }\n\n if (!MARKDOWN_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n\n results.push(toPosixPath(path.relative(rootDir, absolutePath)));\n }\n}\n\nasync function listMarkdownFiles(rootDir: string, taskDirs: string[], ignorePaths: string[]): Promise<string[]> {\n const results: string[] = [];\n const seen = new Set<string>();\n\n const isIgnored = ignorePaths.length > 0 ? picomatch(ignorePaths) : null;\n\n for (const taskDir of taskDirs) {\n const scanDir = path.resolve(rootDir, taskDir);\n try {\n await fs.access(scanDir);\n } catch {\n continue;\n }\n const dirResults: string[] = [];\n await readDirectoryRecursive(rootDir, scanDir, dirResults);\n for (const filePath of dirResults) {\n if (!seen.has(filePath)) {\n seen.add(filePath);\n if (isIgnored && isIgnored(filePath)) {\n continue;\n }\n results.push(filePath);\n }\n }\n }\n\n return results.sort();\n}\n\nexport async function parseTask(rootDir: string, relativePath: string): Promise<TaskRecord> {\n const absolutePath = path.join(rootDir, relativePath);\n const raw = await fs.readFile(absolutePath, \"utf8\");\n const stats = await fs.stat(absolutePath);\n const parsed = matter(raw);\n const defaults = buildDefaults(relativePath, stats);\n const { frontmatter, extraFrontmatter, normalized } = splitFrontmatter(parsed.data, defaults);\n\n return {\n path: toPosixPath(relativePath),\n content: parsed.content,\n frontmatter,\n extraFrontmatter,\n raw,\n normalized\n };\n}\n\nexport async function readConfig(rootDir: string): Promise<ConfigFile> {\n const configFilePath = path.join(rootDir, CONFIG_FILE_NAME);\n\n try {\n const raw = await fs.readFile(configFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ConfigFile>;\n const taskDirs = Array.isArray(parsed.taskDirs)\n ? parsed.taskDirs.filter((item): item is string => typeof item === \"string\")\n : [\".\"];\n const ignorePaths = Array.isArray(parsed.ignorePaths)\n ? parsed.ignorePaths.filter((item): item is string => typeof item === \"string\")\n : [];\n const order = Array.isArray(parsed.order)\n ? parsed.order.filter((item): item is string => typeof item === \"string\")\n : [];\n return { version: parsed.version ?? 1, taskDirs, ignorePaths, order };\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code !== \"ENOENT\") {\n throw error;\n }\n return { version: 1, taskDirs: [\".\"], ignorePaths: [], order: [] };\n }\n}\n\nasync function reconcileOrder(rootDir: string, taskPaths: string[]): Promise<{ order: string[]; changed: boolean }> {\n const config = await readConfig(rootDir);\n const order = config.order;\n\n const known = new Set(taskPaths);\n const nextOrder = order.filter((item) => known.has(item));\n for (const taskPath of taskPaths) {\n if (!nextOrder.includes(taskPath)) {\n nextOrder.push(taskPath);\n }\n }\n\n const changed = nextOrder.length !== order.length || nextOrder.some((item, index) => item !== order[index]);\n return { order: nextOrder, changed };\n}\n\nexport async function saveOrder(rootDir: string, order: string[]): Promise<void> {\n const normalized = Array.from(\n new Set(\n order.map((item) => ensureMarkdownExtension(normalizeRelativePath(item)))\n )\n );\n const existing = await readConfig(rootDir);\n const payload: ConfigFile = { version: 1, taskDirs: existing.taskDirs, ignorePaths: existing.ignorePaths, order: normalized };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function saveConfig(rootDir: string, taskDirs: string[], ignorePaths?: string[]): Promise<ConfigFile> {\n const validated = taskDirs.map((dir) => {\n const normalized = dir.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\") || \".\";\n if (normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"taskDirs must stay within the workspace root.\");\n }\n return normalized;\n });\n if (validated.length === 0) {\n throw new ValidationError(\"taskDirs must contain at least one directory.\");\n }\n const existing = await readConfig(rootDir);\n const validatedIgnorePaths = ignorePaths ?? existing.ignorePaths;\n const payload: ConfigFile = { version: 1, taskDirs: validated, ignorePaths: validatedIgnorePaths, order: existing.order };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n return payload;\n}\n\nexport async function listTasks(rootDir: string): Promise<TaskListResponse> {\n const config = await readConfig(rootDir);\n const files = await listMarkdownFiles(rootDir, config.taskDirs, config.ignorePaths);\n const errors: TaskParseError[] = [];\n const tasks = await Promise.all(\n files.map(async (relativePath) => {\n try {\n return await parseTask(rootDir, relativePath);\n } catch (error) {\n errors.push({\n path: relativePath,\n message: error instanceof Error ? error.message : \"Unknown parse error\"\n });\n return null;\n }\n })\n );\n\n const taskRecords = tasks.filter((task): task is TaskRecord => task !== null);\n const { order, changed } = await reconcileOrder(\n rootDir,\n taskRecords.map((task) => task.path)\n );\n\n if (changed) {\n await saveOrder(rootDir, order);\n }\n\n const orderIndex = new Map(order.map((item, index) => [item, index]));\n taskRecords.sort((left, right) => {\n const leftIndex = orderIndex.get(left.path) ?? Number.MAX_SAFE_INTEGER;\n const rightIndex = orderIndex.get(right.path) ?? Number.MAX_SAFE_INTEGER;\n return leftIndex - rightIndex || left.path.localeCompare(right.path);\n });\n\n return { tasks: taskRecords, errors };\n}\n\nasync function ensureDirectoryForFile(rootDir: string, relativeFilePath: string): Promise<string> {\n const normalized = ensureMarkdownExtension(normalizeRelativePath(relativeFilePath));\n const absolutePath = path.join(rootDir, normalized);\n const directory = path.dirname(absolutePath);\n await fs.mkdir(directory, { recursive: true });\n return normalized;\n}\n\nasync function nextAvailablePath(rootDir: string, directory: string, title: string): Promise<string> {\n const safeDirectory = directory ? normalizeRelativePath(directory) : \"\";\n const slug = slugify(title);\n const base = safeDirectory ? `${safeDirectory}/${slug}` : slug;\n\n let attempt = 0;\n while (true) {\n const candidate = ensureMarkdownExtension(attempt === 0 ? base : `${base}-${attempt + 1}`);\n try {\n await fs.access(path.join(rootDir, candidate));\n attempt += 1;\n } catch {\n return candidate;\n }\n }\n}\n\nexport async function createTask(rootDir: string, input: CreateTaskInput): Promise<TaskRecord> {\n if (!input.title.trim()) {\n throw new ValidationError(\"Title is required.\");\n }\n\n const now = asUtcISOString(new Date());\n const relativePath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : await nextAvailablePath(rootDir, input.directory ?? \"\", input.title);\n const absolutePath = path.join(rootDir, relativePath);\n\n try {\n await fs.access(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at that path.\");\n }\n }\n\n const record: TaskRecord = {\n path: relativePath,\n content: input.content ?? \"\",\n raw: \"\",\n normalized: false,\n extraFrontmatter: input.extraFrontmatter ?? {},\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority ?? \"MUST\",\n status: input.status ?? \"TODO\",\n createdAt: now,\n updatedAt: now\n }\n };\n\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, serializeTask(record), \"utf8\");\n\n const current = await listTasks(rootDir);\n await saveOrder(rootDir, current.tasks.map((task) => task.path).concat(relativePath));\n return parseTask(rootDir, relativePath);\n}\n\nexport async function updateTask(rootDir: string, currentPath: string, input: UpdateTaskInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n if (input.baseUpdatedAt && existing.frontmatter.updatedAt !== input.baseUpdatedAt) {\n throw new ConflictError(\"The task changed on disk. Reload before saving.\");\n }\n\n const nextPath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : normalizedCurrentPath;\n const absoluteNextPath = path.join(rootDir, nextPath);\n\n if (nextPath !== normalizedCurrentPath) {\n try {\n await fs.access(absoluteNextPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at the target path.\");\n }\n }\n }\n\n const record: TaskRecord = {\n path: nextPath,\n raw: existing.raw,\n normalized: false,\n content: input.content,\n extraFrontmatter: input.extraFrontmatter ?? existing.extraFrontmatter,\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority,\n status: input.status,\n createdAt: existing.frontmatter.createdAt,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n if (nextPath !== normalizedCurrentPath) {\n await fs.mkdir(path.dirname(absoluteNextPath), { recursive: true });\n await fs.rename(absoluteCurrentPath, absoluteNextPath);\n }\n\n const current = await listTasks(rootDir);\n const updatedOrder = current.tasks.map((task) => task.path);\n await saveOrder(rootDir, updatedOrder);\n return parseTask(rootDir, nextPath);\n}\n\nexport async function deleteTask(rootDir: string, relativePath: string): Promise<void> {\n const normalizedPath = ensureMarkdownExtension(normalizeRelativePath(relativePath));\n const absolutePath = path.join(rootDir, normalizedPath);\n\n try {\n await fs.unlink(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const current = await listTasks(rootDir);\n await saveOrder(\n rootDir,\n current.tasks.map((task) => task.path)\n );\n}\n\nexport async function patchTaskFields(rootDir: string, currentPath: string, input: PatchTaskFieldsInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const priority = input.priority && REQUIRED_PRIORITY.includes(input.priority) ? input.priority : existing.frontmatter.priority;\n const status = input.status && REQUIRED_STATUS.includes(input.status) ? input.status : existing.frontmatter.status;\n\n if (priority === existing.frontmatter.priority && status === existing.frontmatter.status) {\n return existing;\n }\n\n const record: TaskRecord = {\n path: normalizedCurrentPath,\n raw: existing.raw,\n normalized: false,\n content: existing.content,\n extraFrontmatter: existing.extraFrontmatter,\n frontmatter: {\n ...existing.frontmatter,\n priority,\n status,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n return parseTask(rootDir, normalizedCurrentPath);\n}\n\nexport function parseOrderPayload(input: unknown): string[] {\n if (!Array.isArray(input)) {\n throw new ValidationError(\"Order payload must be an array.\");\n }\n\n return input.map((item) => ensureMarkdownExtension(normalizeRelativePath(String(item))));\n}\n\nexport async function readOrder(rootDir: string): Promise<ConfigFile> {\n const config = await readConfig(rootDir);\n const { order } = await reconcileOrder(\n rootDir,\n (await listTasks(rootDir)).tasks.map((task) => task.path)\n );\n return { version: 1, taskDirs: config.taskDirs, ignorePaths: config.ignorePaths, order };\n}\n\nexport const taskStoreUtils = {\n slugify,\n normalizeRelativePath,\n ensureMarkdownExtension,\n splitFrontmatter,\n buildDefaults\n};\n","export const CONFIG_FILE_NAME = \".md-task-viewer.json\";\n\nexport type TaskPriority = \"MUST\" | \"WANT\";\nexport type TaskStatus = \"TODO\" | \"WIP\" | \"DONE\";\n\nexport interface TaskFrontmatter {\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n createdAt: string;\n updatedAt: string;\n [key: string]: unknown;\n}\n\nexport interface TaskRecord {\n path: string;\n content: string;\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n raw: string;\n normalized: boolean;\n}\n\nexport interface TaskParseError {\n path: string;\n message: string;\n}\n\nexport interface TaskListResponse {\n tasks: TaskRecord[];\n errors: TaskParseError[];\n}\n\nexport interface CreateTaskInput {\n title: string;\n priority?: TaskPriority;\n status?: TaskStatus;\n content?: string;\n directory?: string;\n path?: string;\n extraFrontmatter?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskInput {\n path?: string;\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n content: string;\n extraFrontmatter?: Record<string, unknown>;\n baseUpdatedAt?: string;\n}\n\nexport interface PatchTaskFieldsInput {\n priority?: TaskPriority;\n status?: TaskStatus;\n}\n\nexport interface ConfigFile {\n version: number;\n taskDirs: string[];\n ignorePaths: string[];\n order: string[];\n}\n","export function slugify(value: string): string {\n const slug = value\n // Unicode結合文字列を正規合成形に統一(例: か+濁点 → が)\n .normalize(\"NFC\")\n // 半角・全角スペース(U+3000)など空白文字をハイフンに変換。近年では \\s は U+3000 にもマッチするが、明示的に記載\n .replace(/[\\s\\u3000]+/g, \"-\")\n // Unicode文字(L)・数字(N)・ハイフン以外を除去(記号や句読点など)\n .replace(/[^\\p{L}\\p{N}-]+/gu, \"\")\n // 先頭・末尾の余分なハイフンを除去\n .replace(/^-+|-+$/g, \"\");\n return slug || \"untitled-task\";\n}\n"],"mappings":"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","names":["path","path","path","path"]}
@@ -50,10 +50,10 @@ Error generating stack: `+n.message+`
50
50
  To pick up a draggable item, press the space bar.
51
51
  While dragging, use the arrow keys to move the item.
52
52
  Press space again to drop the item in its new position, or press escape to cancel.
53
- `},ly={onDragStart(i){let{active:f}=i;return"Picked up draggable item "+f.id+"."},onDragOver(i){let{active:f,over:o}=i;return o?"Draggable item "+f.id+" was moved over droppable area "+o.id+".":"Draggable item "+f.id+" is no longer over a droppable area."},onDragEnd(i){let{active:f,over:o}=i;return o?"Draggable item "+f.id+" was dropped over droppable area "+o.id:"Draggable item "+f.id+" was dropped."},onDragCancel(i){let{active:f}=i;return"Dragging was cancelled. Draggable item "+f.id+" was dropped."}};function ny(i){let{announcements:f=ly,container:o,hiddenTextDescribedById:s,screenReaderInstructions:d=ey}=i;const{announce:g,announcement:y}=Ig(),S=Du("DndLiveRegion"),[E,m]=x.useState(!1);if(x.useEffect(()=>{m(!0)},[]),Pg(x.useMemo(()=>({onDragStart(M){let{active:Y}=M;g(f.onDragStart({active:Y}))},onDragMove(M){let{active:Y,over:w}=M;f.onDragMove&&g(f.onDragMove({active:Y,over:w}))},onDragOver(M){let{active:Y,over:w}=M;g(f.onDragOver({active:Y,over:w}))},onDragEnd(M){let{active:Y,over:w}=M;g(f.onDragEnd({active:Y,over:w}))},onDragCancel(M){let{active:Y,over:w}=M;g(f.onDragCancel({active:Y,over:w}))}}),[g,f])),!E)return null;const _=ve.createElement(ve.Fragment,null,ve.createElement($g,{id:s,value:d.draggable}),ve.createElement(Fg,{id:S,announcement:y}));return o?hu.createPortal(_,o):_}var $t;(function(i){i.DragStart="dragStart",i.DragMove="dragMove",i.DragEnd="dragEnd",i.DragCancel="dragCancel",i.DragOver="dragOver",i.RegisterDroppable="registerDroppable",i.SetDroppableDisabled="setDroppableDisabled",i.UnregisterDroppable="unregisterDroppable"})($t||($t={}));function Vi(){}function Xh(i,f){return x.useMemo(()=>({sensor:i,options:f??{}}),[i,f])}function ay(){for(var i=arguments.length,f=new Array(i),o=0;o<i;o++)f[o]=arguments[o];return x.useMemo(()=>[...f].filter(s=>s!=null),[...f])}const nl=Object.freeze({x:0,y:0});function nv(i,f){return Math.sqrt(Math.pow(i.x-f.x,2)+Math.pow(i.y-f.y,2))}function av(i,f){let{data:{value:o}}=i,{data:{value:s}}=f;return o-s}function uy(i,f){let{data:{value:o}}=i,{data:{value:s}}=f;return s-o}function wh(i){let{left:f,top:o,height:s,width:d}=i;return[{x:f,y:o},{x:f+d,y:o},{x:f,y:o+s},{x:f+d,y:o+s}]}function uv(i,f){if(!i||i.length===0)return null;const[o]=i;return o[f]}function Gh(i,f,o){return f===void 0&&(f=i.left),o===void 0&&(o=i.top),{x:f+i.width*.5,y:o+i.height*.5}}const iy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=Gh(f,f.left,f.top),g=[];for(const y of s){const{id:S}=y,E=o.get(S);if(E){const m=nv(Gh(E),d);g.push({id:S,data:{droppableContainer:y,value:m}})}}return g.sort(av)},cy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=wh(f),g=[];for(const y of s){const{id:S}=y,E=o.get(S);if(E){const m=wh(E),_=d.reduce((Y,w,P)=>Y+nv(m[P],w),0),M=Number((_/4).toFixed(4));g.push({id:S,data:{droppableContainer:y,value:M}})}}return g.sort(av)};function fy(i,f){const o=Math.max(f.top,i.top),s=Math.max(f.left,i.left),d=Math.min(f.left+f.width,i.left+i.width),g=Math.min(f.top+f.height,i.top+i.height),y=d-s,S=g-o;if(s<d&&o<g){const E=f.width*f.height,m=i.width*i.height,_=y*S,M=_/(E+m-_);return Number(M.toFixed(4))}return 0}const sy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=[];for(const g of s){const{id:y}=g,S=o.get(y);if(S){const E=fy(S,f);E>0&&d.push({id:y,data:{droppableContainer:g,value:E}})}}return d.sort(uy)};function oy(i,f,o){return{...i,scaleX:f&&o?f.width/o.width:1,scaleY:f&&o?f.height/o.height:1}}function iv(i,f){return i&&f?{x:i.left-f.left,y:i.top-f.top}:nl}function ry(i){return function(o){for(var s=arguments.length,d=new Array(s>1?s-1:0),g=1;g<s;g++)d[g-1]=arguments[g];return d.reduce((y,S)=>({...y,top:y.top+i*S.y,bottom:y.bottom+i*S.y,left:y.left+i*S.x,right:y.right+i*S.x}),{...o})}}const dy=ry(1);function hy(i){if(i.startsWith("matrix3d(")){const f=i.slice(9,-1).split(/, /);return{x:+f[12],y:+f[13],scaleX:+f[0],scaleY:+f[5]}}else if(i.startsWith("matrix(")){const f=i.slice(7,-1).split(/, /);return{x:+f[4],y:+f[5],scaleX:+f[0],scaleY:+f[3]}}return null}function vy(i,f,o){const s=hy(f);if(!s)return i;const{scaleX:d,scaleY:g,x:y,y:S}=s,E=i.left-y-(1-d)*parseFloat(o),m=i.top-S-(1-g)*parseFloat(o.slice(o.indexOf(" ")+1)),_=d?i.width/d:i.width,M=g?i.height/g:i.height;return{width:_,height:M,top:m,right:E+_,bottom:m+M,left:E}}const gy={ignoreTransform:!1};function ba(i,f){f===void 0&&(f=gy);let o=i.getBoundingClientRect();if(f.ignoreTransform){const{transform:m,transformOrigin:_}=ze(i).getComputedStyle(i);m&&(o=vy(o,m,_))}const{top:s,left:d,width:g,height:y,bottom:S,right:E}=o;return{top:s,left:d,width:g,height:y,bottom:S,right:E}}function Lh(i){return ba(i,{ignoreTransform:!0})}function yy(i){const f=i.innerWidth,o=i.innerHeight;return{top:0,left:0,right:f,bottom:o,width:f,height:o}}function my(i,f){return f===void 0&&(f=ze(i).getComputedStyle(i)),f.position==="fixed"}function by(i,f){f===void 0&&(f=ze(i).getComputedStyle(i));const o=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(d=>{const g=f[d];return typeof g=="string"?o.test(g):!1})}function ki(i,f){const o=[];function s(d){if(f!=null&&o.length>=f||!d)return o;if(Cs(d)&&d.scrollingElement!=null&&!o.includes(d.scrollingElement))return o.push(d.scrollingElement),o;if(!Eu(d)||tv(d)||o.includes(d))return o;const g=ze(i).getComputedStyle(d);return d!==i&&by(d,g)&&o.push(d),my(d,g)?o:s(d.parentNode)}return i?s(i):o}function cv(i){const[f]=ki(i,1);return f??null}function bs(i){return!Wi||!i?null:ya(i)?i:xs(i)?Cs(i)||i===ma(i).scrollingElement?window:Eu(i)?i:null:null}function fv(i){return ya(i)?i.scrollX:i.scrollLeft}function sv(i){return ya(i)?i.scrollY:i.scrollTop}function Ds(i){return{x:fv(i),y:sv(i)}}var te;(function(i){i[i.Forward=1]="Forward",i[i.Backward=-1]="Backward"})(te||(te={}));function ov(i){return!Wi||!i?!1:i===document.scrollingElement}function rv(i){const f={x:0,y:0},o=ov(i)?{height:window.innerHeight,width:window.innerWidth}:{height:i.clientHeight,width:i.clientWidth},s={x:i.scrollWidth-o.width,y:i.scrollHeight-o.height},d=i.scrollTop<=f.y,g=i.scrollLeft<=f.x,y=i.scrollTop>=s.y,S=i.scrollLeft>=s.x;return{isTop:d,isLeft:g,isBottom:y,isRight:S,maxScroll:s,minScroll:f}}const py={x:.2,y:.2};function Sy(i,f,o,s,d){let{top:g,left:y,right:S,bottom:E}=o;s===void 0&&(s=10),d===void 0&&(d=py);const{isTop:m,isBottom:_,isLeft:M,isRight:Y}=rv(i),w={x:0,y:0},P={x:0,y:0},X={height:f.height*d.y,width:f.width*d.x};return!m&&g<=f.top+X.height?(w.y=te.Backward,P.y=s*Math.abs((f.top+X.height-g)/X.height)):!_&&E>=f.bottom-X.height&&(w.y=te.Forward,P.y=s*Math.abs((f.bottom-X.height-E)/X.height)),!Y&&S>=f.right-X.width?(w.x=te.Forward,P.x=s*Math.abs((f.right-X.width-S)/X.width)):!M&&y<=f.left+X.width&&(w.x=te.Backward,P.x=s*Math.abs((f.left+X.width-y)/X.width)),{direction:w,speed:P}}function Ey(i){if(i===document.scrollingElement){const{innerWidth:g,innerHeight:y}=window;return{top:0,left:0,right:g,bottom:y,width:g,height:y}}const{top:f,left:o,right:s,bottom:d}=i.getBoundingClientRect();return{top:f,left:o,right:s,bottom:d,width:i.clientWidth,height:i.clientHeight}}function dv(i){return i.reduce((f,o)=>ga(f,Ds(o)),nl)}function Ty(i){return i.reduce((f,o)=>f+fv(o),0)}function Dy(i){return i.reduce((f,o)=>f+sv(o),0)}function Ay(i,f){if(f===void 0&&(f=ba),!i)return;const{top:o,left:s,bottom:d,right:g}=f(i);cv(i)&&(d<=0||g<=0||o>=window.innerHeight||s>=window.innerWidth)&&i.scrollIntoView({block:"center",inline:"center"})}const zy=[["x",["left","right"],Ty],["y",["top","bottom"],Dy]];class _s{constructor(f,o){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const s=ki(o),d=dv(s);this.rect={...f},this.width=f.width,this.height=f.height;for(const[g,y,S]of zy)for(const E of y)Object.defineProperty(this,E,{get:()=>{const m=S(s),_=d[g]-m;return this.rect[E]+_},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class vu{constructor(f){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(o=>{var s;return(s=this.target)==null?void 0:s.removeEventListener(...o)})},this.target=f}add(f,o,s){var d;(d=this.target)==null||d.addEventListener(f,o,s),this.listeners.push([f,o,s])}}function My(i){const{EventTarget:f}=ze(i);return i instanceof f?i:ma(i)}function ps(i,f){const o=Math.abs(i.x),s=Math.abs(i.y);return typeof f=="number"?Math.sqrt(o**2+s**2)>f:"x"in f&&"y"in f?o>f.x&&s>f.y:"x"in f?o>f.x:"y"in f?s>f.y:!1}var $e;(function(i){i.Click="click",i.DragStart="dragstart",i.Keydown="keydown",i.ContextMenu="contextmenu",i.Resize="resize",i.SelectionChange="selectionchange",i.VisibilityChange="visibilitychange"})($e||($e={}));function Qh(i){i.preventDefault()}function Oy(i){i.stopPropagation()}var pt;(function(i){i.Space="Space",i.Down="ArrowDown",i.Right="ArrowRight",i.Left="ArrowLeft",i.Up="ArrowUp",i.Esc="Escape",i.Enter="Enter",i.Tab="Tab"})(pt||(pt={}));const hv={start:[pt.Space,pt.Enter],cancel:[pt.Esc],end:[pt.Space,pt.Enter,pt.Tab]},xy=(i,f)=>{let{currentCoordinates:o}=f;switch(i.code){case pt.Right:return{...o,x:o.x+25};case pt.Left:return{...o,x:o.x-25};case pt.Down:return{...o,y:o.y+25};case pt.Up:return{...o,y:o.y-25}}};class Us{constructor(f){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=f;const{event:{target:o}}=f;this.props=f,this.listeners=new vu(ma(o)),this.windowListeners=new vu(ze(o)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add($e.Resize,this.handleCancel),this.windowListeners.add($e.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add($e.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:f,onStart:o}=this.props,s=f.node.current;s&&Ay(s),o(nl)}handleKeyDown(f){if(Ns(f)){const{active:o,context:s,options:d}=this.props,{keyboardCodes:g=hv,coordinateGetter:y=xy,scrollBehavior:S="smooth"}=d,{code:E}=f;if(g.end.includes(E)){this.handleEnd(f);return}if(g.cancel.includes(E)){this.handleCancel(f);return}const{collisionRect:m}=s.current,_=m?{x:m.left,y:m.top}:nl;this.referenceCoordinates||(this.referenceCoordinates=_);const M=y(f,{active:o,context:s.current,currentCoordinates:_});if(M){const Y=bu(M,_),w={x:0,y:0},{scrollableAncestors:P}=s.current;for(const X of P){const Z=f.code,{isTop:V,isRight:at,isLeft:W,isBottom:et,maxScroll:it,minScroll:$}=rv(X),Q=Ey(X),nt={x:Math.min(Z===pt.Right?Q.right-Q.width/2:Q.right,Math.max(Z===pt.Right?Q.left:Q.left+Q.width/2,M.x)),y:Math.min(Z===pt.Down?Q.bottom-Q.height/2:Q.bottom,Math.max(Z===pt.Down?Q.top:Q.top+Q.height/2,M.y))},ot=Z===pt.Right&&!at||Z===pt.Left&&!W,Rt=Z===pt.Down&&!et||Z===pt.Up&&!V;if(ot&&nt.x!==M.x){const rt=X.scrollLeft+Y.x,Mt=Z===pt.Right&&rt<=it.x||Z===pt.Left&&rt>=$.x;if(Mt&&!Y.y){X.scrollTo({left:rt,behavior:S});return}Mt?w.x=X.scrollLeft-rt:w.x=Z===pt.Right?X.scrollLeft-it.x:X.scrollLeft-$.x,w.x&&X.scrollBy({left:-w.x,behavior:S});break}else if(Rt&&nt.y!==M.y){const rt=X.scrollTop+Y.y,Mt=Z===pt.Down&&rt<=it.y||Z===pt.Up&&rt>=$.y;if(Mt&&!Y.x){X.scrollTo({top:rt,behavior:S});return}Mt?w.y=X.scrollTop-rt:w.y=Z===pt.Down?X.scrollTop-it.y:X.scrollTop-$.y,w.y&&X.scrollBy({top:-w.y,behavior:S});break}}this.handleMove(f,ga(bu(M,this.referenceCoordinates),w))}}}handleMove(f,o){const{onMove:s}=this.props;f.preventDefault(),s(o)}handleEnd(f){const{onEnd:o}=this.props;f.preventDefault(),this.detach(),o()}handleCancel(f){const{onCancel:o}=this.props;f.preventDefault(),this.detach(),o()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}Us.activators=[{eventName:"onKeyDown",handler:(i,f,o)=>{let{keyboardCodes:s=hv,onActivation:d}=f,{active:g}=o;const{code:y}=i.nativeEvent;if(s.start.includes(y)){const S=g.activatorNode.current;return S&&i.target!==S?!1:(i.preventDefault(),d==null||d({event:i.nativeEvent}),!0)}return!1}}];function Zh(i){return!!(i&&"distance"in i)}function Vh(i){return!!(i&&"delay"in i)}class js{constructor(f,o,s){var d;s===void 0&&(s=My(f.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=f,this.events=o;const{event:g}=f,{target:y}=g;this.props=f,this.events=o,this.document=ma(y),this.documentListeners=new vu(this.document),this.listeners=new vu(s),this.windowListeners=new vu(ze(y)),this.initialCoordinates=(d=Ts(g))!=null?d:nl,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:f,props:{options:{activationConstraint:o,bypassActivationConstraint:s}}}=this;if(this.listeners.add(f.move.name,this.handleMove,{passive:!1}),this.listeners.add(f.end.name,this.handleEnd),f.cancel&&this.listeners.add(f.cancel.name,this.handleCancel),this.windowListeners.add($e.Resize,this.handleCancel),this.windowListeners.add($e.DragStart,Qh),this.windowListeners.add($e.VisibilityChange,this.handleCancel),this.windowListeners.add($e.ContextMenu,Qh),this.documentListeners.add($e.Keydown,this.handleKeydown),o){if(s!=null&&s({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(Vh(o)){this.timeoutId=setTimeout(this.handleStart,o.delay),this.handlePending(o);return}if(Zh(o)){this.handlePending(o);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(f,o){const{active:s,onPending:d}=this.props;d(s,f,this.initialCoordinates,o)}handleStart(){const{initialCoordinates:f}=this,{onStart:o}=this.props;f&&(this.activated=!0,this.documentListeners.add($e.Click,Oy,{capture:!0}),this.removeTextSelection(),this.documentListeners.add($e.SelectionChange,this.removeTextSelection),o(f))}handleMove(f){var o;const{activated:s,initialCoordinates:d,props:g}=this,{onMove:y,options:{activationConstraint:S}}=g;if(!d)return;const E=(o=Ts(f))!=null?o:nl,m=bu(d,E);if(!s&&S){if(Zh(S)){if(S.tolerance!=null&&ps(m,S.tolerance))return this.handleCancel();if(ps(m,S.distance))return this.handleStart()}if(Vh(S)&&ps(m,S.tolerance))return this.handleCancel();this.handlePending(S,m);return}f.cancelable&&f.preventDefault(),y(E)}handleEnd(){const{onAbort:f,onEnd:o}=this.props;this.detach(),this.activated||f(this.props.active),o()}handleCancel(){const{onAbort:f,onCancel:o}=this.props;this.detach(),this.activated||f(this.props.active),o()}handleKeydown(f){f.code===pt.Esc&&this.handleCancel()}removeTextSelection(){var f;(f=this.document.getSelection())==null||f.removeAllRanges()}}const Cy={cancel:{name:"pointercancel"},move:{name:"pointermove"},end:{name:"pointerup"}};class Hs extends js{constructor(f){const{event:o}=f,s=ma(o.target);super(f,Cy,s)}}Hs.activators=[{eventName:"onPointerDown",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;return!o.isPrimary||o.button!==0?!1:(s==null||s({event:o}),!0)}}];const Ry={move:{name:"mousemove"},end:{name:"mouseup"}};var As;(function(i){i[i.RightClick=2]="RightClick"})(As||(As={}));class Ny extends js{constructor(f){super(f,Ry,ma(f.event.target))}}Ny.activators=[{eventName:"onMouseDown",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;return o.button===As.RightClick?!1:(s==null||s({event:o}),!0)}}];const Ss={cancel:{name:"touchcancel"},move:{name:"touchmove"},end:{name:"touchend"}};class _y extends js{constructor(f){super(f,Ss)}static setup(){return window.addEventListener(Ss.move.name,f,{capture:!1,passive:!1}),function(){window.removeEventListener(Ss.move.name,f)};function f(){}}}_y.activators=[{eventName:"onTouchStart",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;const{touches:d}=o;return d.length>1?!1:(s==null||s({event:o}),!0)}}];var gu;(function(i){i[i.Pointer=0]="Pointer",i[i.DraggableRect=1]="DraggableRect"})(gu||(gu={}));var Ki;(function(i){i[i.TreeOrder=0]="TreeOrder",i[i.ReversedTreeOrder=1]="ReversedTreeOrder"})(Ki||(Ki={}));function Uy(i){let{acceleration:f,activator:o=gu.Pointer,canScroll:s,draggingRect:d,enabled:g,interval:y=5,order:S=Ki.TreeOrder,pointerCoordinates:E,scrollableAncestors:m,scrollableAncestorRects:_,delta:M,threshold:Y}=i;const w=Hy({delta:M,disabled:!g}),[P,X]=Vg(),Z=x.useRef({x:0,y:0}),V=x.useRef({x:0,y:0}),at=x.useMemo(()=>{switch(o){case gu.Pointer:return E?{top:E.y,bottom:E.y,left:E.x,right:E.x}:null;case gu.DraggableRect:return d}},[o,d,E]),W=x.useRef(null),et=x.useCallback(()=>{const $=W.current;if(!$)return;const Q=Z.current.x*V.current.x,nt=Z.current.y*V.current.y;$.scrollBy(Q,nt)},[]),it=x.useMemo(()=>S===Ki.TreeOrder?[...m].reverse():m,[S,m]);x.useEffect(()=>{if(!g||!m.length||!at){X();return}for(const $ of it){if((s==null?void 0:s($))===!1)continue;const Q=m.indexOf($),nt=_[Q];if(!nt)continue;const{direction:ot,speed:Rt}=Sy($,nt,at,f,Y);for(const rt of["x","y"])w[rt][ot[rt]]||(Rt[rt]=0,ot[rt]=0);if(Rt.x>0||Rt.y>0){X(),W.current=$,P(et,y),Z.current=Rt,V.current=ot;return}}Z.current={x:0,y:0},V.current={x:0,y:0},X()},[f,et,s,X,g,y,JSON.stringify(at),JSON.stringify(w),P,m,it,_,JSON.stringify(Y)])}const jy={x:{[te.Backward]:!1,[te.Forward]:!1},y:{[te.Backward]:!1,[te.Forward]:!1}};function Hy(i){let{delta:f,disabled:o}=i;const s=Es(f);return Tu(d=>{if(o||!s||!d)return jy;const g={x:Math.sign(f.x-s.x),y:Math.sign(f.y-s.y)};return{x:{[te.Backward]:d.x[te.Backward]||g.x===-1,[te.Forward]:d.x[te.Forward]||g.x===1},y:{[te.Backward]:d.y[te.Backward]||g.y===-1,[te.Forward]:d.y[te.Forward]||g.y===1}}},[o,f,s])}function By(i,f){const o=f!=null?i.get(f):void 0,s=o?o.node.current:null;return Tu(d=>{var g;return f==null?null:(g=s??d)!=null?g:null},[s,f])}function qy(i,f){return x.useMemo(()=>i.reduce((o,s)=>{const{sensor:d}=s,g=d.activators.map(y=>({eventName:y.eventName,handler:f(y.handler,s)}));return[...o,...g]},[]),[i,f])}var Su;(function(i){i[i.Always=0]="Always",i[i.BeforeDragging=1]="BeforeDragging",i[i.WhileDragging=2]="WhileDragging"})(Su||(Su={}));var zs;(function(i){i.Optimized="optimized"})(zs||(zs={}));const Kh=new Map;function Yy(i,f){let{dragging:o,dependencies:s,config:d}=f;const[g,y]=x.useState(null),{frequency:S,measure:E,strategy:m}=d,_=x.useRef(i),M=Z(),Y=mu(M),w=x.useCallback(function(V){V===void 0&&(V=[]),!Y.current&&y(at=>at===null?V:at.concat(V.filter(W=>!at.includes(W))))},[Y]),P=x.useRef(null),X=Tu(V=>{if(M&&!o)return Kh;if(!V||V===Kh||_.current!==i||g!=null){const at=new Map;for(let W of i){if(!W)continue;if(g&&g.length>0&&!g.includes(W.id)&&W.rect.current){at.set(W.id,W.rect.current);continue}const et=W.node.current,it=et?new _s(E(et),et):null;W.rect.current=it,it&&at.set(W.id,it)}return at}return V},[i,g,o,M,E]);return x.useEffect(()=>{_.current=i},[i]),x.useEffect(()=>{M||w()},[o,M]),x.useEffect(()=>{g&&g.length>0&&y(null)},[JSON.stringify(g)]),x.useEffect(()=>{M||typeof S!="number"||P.current!==null||(P.current=setTimeout(()=>{w(),P.current=null},S))},[S,M,w,...s]),{droppableRects:X,measureDroppableContainers:w,measuringScheduled:g!=null};function Z(){switch(m){case Su.Always:return!1;case Su.BeforeDragging:return o;default:return!o}}}function vv(i,f){return Tu(o=>i?o||(typeof f=="function"?f(i):i):null,[f,i])}function Xy(i,f){return vv(i,f)}function wy(i){let{callback:f,disabled:o}=i;const s=Rs(f),d=x.useMemo(()=>{if(o||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:g}=window;return new g(s)},[s,o]);return x.useEffect(()=>()=>d==null?void 0:d.disconnect(),[d]),d}function $i(i){let{callback:f,disabled:o}=i;const s=Rs(f),d=x.useMemo(()=>{if(o||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:g}=window;return new g(s)},[o]);return x.useEffect(()=>()=>d==null?void 0:d.disconnect(),[d]),d}function Gy(i){return new _s(ba(i),i)}function Jh(i,f,o){f===void 0&&(f=Gy);const[s,d]=x.useState(null);function g(){d(E=>{if(!i)return null;if(i.isConnected===!1){var m;return(m=E??o)!=null?m:null}const _=f(i);return JSON.stringify(E)===JSON.stringify(_)?E:_})}const y=wy({callback(E){if(i)for(const m of E){const{type:_,target:M}=m;if(_==="childList"&&M instanceof HTMLElement&&M.contains(i)){g();break}}}}),S=$i({callback:g});return rl(()=>{g(),i?(S==null||S.observe(i),y==null||y.observe(document.body,{childList:!0,subtree:!0})):(S==null||S.disconnect(),y==null||y.disconnect())},[i]),s}function Ly(i){const f=vv(i);return iv(i,f)}const Wh=[];function Qy(i){const f=x.useRef(i),o=Tu(s=>i?s&&s!==Wh&&i&&f.current&&i.parentNode===f.current.parentNode?s:ki(i):Wh,[i]);return x.useEffect(()=>{f.current=i},[i]),o}function Zy(i){const[f,o]=x.useState(null),s=x.useRef(i),d=x.useCallback(g=>{const y=bs(g.target);y&&o(S=>S?(S.set(y,Ds(y)),new Map(S)):null)},[]);return x.useEffect(()=>{const g=s.current;if(i!==g){y(g);const S=i.map(E=>{const m=bs(E);return m?(m.addEventListener("scroll",d,{passive:!0}),[m,Ds(m)]):null}).filter(E=>E!=null);o(S.length?new Map(S):null),s.current=i}return()=>{y(i),y(g)};function y(S){S.forEach(E=>{const m=bs(E);m==null||m.removeEventListener("scroll",d)})}},[d,i]),x.useMemo(()=>i.length?f?Array.from(f.values()).reduce((g,y)=>ga(g,y),nl):dv(i):nl,[i,f])}function kh(i,f){f===void 0&&(f=[]);const o=x.useRef(null);return x.useEffect(()=>{o.current=null},f),x.useEffect(()=>{const s=i!==nl;s&&!o.current&&(o.current=i),!s&&o.current&&(o.current=null)},[i]),o.current?bu(i,o.current):nl}function Vy(i){x.useEffect(()=>{if(!Wi)return;const f=i.map(o=>{let{sensor:s}=o;return s.setup==null?void 0:s.setup()});return()=>{for(const o of f)o==null||o()}},i.map(f=>{let{sensor:o}=f;return o}))}function Ky(i,f){return x.useMemo(()=>i.reduce((o,s)=>{let{eventName:d,handler:g}=s;return o[d]=y=>{g(y,f)},o},{}),[i,f])}function gv(i){return x.useMemo(()=>i?yy(i):null,[i])}const $h=[];function Jy(i,f){f===void 0&&(f=ba);const[o]=i,s=gv(o?ze(o):null),[d,g]=x.useState($h);function y(){g(()=>i.length?i.map(E=>ov(E)?s:new _s(f(E),E)):$h)}const S=$i({callback:y});return rl(()=>{S==null||S.disconnect(),y(),i.forEach(E=>S==null?void 0:S.observe(E))},[i]),d}function Wy(i){if(!i)return null;if(i.children.length>1)return i;const f=i.children[0];return Eu(f)?f:i}function ky(i){let{measure:f}=i;const[o,s]=x.useState(null),d=x.useCallback(m=>{for(const{target:_}of m)if(Eu(_)){s(M=>{const Y=f(_);return M?{...M,width:Y.width,height:Y.height}:Y});break}},[f]),g=$i({callback:d}),y=x.useCallback(m=>{const _=Wy(m);g==null||g.disconnect(),_&&(g==null||g.observe(_)),s(_?f(_):null)},[f,g]),[S,E]=Zi(y);return x.useMemo(()=>({nodeRef:S,rect:o,setRef:E}),[o,S,E])}const $y=[{sensor:Hs,options:{}},{sensor:Us,options:{}}],Fy={current:{}},Qi={draggable:{measure:Lh},droppable:{measure:Lh,strategy:Su.WhileDragging,frequency:zs.Optimized},dragOverlay:{measure:ba}};class yu extends Map{get(f){var o;return f!=null&&(o=super.get(f))!=null?o:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(f=>{let{disabled:o}=f;return!o})}getNodeFor(f){var o,s;return(o=(s=this.get(f))==null?void 0:s.node.current)!=null?o:void 0}}const Iy={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new yu,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:Vi},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Qi,measureDroppableContainers:Vi,windowRect:null,measuringScheduled:!1},Py={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:Vi,draggableNodes:new Map,over:null,measureDroppableContainers:Vi},Fi=x.createContext(Py),yv=x.createContext(Iy);function tm(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new yu}}}function em(i,f){switch(f.type){case $t.DragStart:return{...i,draggable:{...i.draggable,initialCoordinates:f.initialCoordinates,active:f.active}};case $t.DragMove:return i.draggable.active==null?i:{...i,draggable:{...i.draggable,translate:{x:f.coordinates.x-i.draggable.initialCoordinates.x,y:f.coordinates.y-i.draggable.initialCoordinates.y}}};case $t.DragEnd:case $t.DragCancel:return{...i,draggable:{...i.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case $t.RegisterDroppable:{const{element:o}=f,{id:s}=o,d=new yu(i.droppable.containers);return d.set(s,o),{...i,droppable:{...i.droppable,containers:d}}}case $t.SetDroppableDisabled:{const{id:o,key:s,disabled:d}=f,g=i.droppable.containers.get(o);if(!g||s!==g.key)return i;const y=new yu(i.droppable.containers);return y.set(o,{...g,disabled:d}),{...i,droppable:{...i.droppable,containers:y}}}case $t.UnregisterDroppable:{const{id:o,key:s}=f,d=i.droppable.containers.get(o);if(!d||s!==d.key)return i;const g=new yu(i.droppable.containers);return g.delete(o),{...i,droppable:{...i.droppable,containers:g}}}default:return i}}function lm(i){let{disabled:f}=i;const{active:o,activatorEvent:s,draggableNodes:d}=x.useContext(Fi),g=Es(s),y=Es(o==null?void 0:o.id);return x.useEffect(()=>{if(!f&&!s&&g&&y!=null){if(!Ns(g)||document.activeElement===g.target)return;const S=d.get(y);if(!S)return;const{activatorNode:E,node:m}=S;if(!E.current&&!m.current)return;requestAnimationFrame(()=>{for(const _ of[E.current,m.current]){if(!_)continue;const M=Wg(_);if(M){M.focus();break}}})}},[s,f,d,y,g]),null}function nm(i,f){let{transform:o,...s}=f;return i!=null&&i.length?i.reduce((d,g)=>g({transform:d,...s}),o):o}function am(i){return x.useMemo(()=>({draggable:{...Qi.draggable,...i==null?void 0:i.draggable},droppable:{...Qi.droppable,...i==null?void 0:i.droppable},dragOverlay:{...Qi.dragOverlay,...i==null?void 0:i.dragOverlay}}),[i==null?void 0:i.draggable,i==null?void 0:i.droppable,i==null?void 0:i.dragOverlay])}function um(i){let{activeNode:f,measure:o,initialRect:s,config:d=!0}=i;const g=x.useRef(!1),{x:y,y:S}=typeof d=="boolean"?{x:d,y:d}:d;rl(()=>{if(!y&&!S||!f){g.current=!1;return}if(g.current||!s)return;const m=f==null?void 0:f.node.current;if(!m||m.isConnected===!1)return;const _=o(m),M=iv(_,s);if(y||(M.x=0),S||(M.y=0),g.current=!0,Math.abs(M.x)>0||Math.abs(M.y)>0){const Y=cv(m);Y&&Y.scrollBy({top:M.y,left:M.x})}},[f,y,S,s,o])}const mv=x.createContext({...nl,scaleX:1,scaleY:1});var cn;(function(i){i[i.Uninitialized=0]="Uninitialized",i[i.Initializing=1]="Initializing",i[i.Initialized=2]="Initialized"})(cn||(cn={}));const im=x.memo(function(f){var o,s,d,g;let{id:y,accessibility:S,autoScroll:E=!0,children:m,sensors:_=$y,collisionDetection:M=sy,measuring:Y,modifiers:w,...P}=f;const X=x.useReducer(em,void 0,tm),[Z,V]=X,[at,W]=ty(),[et,it]=x.useState(cn.Uninitialized),$=et===cn.Initialized,{draggable:{active:Q,nodes:nt,translate:ot},droppable:{containers:Rt}}=Z,rt=Q!=null?nt.get(Q):null,Mt=x.useRef({initial:null,translated:null}),Yt=x.useMemo(()=>{var Xt;return Q!=null?{id:Q,data:(Xt=rt==null?void 0:rt.data)!=null?Xt:Fy,rect:Mt}:null},[Q,rt]),Ht=x.useRef(null),[Qt,R]=x.useState(null),[T,q]=x.useState(null),G=mu(P,Object.values(P)),tt=Du("DndDescribedBy",y),v=x.useMemo(()=>Rt.getEnabled(),[Rt]),O=am(Y),{droppableRects:B,measureDroppableContainers:L,measuringScheduled:F}=Yy(v,{dragging:$,dependencies:[ot.x,ot.y],config:O.droppable}),k=By(nt,Q),ct=x.useMemo(()=>T?Ts(T):null,[T]),Dt=Rn(),mt=Xy(k,O.draggable.measure);um({activeNode:Q!=null?nt.get(Q):null,config:Dt.layoutShiftCompensation,initialRect:mt,measure:O.draggable.measure});const dt=Jh(k,O.draggable.measure,mt),je=Jh(k?k.parentElement:null),ce=x.useRef({activatorEvent:null,active:null,activeNode:k,collisionRect:null,collisions:null,droppableRects:B,draggableNodes:nt,draggingNode:null,draggingNodeRect:null,droppableContainers:Rt,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),dl=Rt.getNodeFor((o=ce.current.over)==null?void 0:o.id),ee=ky({measure:O.dragOverlay.measure}),al=(s=ee.nodeRef.current)!=null?s:k,ul=$?(d=ee.rect)!=null?d:dt:null,Au=!!(ee.nodeRef.current&&ee.rect),pa=Ly(Au?null:dt),fn=gv(al?ze(al):null),He=Qy($?dl??k:null),jl=Jy(He),xn=nm(w,{transform:{x:ot.x-pa.x,y:ot.y-pa.y,scaleX:1,scaleY:1},activatorEvent:T,active:Yt,activeNodeRect:dt,containerNodeRect:je,draggingNodeRect:ul,over:ce.current.over,overlayNodeRect:ee.rect,scrollableAncestors:He,scrollableAncestorRects:jl,windowRect:fn}),zu=ct?ga(ct,ot):null,fe=Zy(He),Ii=kh(fe),Mu=kh(fe,[dt]),hl=ga(xn,Ii),Fe=ul?dy(ul,xn):null,sn=Yt&&Fe?M({active:Yt,collisionRect:Fe,droppableRects:B,droppableContainers:v,pointerCoordinates:zu}):null,Sa=uv(sn,"id"),[il,Ou]=x.useState(null),on=Au?xn:ga(xn,Mu),de=oy(on,(g=il==null?void 0:il.rect)!=null?g:null,dt),Be=x.useRef(null),se=x.useCallback((Xt,wt)=>{let{sensor:Ft,options:ge}=wt;if(Ht.current==null)return;const ye=nt.get(Ht.current);if(!ye)return;const oe=Xt.nativeEvent,me=new Ft({active:Ht.current,activeNode:ye,event:oe,options:ge,context:ce,onAbort(Wt){if(!nt.get(Wt))return;const{onDragAbort:Me}=G.current,Ye={id:Wt};Me==null||Me(Ye),at({type:"onDragAbort",event:Ye})},onPending(Wt,Ie,Me,Ye){if(!nt.get(Wt))return;const{onDragPending:gl}=G.current,Pe={id:Wt,constraint:Ie,initialCoordinates:Me,offset:Ye};gl==null||gl(Pe),at({type:"onDragPending",event:Pe})},onStart(Wt){const Ie=Ht.current;if(Ie==null)return;const Me=nt.get(Ie);if(!Me)return;const{onDragStart:Ye}=G.current,vl={activatorEvent:oe,active:{id:Ie,data:Me.data,rect:Mt}};hu.unstable_batchedUpdates(()=>{Ye==null||Ye(vl),it(cn.Initializing),V({type:$t.DragStart,initialCoordinates:Wt,active:Ie}),at({type:"onDragStart",event:vl}),R(Be.current),q(oe)})},onMove(Wt){V({type:$t.DragMove,coordinates:Wt})},onEnd:qe($t.DragEnd),onCancel:qe($t.DragCancel)});Be.current=me;function qe(Wt){return async function(){const{active:Me,collisions:Ye,over:vl,scrollAdjustedTranslate:gl}=ce.current;let Pe=null;if(Me&&gl){const{cancelDrop:Hl}=G.current;Pe={activatorEvent:oe,active:Me,collisions:Ye,delta:gl,over:vl},Wt===$t.DragEnd&&typeof Hl=="function"&&await Promise.resolve(Hl(Pe))&&(Wt=$t.DragCancel)}Ht.current=null,hu.unstable_batchedUpdates(()=>{V({type:Wt}),it(cn.Uninitialized),Ou(null),R(null),q(null),Be.current=null;const Hl=Wt===$t.DragEnd?"onDragEnd":"onDragCancel";if(Pe){const Xe=G.current[Hl];Xe==null||Xe(Pe),at({type:Hl,event:Pe})}})}}},[nt]),Pi=x.useCallback((Xt,wt)=>(Ft,ge)=>{const ye=Ft.nativeEvent,oe=nt.get(ge);if(Ht.current!==null||!oe||ye.dndKit||ye.defaultPrevented)return;const me={active:oe};Xt(Ft,wt.options,me)===!0&&(ye.dndKit={capturedBy:wt.sensor},Ht.current=ge,se(Ft,wt))},[nt,se]),xu=qy(_,Pi);Vy(_),rl(()=>{dt&&et===cn.Initializing&&it(cn.Initialized)},[dt,et]),x.useEffect(()=>{const{onDragMove:Xt}=G.current,{active:wt,activatorEvent:Ft,collisions:ge,over:ye}=ce.current;if(!wt||!Ft)return;const oe={active:wt,activatorEvent:Ft,collisions:ge,delta:{x:hl.x,y:hl.y},over:ye};hu.unstable_batchedUpdates(()=>{Xt==null||Xt(oe),at({type:"onDragMove",event:oe})})},[hl.x,hl.y]),x.useEffect(()=>{const{active:Xt,activatorEvent:wt,collisions:Ft,droppableContainers:ge,scrollAdjustedTranslate:ye}=ce.current;if(!Xt||Ht.current==null||!wt||!ye)return;const{onDragOver:oe}=G.current,me=ge.get(Sa),qe=me&&me.rect.current?{id:me.id,rect:me.rect.current,data:me.data,disabled:me.disabled}:null,Wt={active:Xt,activatorEvent:wt,collisions:Ft,delta:{x:ye.x,y:ye.y},over:qe};hu.unstable_batchedUpdates(()=>{Ou(qe),oe==null||oe(Wt),at({type:"onDragOver",event:Wt})})},[Sa]),rl(()=>{ce.current={activatorEvent:T,active:Yt,activeNode:k,collisionRect:Fe,collisions:sn,droppableRects:B,draggableNodes:nt,draggingNode:al,draggingNodeRect:ul,droppableContainers:Rt,over:il,scrollableAncestors:He,scrollAdjustedTranslate:hl},Mt.current={initial:ul,translated:Fe}},[Yt,k,sn,Fe,nt,al,ul,B,Rt,il,He,hl]),Uy({...Dt,delta:ot,draggingRect:Fe,pointerCoordinates:zu,scrollableAncestors:He,scrollableAncestorRects:jl});const tc=x.useMemo(()=>({active:Yt,activeNode:k,activeNodeRect:dt,activatorEvent:T,collisions:sn,containerNodeRect:je,dragOverlay:ee,draggableNodes:nt,droppableContainers:Rt,droppableRects:B,over:il,measureDroppableContainers:L,scrollableAncestors:He,scrollableAncestorRects:jl,measuringConfiguration:O,measuringScheduled:F,windowRect:fn}),[Yt,k,dt,T,sn,je,ee,nt,Rt,B,il,L,He,jl,O,F,fn]),Cn=x.useMemo(()=>({activatorEvent:T,activators:xu,active:Yt,activeNodeRect:dt,ariaDescribedById:{draggable:tt},dispatch:V,draggableNodes:nt,over:il,measureDroppableContainers:L}),[T,xu,Yt,dt,V,tt,nt,il,L]);return ve.createElement(lv.Provider,{value:W},ve.createElement(Fi.Provider,{value:Cn},ve.createElement(yv.Provider,{value:tc},ve.createElement(mv.Provider,{value:de},m)),ve.createElement(lm,{disabled:(S==null?void 0:S.restoreFocus)===!1})),ve.createElement(ny,{...S,hiddenTextDescribedById:tt}));function Rn(){const Xt=(Qt==null?void 0:Qt.autoScrollEnabled)===!1,wt=typeof E=="object"?E.enabled===!1:E===!1,Ft=$&&!Xt&&!wt;return typeof E=="object"?{...E,enabled:Ft}:{enabled:Ft}}}),cm=x.createContext(null),Fh="button",fm="Draggable";function sm(i){let{id:f,data:o,disabled:s=!1,attributes:d}=i;const g=Du(fm),{activators:y,activatorEvent:S,active:E,activeNodeRect:m,ariaDescribedById:_,draggableNodes:M,over:Y}=x.useContext(Fi),{role:w=Fh,roleDescription:P="draggable",tabIndex:X=0}=d??{},Z=(E==null?void 0:E.id)===f,V=x.useContext(Z?mv:cm),[at,W]=Zi(),[et,it]=Zi(),$=Ky(y,f),Q=mu(o);rl(()=>(M.set(f,{id:f,key:g,node:at,activatorNode:et,data:Q}),()=>{const ot=M.get(f);ot&&ot.key===g&&M.delete(f)}),[M,f]);const nt=x.useMemo(()=>({role:w,tabIndex:X,"aria-disabled":s,"aria-pressed":Z&&w===Fh?!0:void 0,"aria-roledescription":P,"aria-describedby":_.draggable}),[s,w,X,Z,P,_.draggable]);return{active:E,activatorEvent:S,activeNodeRect:m,attributes:nt,isDragging:Z,listeners:s?void 0:$,node:at,over:Y,setNodeRef:W,setActivatorNodeRef:it,transform:V}}function om(){return x.useContext(yv)}const rm="Droppable",dm={timeout:25};function hm(i){let{data:f,disabled:o=!1,id:s,resizeObserverConfig:d}=i;const g=Du(rm),{active:y,dispatch:S,over:E,measureDroppableContainers:m}=x.useContext(Fi),_=x.useRef({disabled:o}),M=x.useRef(!1),Y=x.useRef(null),w=x.useRef(null),{disabled:P,updateMeasurementsFor:X,timeout:Z}={...dm,...d},V=mu(X??s),at=x.useCallback(()=>{if(!M.current){M.current=!0;return}w.current!=null&&clearTimeout(w.current),w.current=setTimeout(()=>{m(Array.isArray(V.current)?V.current:[V.current]),w.current=null},Z)},[Z]),W=$i({callback:at,disabled:P||!y}),et=x.useCallback((nt,ot)=>{W&&(ot&&(W.unobserve(ot),M.current=!1),nt&&W.observe(nt))},[W]),[it,$]=Zi(et),Q=mu(f);return x.useEffect(()=>{!W||!it.current||(W.disconnect(),M.current=!1,W.observe(it.current))},[it,W]),x.useEffect(()=>(S({type:$t.RegisterDroppable,element:{id:s,key:g,disabled:o,node:it,rect:Y,data:Q}}),()=>S({type:$t.UnregisterDroppable,key:g,id:s})),[s]),x.useEffect(()=>{o!==_.current.disabled&&(S({type:$t.SetDroppableDisabled,id:s,key:g,disabled:o}),_.current.disabled=o)},[s,g,o,S]),{active:y,rect:Y,isOver:(E==null?void 0:E.id)===s,node:it,over:E,setNodeRef:$}}function Bs(i,f,o){const s=i.slice();return s.splice(o<0?s.length+o:o,0,s.splice(f,1)[0]),s}function vm(i,f){return i.reduce((o,s,d)=>{const g=f.get(s);return g&&(o[d]=g),o},Array(i.length))}function Gi(i){return i!==null&&i>=0}function gm(i,f){if(i===f)return!0;if(i.length!==f.length)return!1;for(let o=0;o<i.length;o++)if(i[o]!==f[o])return!1;return!0}function ym(i){return typeof i=="boolean"?{draggable:i,droppable:i}:i}const bv=i=>{let{rects:f,activeIndex:o,overIndex:s,index:d}=i;const g=Bs(f,s,o),y=f[d],S=g[d];return!S||!y?null:{x:S.left-y.left,y:S.top-y.top,scaleX:S.width/y.width,scaleY:S.height/y.height}},Li={scaleX:1,scaleY:1},mm=i=>{var f;let{activeIndex:o,activeNodeRect:s,index:d,rects:g,overIndex:y}=i;const S=(f=g[o])!=null?f:s;if(!S)return null;if(d===o){const m=g[y];return m?{x:0,y:o<y?m.top+m.height-(S.top+S.height):m.top-S.top,...Li}:null}const E=bm(g,d,o);return d>o&&d<=y?{x:0,y:-S.height-E,...Li}:d<o&&d>=y?{x:0,y:S.height+E,...Li}:{x:0,y:0,...Li}};function bm(i,f,o){const s=i[f],d=i[f-1],g=i[f+1];return s?o<f?d?s.top-(d.top+d.height):g?g.top-(s.top+s.height):0:g?g.top-(s.top+s.height):d?s.top-(d.top+d.height):0:0}const pv="Sortable",Sv=ve.createContext({activeIndex:-1,containerId:pv,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:bv,disabled:{draggable:!1,droppable:!1}});function pm(i){let{children:f,id:o,items:s,strategy:d=bv,disabled:g=!1}=i;const{active:y,dragOverlay:S,droppableRects:E,over:m,measureDroppableContainers:_}=om(),M=Du(pv,o),Y=S.rect!==null,w=x.useMemo(()=>s.map($=>typeof $=="object"&&"id"in $?$.id:$),[s]),P=y!=null,X=y?w.indexOf(y.id):-1,Z=m?w.indexOf(m.id):-1,V=x.useRef(w),at=!gm(w,V.current),W=Z!==-1&&X===-1||at,et=ym(g);rl(()=>{at&&P&&_(w)},[at,w,P,_]),x.useEffect(()=>{V.current=w},[w]);const it=x.useMemo(()=>({activeIndex:X,containerId:M,disabled:et,disableTransforms:W,items:w,overIndex:Z,useDragOverlay:Y,sortedRects:vm(w,E),strategy:d}),[X,M,et.draggable,et.droppable,W,w,Z,E,Y,d]);return ve.createElement(Sv.Provider,{value:it},f)}const Sm=i=>{let{id:f,items:o,activeIndex:s,overIndex:d}=i;return Bs(o,s,d).indexOf(f)},Em=i=>{let{containerId:f,isSorting:o,wasDragging:s,index:d,items:g,newIndex:y,previousItems:S,previousContainerId:E,transition:m}=i;return!m||!s||S!==g&&d===y?!1:o?!0:y!==d&&f===E},Tm={duration:200,easing:"ease"},Ev="transform",Dm=pu.Transition.toString({property:Ev,duration:0,easing:"linear"}),Am={roleDescription:"sortable"};function zm(i){let{disabled:f,index:o,node:s,rect:d}=i;const[g,y]=x.useState(null),S=x.useRef(o);return rl(()=>{if(!f&&o!==S.current&&s.current){const E=d.current;if(E){const m=ba(s.current,{ignoreTransform:!0}),_={x:E.left-m.left,y:E.top-m.top,scaleX:E.width/m.width,scaleY:E.height/m.height};(_.x||_.y)&&y(_)}}o!==S.current&&(S.current=o)},[f,o,s,d]),x.useEffect(()=>{g&&y(null)},[g]),g}function Mm(i){let{animateLayoutChanges:f=Em,attributes:o,disabled:s,data:d,getNewIndex:g=Sm,id:y,strategy:S,resizeObserverConfig:E,transition:m=Tm}=i;const{items:_,containerId:M,activeIndex:Y,disabled:w,disableTransforms:P,sortedRects:X,overIndex:Z,useDragOverlay:V,strategy:at}=x.useContext(Sv),W=Om(s,w),et=_.indexOf(y),it=x.useMemo(()=>({sortable:{containerId:M,index:et,items:_},...d}),[M,d,et,_]),$=x.useMemo(()=>_.slice(_.indexOf(y)),[_,y]),{rect:Q,node:nt,isOver:ot,setNodeRef:Rt}=hm({id:y,data:it,disabled:W.droppable,resizeObserverConfig:{updateMeasurementsFor:$,...E}}),{active:rt,activatorEvent:Mt,activeNodeRect:Yt,attributes:Ht,setNodeRef:Qt,listeners:R,isDragging:T,over:q,setActivatorNodeRef:G,transform:tt}=sm({id:y,data:it,attributes:{...Am,...o},disabled:W.draggable}),v=Zg(Rt,Qt),O=!!rt,B=O&&!P&&Gi(Y)&&Gi(Z),L=!V&&T,F=L&&B?tt:null,ct=B?F??(S??at)({rects:X,activeNodeRect:Yt,activeIndex:Y,overIndex:Z,index:et}):null,Dt=Gi(Y)&&Gi(Z)?g({id:y,items:_,activeIndex:Y,overIndex:Z}):et,mt=rt==null?void 0:rt.id,dt=x.useRef({activeId:mt,items:_,newIndex:Dt,containerId:M}),je=_!==dt.current.items,ce=f({active:rt,containerId:M,isDragging:T,isSorting:O,id:y,index:et,items:_,newIndex:dt.current.newIndex,previousItems:dt.current.items,previousContainerId:dt.current.containerId,transition:m,wasDragging:dt.current.activeId!=null}),dl=zm({disabled:!ce,index:et,node:nt,rect:Q});return x.useEffect(()=>{O&&dt.current.newIndex!==Dt&&(dt.current.newIndex=Dt),M!==dt.current.containerId&&(dt.current.containerId=M),_!==dt.current.items&&(dt.current.items=_)},[O,Dt,M,_]),x.useEffect(()=>{if(mt===dt.current.activeId)return;if(mt!=null&&dt.current.activeId==null){dt.current.activeId=mt;return}const al=setTimeout(()=>{dt.current.activeId=mt},50);return()=>clearTimeout(al)},[mt]),{active:rt,activeIndex:Y,attributes:Ht,data:it,rect:Q,index:et,newIndex:Dt,items:_,isOver:ot,isSorting:O,isDragging:T,listeners:R,node:nt,overIndex:Z,over:q,setNodeRef:v,setActivatorNodeRef:G,setDroppableNodeRef:Rt,setDraggableNodeRef:Qt,transform:dl??ct,transition:ee()};function ee(){if(dl||je&&dt.current.newIndex===et)return Dm;if(!(L&&!Ns(Mt)||!m)&&(O||ce))return pu.Transition.toString({...m,property:Ev})}}function Om(i,f){var o,s;return typeof i=="boolean"?{draggable:i,droppable:!1}:{draggable:(o=i==null?void 0:i.draggable)!=null?o:f.draggable,droppable:(s=i==null?void 0:i.droppable)!=null?s:f.droppable}}function Ji(i){if(!i)return!1;const f=i.data.current;return!!(f&&"sortable"in f&&typeof f.sortable=="object"&&"containerId"in f.sortable&&"items"in f.sortable&&"index"in f.sortable)}const xm=[pt.Down,pt.Right,pt.Up,pt.Left],Cm=(i,f)=>{let{context:{active:o,collisionRect:s,droppableRects:d,droppableContainers:g,over:y,scrollableAncestors:S}}=f;if(xm.includes(i.code)){if(i.preventDefault(),!o||!s)return;const E=[];g.getEnabled().forEach(M=>{if(!M||M!=null&&M.disabled)return;const Y=d.get(M.id);if(Y)switch(i.code){case pt.Down:s.top<Y.top&&E.push(M);break;case pt.Up:s.top>Y.top&&E.push(M);break;case pt.Left:s.left>Y.left&&E.push(M);break;case pt.Right:s.left<Y.left&&E.push(M);break}});const m=cy({collisionRect:s,droppableRects:d,droppableContainers:E});let _=uv(m,"id");if(_===(y==null?void 0:y.id)&&m.length>1&&(_=m[1].id),_!=null){const M=g.get(o.id),Y=g.get(_),w=Y?d.get(Y.id):null,P=Y==null?void 0:Y.node.current;if(P&&w&&M&&Y){const Z=ki(P).some(($,Q)=>S[Q]!==$),V=Tv(M,Y),at=Rm(M,Y),W=Z||!V?{x:0,y:0}:{x:at?s.width-w.width:0,y:at?s.height-w.height:0},et={x:w.left,y:w.top};return W.x&&W.y?et:bu(et,W)}}}};function Tv(i,f){return!Ji(i)||!Ji(f)?!1:i.data.current.sortable.containerId===f.data.current.sortable.containerId}function Rm(i,f){return!Ji(i)||!Ji(f)||!Tv(i,f)?!1:i.data.current.sortable.index<f.data.current.sortable.index}function Ms(i){return i?new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(i)):"-"}function du(i){return{originalPath:i.path,path:i.path,title:i.frontmatter.title,priority:i.frontmatter.priority,status:i.frontmatter.status,content:i.content,updatedAt:i.frontmatter.updatedAt,createdAt:i.frontmatter.createdAt,extraFrontmatter:i.extraFrontmatter}}function Nm({task:i,selected:f,onSelect:o}){const{attributes:s,listeners:d,setNodeRef:g,transform:y,transition:S}=Mm({id:i.path}),E={transform:pu.Transform.toString(y),transition:S};return H.jsxs("button",{ref:g,style:E,type:"button",className:`task-row${f?" task-row-selected":""}`,onClick:()=>o(i.path),...s,...d,children:[H.jsxs("span",{className:"task-row-badges",children:[H.jsx("span",{className:`badge badge-${i.frontmatter.priority.toLowerCase()}`,children:i.frontmatter.priority}),H.jsx("span",{className:`badge badge-${i.frontmatter.status.toLowerCase()}`,children:i.frontmatter.status})]}),H.jsx("strong",{children:i.frontmatter.title}),H.jsx("small",{children:i.path}),H.jsxs("small",{children:["Updated ",Ms(i.frontmatter.updatedAt)]})]})}async function un(i,f){const o=new Headers(f==null?void 0:f.headers);(f==null?void 0:f.body)!==void 0&&!o.has("Content-Type")&&o.set("Content-Type","application/json");const s=await fetch(i,{headers:o,...f});if(!s.ok){const d=await s.json().catch(()=>null);throw new Error((d==null?void 0:d.error)??`Request failed: ${s.status}`)}if(s.status!==204)return await s.json()}function _m({taskDirs:i,ignorePaths:f,busy:o,onSave:s,onClose:d}){const[g,y]=x.useState(i),[S,E]=x.useState(f.length>0?f:[""]);function m(X,Z){const V=[...g];V[X]=Z,y(V)}function _(){y([...g,""])}function M(X){y(g.filter((Z,V)=>V!==X))}function Y(X,Z){const V=[...S];V[X]=Z,E(V)}function w(){E([...S,""])}function P(X){E(S.filter((Z,V)=>V!==X))}return H.jsx("div",{className:"settings-overlay",onClick:d,children:H.jsxs("div",{className:"settings-modal",onClick:X=>X.stopPropagation(),children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:"Settings"}),H.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Close"})]}),H.jsxs("div",{className:"settings-body",children:[H.jsxs("label",{children:[H.jsx("span",{className:"settings-label",children:"Task directories"}),H.jsx("small",{className:"settings-hint",children:"Directories to scan for .md task files (relative to root)"})]}),H.jsx("div",{className:"settings-dir-list",children:g.map((X,Z)=>H.jsxs("div",{className:"settings-dir-row",children:[H.jsx("input",{value:X,onChange:V=>m(Z,V.target.value),placeholder:"e.g. tasks"}),H.jsx("button",{type:"button",className:"ghost-button settings-remove-button",onClick:()=>M(Z),disabled:g.length<=1,title:"Remove",children:H.jsx("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})})]},Z))}),H.jsx("button",{type:"button",className:"ghost-button",onClick:_,children:"+ Add directory"}),H.jsxs("label",{children:[H.jsx("span",{className:"settings-label",children:"Ignore patterns"}),H.jsx("small",{className:"settings-hint",children:"Glob patterns for paths to exclude (e.g. __done__/**, archived/**)"})]}),H.jsx("div",{className:"settings-dir-list",children:S.map((X,Z)=>H.jsxs("div",{className:"settings-dir-row",children:[H.jsx("input",{value:X,onChange:V=>Y(Z,V.target.value),placeholder:"e.g. __done__/**"}),H.jsx("button",{type:"button",className:"ghost-button settings-remove-button",onClick:()=>P(Z),disabled:S.length<=1,title:"Remove",children:H.jsx("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})})]},Z))}),H.jsx("button",{type:"button",className:"ghost-button",onClick:w,children:"+ Add pattern"})]}),H.jsxs("div",{className:"form-actions",children:[H.jsx("button",{type:"button",className:"primary-button",disabled:o||g.every(X=>!X.trim()),onClick:()=>s(g.filter(X=>X.trim()),S.filter(X=>X.trim())),children:"Save"}),H.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Cancel"})]})]})})}function Um(){const[i,f]=x.useState([]),[o,s]=x.useState([]),[d,g]=x.useState(null),[y,S]=x.useState(null),[E,m]=x.useState("Loading tasks..."),[_,M]=x.useState(!1),[Y,w]=x.useState(!1),[P,X]=x.useState(["."]),[Z,V]=x.useState([]),[at,W]=x.useState(!1),[et,it]=x.useState(!0),$=x.useMemo(()=>i.find(T=>T.path===d)??null,[d,i]),Q=x.useMemo(()=>et?i.filter(T=>T.frontmatter.status!=="DONE"):i,[i,et]),nt=ay(Xh(Hs,{activationConstraint:{distance:8}}),Xh(Us,{coordinateGetter:Cm}));async function ot(T){const q=await un("/api/tasks");f(q.tasks),s(q.errors),g(G=>{var tt;return G&&q.tasks.some(v=>v.path===G)?G:((tt=q.tasks[0])==null?void 0:tt.path)??null}),T!=null&&T.preserveDraft||S(G=>{if(G!=null&&G.originalPath){const tt=q.tasks.find(v=>v.path===G.originalPath);if(tt)return du(tt)}return null})}async function Rt(){try{const T=await un("/api/config");X(T.taskDirs),V(T.ignorePaths??[])}catch{}}async function rt(T,q){M(!0);try{const G=await un("/api/config",{method:"PUT",body:JSON.stringify({taskDirs:T,ignorePaths:q})});X(G.taskDirs),V(G.ignorePaths??[]),m("Settings saved."),await ot()}catch(G){m(G instanceof Error?G.message:"Failed to save settings.")}finally{M(!1)}}x.useEffect(()=>{Rt(),ot(),m("Tasks loaded.")},[]),x.useEffect(()=>{if(!$){y!=null&&y.originalPath||S(T=>T??null);return}S(T=>!T||T.originalPath!==$.path?du($):T)},[$]),x.useEffect(()=>{const T=new EventSource("/api/events");return T.onmessage=()=>{ot({preserveDraft:!0})},T.onerror=()=>{T.close()},()=>T.close()},[]);async function Mt(){if(y){M(!0),m("");try{if(y.originalPath){const T=await un(`/api/tasks/${encodeURIComponent(y.originalPath)}`,{method:"PATCH",body:JSON.stringify({path:y.path,title:y.title,priority:y.priority,status:y.status,content:y.content,extraFrontmatter:y.extraFrontmatter,baseUpdatedAt:y.updatedAt})});await ot(),g(T.path),S(du(T)),m("Task saved.")}else{const T=await un("/api/tasks",{method:"POST",body:JSON.stringify({path:y.path||void 0,title:y.title,priority:y.priority,status:y.status,content:y.content,extraFrontmatter:y.extraFrontmatter})});await ot(),g(T.path),S(du(T)),m("Task created.")}}catch(T){m(T instanceof Error?T.message:"Failed to save task.")}finally{M(!1)}}}async function Yt(){if(y!=null&&y.originalPath){M(!0),m("");try{await un(`/api/tasks/${encodeURIComponent(y.originalPath)}`,{method:"DELETE"}),S(null),await ot(),m("Task deleted.")}catch(T){m(T instanceof Error?T.message:"Failed to delete task.")}finally{M(!1)}}}async function Ht(T){const{active:q,over:G}=T;if(!G||q.id===G.id)return;const tt=i.findIndex(B=>B.path===q.id),v=i.findIndex(B=>B.path===G.id),O=Bs(i,tt,v);f(O);try{await un("/api/order",{method:"PUT",body:JSON.stringify({order:O.map(B=>B.path)})}),m("Task order updated.")}catch(B){m(B instanceof Error?B.message:"Failed to save order."),await ot()}}async function Qt(T,q){if(y!=null&&y.originalPath)try{const G=await un(`/api/task-fields/${encodeURIComponent(y.originalPath)}`,{method:"PATCH",body:JSON.stringify({[T]:q})});await ot(),g(G.path),S(tt=>tt&&{...tt,[T]:q,updatedAt:G.frontmatter.updatedAt})}catch(G){m(G instanceof Error?G.message:`Failed to update ${T}.`)}}const R=!!y&&(y.originalPath===null||y.path!==y.originalPath||y.title!==($==null?void 0:$.frontmatter.title)||y.content!==($==null?void 0:$.content));return H.jsxs("div",{className:"app-shell",children:[H.jsxs("header",{className:"app-header",children:[H.jsxs("div",{className:"app-header-left",children:[H.jsx("h1",{children:"Markdown Task Viewer"}),H.jsx("p",{className:"eyebrow",children:"v0"})]}),H.jsxs("div",{className:"app-header-actions",children:[H.jsx("button",{type:"button",className:"ghost-button settings-button",onClick:()=>w(!0),title:"Settings",children:H.jsx("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.062 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z",clipRule:"evenodd"})})}),H.jsx("button",{type:"button",className:"primary-button",onClick:()=>{W(!1),S({originalPath:null,path:P[0]?`${P[0]}/`:"",title:"",priority:"MUST",status:"TODO",content:"",extraFrontmatter:{}})},children:"New Task"})]})]}),H.jsxs("main",{className:"layout-grid",children:[H.jsxs("section",{className:"panel",children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:"Tasks"}),H.jsxs("span",{className:"panel-header-right",children:[H.jsxs("label",{className:"filter-toggle",children:[H.jsx("input",{type:"checkbox",checked:et,onChange:()=>it(!et)}),H.jsx("span",{children:"Hide DONE"})]}),H.jsxs("span",{children:[Q.length," items"]})]})]}),H.jsxs("div",{className:"sidebar-scroll",children:[H.jsx(im,{sensors:nt,collisionDetection:iy,onDragEnd:T=>void Ht(T),children:H.jsx(pm,{items:Q.map(T=>T.path),strategy:mm,children:H.jsxs("div",{className:"task-list",children:[Q.map(T=>H.jsx(Nm,{task:T,selected:T.path===d,onSelect:q=>{g(q);const G=i.find(tt=>tt.path===q);G&&S(du(G))}},T.path)),Q.length===0?H.jsx("p",{className:"empty-list",children:et?"No active tasks.":"No tasks yet. Create your first markdown task."}):null]})})}),o.length>0?H.jsxs("div",{className:"error-panel",children:[H.jsx("h3",{children:"Unreadable Markdown"}),o.map(T=>H.jsxs("p",{children:[H.jsx("strong",{children:T.path}),H.jsx("span",{children:T.message})]},T.path))]}):null]})]}),H.jsxs("section",{className:"panel editor-panel",children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:y!=null&&y.originalPath?"Edit Task":"Task Details"}),R?H.jsx("span",{className:"dirty-state",children:"Unsaved changes"}):null]}),y?H.jsxs("div",{className:"task-form",children:[H.jsxs("div",{className:"field-row field-row-top",children:[H.jsxs("label",{children:[H.jsx("span",{children:"Priority"}),H.jsxs("select",{value:y.priority,onChange:T=>{const q=T.target.value;S({...y,priority:q}),y.originalPath&&Qt("priority",q)},children:[H.jsx("option",{value:"MUST",children:"MUST"}),H.jsx("option",{value:"WANT",children:"WANT"})]})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Status"}),H.jsxs("select",{value:y.status,onChange:T=>{const q=T.target.value;S({...y,status:q}),y.originalPath&&Qt("status",q)},children:[H.jsx("option",{value:"TODO",children:"TODO"}),H.jsx("option",{value:"WIP",children:"WIP"}),H.jsx("option",{value:"DONE",children:"DONE"})]})]})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Title"}),H.jsx("input",{value:y.title,onChange:T=>{const q=T.target.value,G={title:q};if(!at&&y.originalPath===null){const tt=P[0]||"";G.path=q.trim()?`${tt}/${q}.md`:`${tt}/`}S({...y,...G})},placeholder:"Write release notes",required:!0})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Relative path"}),H.jsx("input",{value:y.path,onChange:T=>{W(!0),S({...y,path:T.target.value})},placeholder:"planning/release-notes.md"})]}),H.jsxs("div",{className:"meta-strip",children:[H.jsxs("span",{children:["Created ",Ms(y.createdAt)]}),H.jsxs("span",{children:["Updated ",Ms(y.updatedAt)]})]}),H.jsxs("label",{className:"editor-label",children:[H.jsx("span",{children:"Markdown body"}),H.jsx("textarea",{value:y.content,onChange:T=>S({...y,content:T.target.value}),onKeyDown:T=>{if(T.nativeEvent.isComposing)return;const q=T.currentTarget,{selectionStart:G,selectionEnd:tt,value:v}=q;if(T.key==="Tab"){T.preventDefault();const O=v.lastIndexOf(`
53
+ `},ly={onDragStart(i){let{active:f}=i;return"Picked up draggable item "+f.id+"."},onDragOver(i){let{active:f,over:o}=i;return o?"Draggable item "+f.id+" was moved over droppable area "+o.id+".":"Draggable item "+f.id+" is no longer over a droppable area."},onDragEnd(i){let{active:f,over:o}=i;return o?"Draggable item "+f.id+" was dropped over droppable area "+o.id:"Draggable item "+f.id+" was dropped."},onDragCancel(i){let{active:f}=i;return"Dragging was cancelled. Draggable item "+f.id+" was dropped."}};function ny(i){let{announcements:f=ly,container:o,hiddenTextDescribedById:s,screenReaderInstructions:d=ey}=i;const{announce:g,announcement:y}=Ig(),S=Du("DndLiveRegion"),[E,m]=x.useState(!1);if(x.useEffect(()=>{m(!0)},[]),Pg(x.useMemo(()=>({onDragStart(M){let{active:Y}=M;g(f.onDragStart({active:Y}))},onDragMove(M){let{active:Y,over:w}=M;f.onDragMove&&g(f.onDragMove({active:Y,over:w}))},onDragOver(M){let{active:Y,over:w}=M;g(f.onDragOver({active:Y,over:w}))},onDragEnd(M){let{active:Y,over:w}=M;g(f.onDragEnd({active:Y,over:w}))},onDragCancel(M){let{active:Y,over:w}=M;g(f.onDragCancel({active:Y,over:w}))}}),[g,f])),!E)return null;const _=ve.createElement(ve.Fragment,null,ve.createElement($g,{id:s,value:d.draggable}),ve.createElement(Fg,{id:S,announcement:y}));return o?hu.createPortal(_,o):_}var $t;(function(i){i.DragStart="dragStart",i.DragMove="dragMove",i.DragEnd="dragEnd",i.DragCancel="dragCancel",i.DragOver="dragOver",i.RegisterDroppable="registerDroppable",i.SetDroppableDisabled="setDroppableDisabled",i.UnregisterDroppable="unregisterDroppable"})($t||($t={}));function Vi(){}function Xh(i,f){return x.useMemo(()=>({sensor:i,options:f??{}}),[i,f])}function ay(){for(var i=arguments.length,f=new Array(i),o=0;o<i;o++)f[o]=arguments[o];return x.useMemo(()=>[...f].filter(s=>s!=null),[...f])}const nl=Object.freeze({x:0,y:0});function nv(i,f){return Math.sqrt(Math.pow(i.x-f.x,2)+Math.pow(i.y-f.y,2))}function av(i,f){let{data:{value:o}}=i,{data:{value:s}}=f;return o-s}function uy(i,f){let{data:{value:o}}=i,{data:{value:s}}=f;return s-o}function wh(i){let{left:f,top:o,height:s,width:d}=i;return[{x:f,y:o},{x:f+d,y:o},{x:f,y:o+s},{x:f+d,y:o+s}]}function uv(i,f){if(!i||i.length===0)return null;const[o]=i;return o[f]}function Gh(i,f,o){return f===void 0&&(f=i.left),o===void 0&&(o=i.top),{x:f+i.width*.5,y:o+i.height*.5}}const iy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=Gh(f,f.left,f.top),g=[];for(const y of s){const{id:S}=y,E=o.get(S);if(E){const m=nv(Gh(E),d);g.push({id:S,data:{droppableContainer:y,value:m}})}}return g.sort(av)},cy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=wh(f),g=[];for(const y of s){const{id:S}=y,E=o.get(S);if(E){const m=wh(E),_=d.reduce((Y,w,P)=>Y+nv(m[P],w),0),M=Number((_/4).toFixed(4));g.push({id:S,data:{droppableContainer:y,value:M}})}}return g.sort(av)};function fy(i,f){const o=Math.max(f.top,i.top),s=Math.max(f.left,i.left),d=Math.min(f.left+f.width,i.left+i.width),g=Math.min(f.top+f.height,i.top+i.height),y=d-s,S=g-o;if(s<d&&o<g){const E=f.width*f.height,m=i.width*i.height,_=y*S,M=_/(E+m-_);return Number(M.toFixed(4))}return 0}const sy=i=>{let{collisionRect:f,droppableRects:o,droppableContainers:s}=i;const d=[];for(const g of s){const{id:y}=g,S=o.get(y);if(S){const E=fy(S,f);E>0&&d.push({id:y,data:{droppableContainer:g,value:E}})}}return d.sort(uy)};function oy(i,f,o){return{...i,scaleX:f&&o?f.width/o.width:1,scaleY:f&&o?f.height/o.height:1}}function iv(i,f){return i&&f?{x:i.left-f.left,y:i.top-f.top}:nl}function ry(i){return function(o){for(var s=arguments.length,d=new Array(s>1?s-1:0),g=1;g<s;g++)d[g-1]=arguments[g];return d.reduce((y,S)=>({...y,top:y.top+i*S.y,bottom:y.bottom+i*S.y,left:y.left+i*S.x,right:y.right+i*S.x}),{...o})}}const dy=ry(1);function hy(i){if(i.startsWith("matrix3d(")){const f=i.slice(9,-1).split(/, /);return{x:+f[12],y:+f[13],scaleX:+f[0],scaleY:+f[5]}}else if(i.startsWith("matrix(")){const f=i.slice(7,-1).split(/, /);return{x:+f[4],y:+f[5],scaleX:+f[0],scaleY:+f[3]}}return null}function vy(i,f,o){const s=hy(f);if(!s)return i;const{scaleX:d,scaleY:g,x:y,y:S}=s,E=i.left-y-(1-d)*parseFloat(o),m=i.top-S-(1-g)*parseFloat(o.slice(o.indexOf(" ")+1)),_=d?i.width/d:i.width,M=g?i.height/g:i.height;return{width:_,height:M,top:m,right:E+_,bottom:m+M,left:E}}const gy={ignoreTransform:!1};function ba(i,f){f===void 0&&(f=gy);let o=i.getBoundingClientRect();if(f.ignoreTransform){const{transform:m,transformOrigin:_}=ze(i).getComputedStyle(i);m&&(o=vy(o,m,_))}const{top:s,left:d,width:g,height:y,bottom:S,right:E}=o;return{top:s,left:d,width:g,height:y,bottom:S,right:E}}function Lh(i){return ba(i,{ignoreTransform:!0})}function yy(i){const f=i.innerWidth,o=i.innerHeight;return{top:0,left:0,right:f,bottom:o,width:f,height:o}}function my(i,f){return f===void 0&&(f=ze(i).getComputedStyle(i)),f.position==="fixed"}function by(i,f){f===void 0&&(f=ze(i).getComputedStyle(i));const o=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(d=>{const g=f[d];return typeof g=="string"?o.test(g):!1})}function ki(i,f){const o=[];function s(d){if(f!=null&&o.length>=f||!d)return o;if(Cs(d)&&d.scrollingElement!=null&&!o.includes(d.scrollingElement))return o.push(d.scrollingElement),o;if(!Eu(d)||tv(d)||o.includes(d))return o;const g=ze(i).getComputedStyle(d);return d!==i&&by(d,g)&&o.push(d),my(d,g)?o:s(d.parentNode)}return i?s(i):o}function cv(i){const[f]=ki(i,1);return f??null}function bs(i){return!Wi||!i?null:ya(i)?i:xs(i)?Cs(i)||i===ma(i).scrollingElement?window:Eu(i)?i:null:null}function fv(i){return ya(i)?i.scrollX:i.scrollLeft}function sv(i){return ya(i)?i.scrollY:i.scrollTop}function Ds(i){return{x:fv(i),y:sv(i)}}var te;(function(i){i[i.Forward=1]="Forward",i[i.Backward=-1]="Backward"})(te||(te={}));function ov(i){return!Wi||!i?!1:i===document.scrollingElement}function rv(i){const f={x:0,y:0},o=ov(i)?{height:window.innerHeight,width:window.innerWidth}:{height:i.clientHeight,width:i.clientWidth},s={x:i.scrollWidth-o.width,y:i.scrollHeight-o.height},d=i.scrollTop<=f.y,g=i.scrollLeft<=f.x,y=i.scrollTop>=s.y,S=i.scrollLeft>=s.x;return{isTop:d,isLeft:g,isBottom:y,isRight:S,maxScroll:s,minScroll:f}}const py={x:.2,y:.2};function Sy(i,f,o,s,d){let{top:g,left:y,right:S,bottom:E}=o;s===void 0&&(s=10),d===void 0&&(d=py);const{isTop:m,isBottom:_,isLeft:M,isRight:Y}=rv(i),w={x:0,y:0},P={x:0,y:0},X={height:f.height*d.y,width:f.width*d.x};return!m&&g<=f.top+X.height?(w.y=te.Backward,P.y=s*Math.abs((f.top+X.height-g)/X.height)):!_&&E>=f.bottom-X.height&&(w.y=te.Forward,P.y=s*Math.abs((f.bottom-X.height-E)/X.height)),!Y&&S>=f.right-X.width?(w.x=te.Forward,P.x=s*Math.abs((f.right-X.width-S)/X.width)):!M&&y<=f.left+X.width&&(w.x=te.Backward,P.x=s*Math.abs((f.left+X.width-y)/X.width)),{direction:w,speed:P}}function Ey(i){if(i===document.scrollingElement){const{innerWidth:g,innerHeight:y}=window;return{top:0,left:0,right:g,bottom:y,width:g,height:y}}const{top:f,left:o,right:s,bottom:d}=i.getBoundingClientRect();return{top:f,left:o,right:s,bottom:d,width:i.clientWidth,height:i.clientHeight}}function dv(i){return i.reduce((f,o)=>ga(f,Ds(o)),nl)}function Ty(i){return i.reduce((f,o)=>f+fv(o),0)}function Dy(i){return i.reduce((f,o)=>f+sv(o),0)}function Ay(i,f){if(f===void 0&&(f=ba),!i)return;const{top:o,left:s,bottom:d,right:g}=f(i);cv(i)&&(d<=0||g<=0||o>=window.innerHeight||s>=window.innerWidth)&&i.scrollIntoView({block:"center",inline:"center"})}const zy=[["x",["left","right"],Ty],["y",["top","bottom"],Dy]];class _s{constructor(f,o){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const s=ki(o),d=dv(s);this.rect={...f},this.width=f.width,this.height=f.height;for(const[g,y,S]of zy)for(const E of y)Object.defineProperty(this,E,{get:()=>{const m=S(s),_=d[g]-m;return this.rect[E]+_},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class vu{constructor(f){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(o=>{var s;return(s=this.target)==null?void 0:s.removeEventListener(...o)})},this.target=f}add(f,o,s){var d;(d=this.target)==null||d.addEventListener(f,o,s),this.listeners.push([f,o,s])}}function My(i){const{EventTarget:f}=ze(i);return i instanceof f?i:ma(i)}function ps(i,f){const o=Math.abs(i.x),s=Math.abs(i.y);return typeof f=="number"?Math.sqrt(o**2+s**2)>f:"x"in f&&"y"in f?o>f.x&&s>f.y:"x"in f?o>f.x:"y"in f?s>f.y:!1}var $e;(function(i){i.Click="click",i.DragStart="dragstart",i.Keydown="keydown",i.ContextMenu="contextmenu",i.Resize="resize",i.SelectionChange="selectionchange",i.VisibilityChange="visibilitychange"})($e||($e={}));function Qh(i){i.preventDefault()}function Oy(i){i.stopPropagation()}var pt;(function(i){i.Space="Space",i.Down="ArrowDown",i.Right="ArrowRight",i.Left="ArrowLeft",i.Up="ArrowUp",i.Esc="Escape",i.Enter="Enter",i.Tab="Tab"})(pt||(pt={}));const hv={start:[pt.Space,pt.Enter],cancel:[pt.Esc],end:[pt.Space,pt.Enter,pt.Tab]},xy=(i,f)=>{let{currentCoordinates:o}=f;switch(i.code){case pt.Right:return{...o,x:o.x+25};case pt.Left:return{...o,x:o.x-25};case pt.Down:return{...o,y:o.y+25};case pt.Up:return{...o,y:o.y-25}}};class Us{constructor(f){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=f;const{event:{target:o}}=f;this.props=f,this.listeners=new vu(ma(o)),this.windowListeners=new vu(ze(o)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add($e.Resize,this.handleCancel),this.windowListeners.add($e.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add($e.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:f,onStart:o}=this.props,s=f.node.current;s&&Ay(s),o(nl)}handleKeyDown(f){if(Ns(f)){const{active:o,context:s,options:d}=this.props,{keyboardCodes:g=hv,coordinateGetter:y=xy,scrollBehavior:S="smooth"}=d,{code:E}=f;if(g.end.includes(E)){this.handleEnd(f);return}if(g.cancel.includes(E)){this.handleCancel(f);return}const{collisionRect:m}=s.current,_=m?{x:m.left,y:m.top}:nl;this.referenceCoordinates||(this.referenceCoordinates=_);const M=y(f,{active:o,context:s.current,currentCoordinates:_});if(M){const Y=bu(M,_),w={x:0,y:0},{scrollableAncestors:P}=s.current;for(const X of P){const Z=f.code,{isTop:V,isRight:at,isLeft:W,isBottom:et,maxScroll:it,minScroll:$}=rv(X),Q=Ey(X),nt={x:Math.min(Z===pt.Right?Q.right-Q.width/2:Q.right,Math.max(Z===pt.Right?Q.left:Q.left+Q.width/2,M.x)),y:Math.min(Z===pt.Down?Q.bottom-Q.height/2:Q.bottom,Math.max(Z===pt.Down?Q.top:Q.top+Q.height/2,M.y))},ot=Z===pt.Right&&!at||Z===pt.Left&&!W,Rt=Z===pt.Down&&!et||Z===pt.Up&&!V;if(ot&&nt.x!==M.x){const rt=X.scrollLeft+Y.x,Mt=Z===pt.Right&&rt<=it.x||Z===pt.Left&&rt>=$.x;if(Mt&&!Y.y){X.scrollTo({left:rt,behavior:S});return}Mt?w.x=X.scrollLeft-rt:w.x=Z===pt.Right?X.scrollLeft-it.x:X.scrollLeft-$.x,w.x&&X.scrollBy({left:-w.x,behavior:S});break}else if(Rt&&nt.y!==M.y){const rt=X.scrollTop+Y.y,Mt=Z===pt.Down&&rt<=it.y||Z===pt.Up&&rt>=$.y;if(Mt&&!Y.x){X.scrollTo({top:rt,behavior:S});return}Mt?w.y=X.scrollTop-rt:w.y=Z===pt.Down?X.scrollTop-it.y:X.scrollTop-$.y,w.y&&X.scrollBy({top:-w.y,behavior:S});break}}this.handleMove(f,ga(bu(M,this.referenceCoordinates),w))}}}handleMove(f,o){const{onMove:s}=this.props;f.preventDefault(),s(o)}handleEnd(f){const{onEnd:o}=this.props;f.preventDefault(),this.detach(),o()}handleCancel(f){const{onCancel:o}=this.props;f.preventDefault(),this.detach(),o()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}Us.activators=[{eventName:"onKeyDown",handler:(i,f,o)=>{let{keyboardCodes:s=hv,onActivation:d}=f,{active:g}=o;const{code:y}=i.nativeEvent;if(s.start.includes(y)){const S=g.activatorNode.current;return S&&i.target!==S?!1:(i.preventDefault(),d==null||d({event:i.nativeEvent}),!0)}return!1}}];function Zh(i){return!!(i&&"distance"in i)}function Vh(i){return!!(i&&"delay"in i)}class js{constructor(f,o,s){var d;s===void 0&&(s=My(f.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=f,this.events=o;const{event:g}=f,{target:y}=g;this.props=f,this.events=o,this.document=ma(y),this.documentListeners=new vu(this.document),this.listeners=new vu(s),this.windowListeners=new vu(ze(y)),this.initialCoordinates=(d=Ts(g))!=null?d:nl,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:f,props:{options:{activationConstraint:o,bypassActivationConstraint:s}}}=this;if(this.listeners.add(f.move.name,this.handleMove,{passive:!1}),this.listeners.add(f.end.name,this.handleEnd),f.cancel&&this.listeners.add(f.cancel.name,this.handleCancel),this.windowListeners.add($e.Resize,this.handleCancel),this.windowListeners.add($e.DragStart,Qh),this.windowListeners.add($e.VisibilityChange,this.handleCancel),this.windowListeners.add($e.ContextMenu,Qh),this.documentListeners.add($e.Keydown,this.handleKeydown),o){if(s!=null&&s({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(Vh(o)){this.timeoutId=setTimeout(this.handleStart,o.delay),this.handlePending(o);return}if(Zh(o)){this.handlePending(o);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(f,o){const{active:s,onPending:d}=this.props;d(s,f,this.initialCoordinates,o)}handleStart(){const{initialCoordinates:f}=this,{onStart:o}=this.props;f&&(this.activated=!0,this.documentListeners.add($e.Click,Oy,{capture:!0}),this.removeTextSelection(),this.documentListeners.add($e.SelectionChange,this.removeTextSelection),o(f))}handleMove(f){var o;const{activated:s,initialCoordinates:d,props:g}=this,{onMove:y,options:{activationConstraint:S}}=g;if(!d)return;const E=(o=Ts(f))!=null?o:nl,m=bu(d,E);if(!s&&S){if(Zh(S)){if(S.tolerance!=null&&ps(m,S.tolerance))return this.handleCancel();if(ps(m,S.distance))return this.handleStart()}if(Vh(S)&&ps(m,S.tolerance))return this.handleCancel();this.handlePending(S,m);return}f.cancelable&&f.preventDefault(),y(E)}handleEnd(){const{onAbort:f,onEnd:o}=this.props;this.detach(),this.activated||f(this.props.active),o()}handleCancel(){const{onAbort:f,onCancel:o}=this.props;this.detach(),this.activated||f(this.props.active),o()}handleKeydown(f){f.code===pt.Esc&&this.handleCancel()}removeTextSelection(){var f;(f=this.document.getSelection())==null||f.removeAllRanges()}}const Cy={cancel:{name:"pointercancel"},move:{name:"pointermove"},end:{name:"pointerup"}};class Hs extends js{constructor(f){const{event:o}=f,s=ma(o.target);super(f,Cy,s)}}Hs.activators=[{eventName:"onPointerDown",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;return!o.isPrimary||o.button!==0?!1:(s==null||s({event:o}),!0)}}];const Ry={move:{name:"mousemove"},end:{name:"mouseup"}};var As;(function(i){i[i.RightClick=2]="RightClick"})(As||(As={}));class Ny extends js{constructor(f){super(f,Ry,ma(f.event.target))}}Ny.activators=[{eventName:"onMouseDown",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;return o.button===As.RightClick?!1:(s==null||s({event:o}),!0)}}];const Ss={cancel:{name:"touchcancel"},move:{name:"touchmove"},end:{name:"touchend"}};class _y extends js{constructor(f){super(f,Ss)}static setup(){return window.addEventListener(Ss.move.name,f,{capture:!1,passive:!1}),function(){window.removeEventListener(Ss.move.name,f)};function f(){}}}_y.activators=[{eventName:"onTouchStart",handler:(i,f)=>{let{nativeEvent:o}=i,{onActivation:s}=f;const{touches:d}=o;return d.length>1?!1:(s==null||s({event:o}),!0)}}];var gu;(function(i){i[i.Pointer=0]="Pointer",i[i.DraggableRect=1]="DraggableRect"})(gu||(gu={}));var Ki;(function(i){i[i.TreeOrder=0]="TreeOrder",i[i.ReversedTreeOrder=1]="ReversedTreeOrder"})(Ki||(Ki={}));function Uy(i){let{acceleration:f,activator:o=gu.Pointer,canScroll:s,draggingRect:d,enabled:g,interval:y=5,order:S=Ki.TreeOrder,pointerCoordinates:E,scrollableAncestors:m,scrollableAncestorRects:_,delta:M,threshold:Y}=i;const w=Hy({delta:M,disabled:!g}),[P,X]=Vg(),Z=x.useRef({x:0,y:0}),V=x.useRef({x:0,y:0}),at=x.useMemo(()=>{switch(o){case gu.Pointer:return E?{top:E.y,bottom:E.y,left:E.x,right:E.x}:null;case gu.DraggableRect:return d}},[o,d,E]),W=x.useRef(null),et=x.useCallback(()=>{const $=W.current;if(!$)return;const Q=Z.current.x*V.current.x,nt=Z.current.y*V.current.y;$.scrollBy(Q,nt)},[]),it=x.useMemo(()=>S===Ki.TreeOrder?[...m].reverse():m,[S,m]);x.useEffect(()=>{if(!g||!m.length||!at){X();return}for(const $ of it){if((s==null?void 0:s($))===!1)continue;const Q=m.indexOf($),nt=_[Q];if(!nt)continue;const{direction:ot,speed:Rt}=Sy($,nt,at,f,Y);for(const rt of["x","y"])w[rt][ot[rt]]||(Rt[rt]=0,ot[rt]=0);if(Rt.x>0||Rt.y>0){X(),W.current=$,P(et,y),Z.current=Rt,V.current=ot;return}}Z.current={x:0,y:0},V.current={x:0,y:0},X()},[f,et,s,X,g,y,JSON.stringify(at),JSON.stringify(w),P,m,it,_,JSON.stringify(Y)])}const jy={x:{[te.Backward]:!1,[te.Forward]:!1},y:{[te.Backward]:!1,[te.Forward]:!1}};function Hy(i){let{delta:f,disabled:o}=i;const s=Es(f);return Tu(d=>{if(o||!s||!d)return jy;const g={x:Math.sign(f.x-s.x),y:Math.sign(f.y-s.y)};return{x:{[te.Backward]:d.x[te.Backward]||g.x===-1,[te.Forward]:d.x[te.Forward]||g.x===1},y:{[te.Backward]:d.y[te.Backward]||g.y===-1,[te.Forward]:d.y[te.Forward]||g.y===1}}},[o,f,s])}function By(i,f){const o=f!=null?i.get(f):void 0,s=o?o.node.current:null;return Tu(d=>{var g;return f==null?null:(g=s??d)!=null?g:null},[s,f])}function qy(i,f){return x.useMemo(()=>i.reduce((o,s)=>{const{sensor:d}=s,g=d.activators.map(y=>({eventName:y.eventName,handler:f(y.handler,s)}));return[...o,...g]},[]),[i,f])}var Su;(function(i){i[i.Always=0]="Always",i[i.BeforeDragging=1]="BeforeDragging",i[i.WhileDragging=2]="WhileDragging"})(Su||(Su={}));var zs;(function(i){i.Optimized="optimized"})(zs||(zs={}));const Kh=new Map;function Yy(i,f){let{dragging:o,dependencies:s,config:d}=f;const[g,y]=x.useState(null),{frequency:S,measure:E,strategy:m}=d,_=x.useRef(i),M=Z(),Y=mu(M),w=x.useCallback(function(V){V===void 0&&(V=[]),!Y.current&&y(at=>at===null?V:at.concat(V.filter(W=>!at.includes(W))))},[Y]),P=x.useRef(null),X=Tu(V=>{if(M&&!o)return Kh;if(!V||V===Kh||_.current!==i||g!=null){const at=new Map;for(let W of i){if(!W)continue;if(g&&g.length>0&&!g.includes(W.id)&&W.rect.current){at.set(W.id,W.rect.current);continue}const et=W.node.current,it=et?new _s(E(et),et):null;W.rect.current=it,it&&at.set(W.id,it)}return at}return V},[i,g,o,M,E]);return x.useEffect(()=>{_.current=i},[i]),x.useEffect(()=>{M||w()},[o,M]),x.useEffect(()=>{g&&g.length>0&&y(null)},[JSON.stringify(g)]),x.useEffect(()=>{M||typeof S!="number"||P.current!==null||(P.current=setTimeout(()=>{w(),P.current=null},S))},[S,M,w,...s]),{droppableRects:X,measureDroppableContainers:w,measuringScheduled:g!=null};function Z(){switch(m){case Su.Always:return!1;case Su.BeforeDragging:return o;default:return!o}}}function vv(i,f){return Tu(o=>i?o||(typeof f=="function"?f(i):i):null,[f,i])}function Xy(i,f){return vv(i,f)}function wy(i){let{callback:f,disabled:o}=i;const s=Rs(f),d=x.useMemo(()=>{if(o||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:g}=window;return new g(s)},[s,o]);return x.useEffect(()=>()=>d==null?void 0:d.disconnect(),[d]),d}function $i(i){let{callback:f,disabled:o}=i;const s=Rs(f),d=x.useMemo(()=>{if(o||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:g}=window;return new g(s)},[o]);return x.useEffect(()=>()=>d==null?void 0:d.disconnect(),[d]),d}function Gy(i){return new _s(ba(i),i)}function Jh(i,f,o){f===void 0&&(f=Gy);const[s,d]=x.useState(null);function g(){d(E=>{if(!i)return null;if(i.isConnected===!1){var m;return(m=E??o)!=null?m:null}const _=f(i);return JSON.stringify(E)===JSON.stringify(_)?E:_})}const y=wy({callback(E){if(i)for(const m of E){const{type:_,target:M}=m;if(_==="childList"&&M instanceof HTMLElement&&M.contains(i)){g();break}}}}),S=$i({callback:g});return rl(()=>{g(),i?(S==null||S.observe(i),y==null||y.observe(document.body,{childList:!0,subtree:!0})):(S==null||S.disconnect(),y==null||y.disconnect())},[i]),s}function Ly(i){const f=vv(i);return iv(i,f)}const Wh=[];function Qy(i){const f=x.useRef(i),o=Tu(s=>i?s&&s!==Wh&&i&&f.current&&i.parentNode===f.current.parentNode?s:ki(i):Wh,[i]);return x.useEffect(()=>{f.current=i},[i]),o}function Zy(i){const[f,o]=x.useState(null),s=x.useRef(i),d=x.useCallback(g=>{const y=bs(g.target);y&&o(S=>S?(S.set(y,Ds(y)),new Map(S)):null)},[]);return x.useEffect(()=>{const g=s.current;if(i!==g){y(g);const S=i.map(E=>{const m=bs(E);return m?(m.addEventListener("scroll",d,{passive:!0}),[m,Ds(m)]):null}).filter(E=>E!=null);o(S.length?new Map(S):null),s.current=i}return()=>{y(i),y(g)};function y(S){S.forEach(E=>{const m=bs(E);m==null||m.removeEventListener("scroll",d)})}},[d,i]),x.useMemo(()=>i.length?f?Array.from(f.values()).reduce((g,y)=>ga(g,y),nl):dv(i):nl,[i,f])}function kh(i,f){f===void 0&&(f=[]);const o=x.useRef(null);return x.useEffect(()=>{o.current=null},f),x.useEffect(()=>{const s=i!==nl;s&&!o.current&&(o.current=i),!s&&o.current&&(o.current=null)},[i]),o.current?bu(i,o.current):nl}function Vy(i){x.useEffect(()=>{if(!Wi)return;const f=i.map(o=>{let{sensor:s}=o;return s.setup==null?void 0:s.setup()});return()=>{for(const o of f)o==null||o()}},i.map(f=>{let{sensor:o}=f;return o}))}function Ky(i,f){return x.useMemo(()=>i.reduce((o,s)=>{let{eventName:d,handler:g}=s;return o[d]=y=>{g(y,f)},o},{}),[i,f])}function gv(i){return x.useMemo(()=>i?yy(i):null,[i])}const $h=[];function Jy(i,f){f===void 0&&(f=ba);const[o]=i,s=gv(o?ze(o):null),[d,g]=x.useState($h);function y(){g(()=>i.length?i.map(E=>ov(E)?s:new _s(f(E),E)):$h)}const S=$i({callback:y});return rl(()=>{S==null||S.disconnect(),y(),i.forEach(E=>S==null?void 0:S.observe(E))},[i]),d}function Wy(i){if(!i)return null;if(i.children.length>1)return i;const f=i.children[0];return Eu(f)?f:i}function ky(i){let{measure:f}=i;const[o,s]=x.useState(null),d=x.useCallback(m=>{for(const{target:_}of m)if(Eu(_)){s(M=>{const Y=f(_);return M?{...M,width:Y.width,height:Y.height}:Y});break}},[f]),g=$i({callback:d}),y=x.useCallback(m=>{const _=Wy(m);g==null||g.disconnect(),_&&(g==null||g.observe(_)),s(_?f(_):null)},[f,g]),[S,E]=Zi(y);return x.useMemo(()=>({nodeRef:S,rect:o,setRef:E}),[o,S,E])}const $y=[{sensor:Hs,options:{}},{sensor:Us,options:{}}],Fy={current:{}},Qi={draggable:{measure:Lh},droppable:{measure:Lh,strategy:Su.WhileDragging,frequency:zs.Optimized},dragOverlay:{measure:ba}};class yu extends Map{get(f){var o;return f!=null&&(o=super.get(f))!=null?o:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(f=>{let{disabled:o}=f;return!o})}getNodeFor(f){var o,s;return(o=(s=this.get(f))==null?void 0:s.node.current)!=null?o:void 0}}const Iy={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new yu,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:Vi},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Qi,measureDroppableContainers:Vi,windowRect:null,measuringScheduled:!1},Py={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:Vi,draggableNodes:new Map,over:null,measureDroppableContainers:Vi},Fi=x.createContext(Py),yv=x.createContext(Iy);function tm(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new yu}}}function em(i,f){switch(f.type){case $t.DragStart:return{...i,draggable:{...i.draggable,initialCoordinates:f.initialCoordinates,active:f.active}};case $t.DragMove:return i.draggable.active==null?i:{...i,draggable:{...i.draggable,translate:{x:f.coordinates.x-i.draggable.initialCoordinates.x,y:f.coordinates.y-i.draggable.initialCoordinates.y}}};case $t.DragEnd:case $t.DragCancel:return{...i,draggable:{...i.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case $t.RegisterDroppable:{const{element:o}=f,{id:s}=o,d=new yu(i.droppable.containers);return d.set(s,o),{...i,droppable:{...i.droppable,containers:d}}}case $t.SetDroppableDisabled:{const{id:o,key:s,disabled:d}=f,g=i.droppable.containers.get(o);if(!g||s!==g.key)return i;const y=new yu(i.droppable.containers);return y.set(o,{...g,disabled:d}),{...i,droppable:{...i.droppable,containers:y}}}case $t.UnregisterDroppable:{const{id:o,key:s}=f,d=i.droppable.containers.get(o);if(!d||s!==d.key)return i;const g=new yu(i.droppable.containers);return g.delete(o),{...i,droppable:{...i.droppable,containers:g}}}default:return i}}function lm(i){let{disabled:f}=i;const{active:o,activatorEvent:s,draggableNodes:d}=x.useContext(Fi),g=Es(s),y=Es(o==null?void 0:o.id);return x.useEffect(()=>{if(!f&&!s&&g&&y!=null){if(!Ns(g)||document.activeElement===g.target)return;const S=d.get(y);if(!S)return;const{activatorNode:E,node:m}=S;if(!E.current&&!m.current)return;requestAnimationFrame(()=>{for(const _ of[E.current,m.current]){if(!_)continue;const M=Wg(_);if(M){M.focus();break}}})}},[s,f,d,y,g]),null}function nm(i,f){let{transform:o,...s}=f;return i!=null&&i.length?i.reduce((d,g)=>g({transform:d,...s}),o):o}function am(i){return x.useMemo(()=>({draggable:{...Qi.draggable,...i==null?void 0:i.draggable},droppable:{...Qi.droppable,...i==null?void 0:i.droppable},dragOverlay:{...Qi.dragOverlay,...i==null?void 0:i.dragOverlay}}),[i==null?void 0:i.draggable,i==null?void 0:i.droppable,i==null?void 0:i.dragOverlay])}function um(i){let{activeNode:f,measure:o,initialRect:s,config:d=!0}=i;const g=x.useRef(!1),{x:y,y:S}=typeof d=="boolean"?{x:d,y:d}:d;rl(()=>{if(!y&&!S||!f){g.current=!1;return}if(g.current||!s)return;const m=f==null?void 0:f.node.current;if(!m||m.isConnected===!1)return;const _=o(m),M=iv(_,s);if(y||(M.x=0),S||(M.y=0),g.current=!0,Math.abs(M.x)>0||Math.abs(M.y)>0){const Y=cv(m);Y&&Y.scrollBy({top:M.y,left:M.x})}},[f,y,S,s,o])}const mv=x.createContext({...nl,scaleX:1,scaleY:1});var cn;(function(i){i[i.Uninitialized=0]="Uninitialized",i[i.Initializing=1]="Initializing",i[i.Initialized=2]="Initialized"})(cn||(cn={}));const im=x.memo(function(f){var o,s,d,g;let{id:y,accessibility:S,autoScroll:E=!0,children:m,sensors:_=$y,collisionDetection:M=sy,measuring:Y,modifiers:w,...P}=f;const X=x.useReducer(em,void 0,tm),[Z,V]=X,[at,W]=ty(),[et,it]=x.useState(cn.Uninitialized),$=et===cn.Initialized,{draggable:{active:Q,nodes:nt,translate:ot},droppable:{containers:Rt}}=Z,rt=Q!=null?nt.get(Q):null,Mt=x.useRef({initial:null,translated:null}),Yt=x.useMemo(()=>{var Xt;return Q!=null?{id:Q,data:(Xt=rt==null?void 0:rt.data)!=null?Xt:Fy,rect:Mt}:null},[Q,rt]),Ht=x.useRef(null),[Qt,R]=x.useState(null),[T,q]=x.useState(null),G=mu(P,Object.values(P)),tt=Du("DndDescribedBy",y),v=x.useMemo(()=>Rt.getEnabled(),[Rt]),O=am(Y),{droppableRects:B,measureDroppableContainers:L,measuringScheduled:F}=Yy(v,{dragging:$,dependencies:[ot.x,ot.y],config:O.droppable}),k=By(nt,Q),ct=x.useMemo(()=>T?Ts(T):null,[T]),Dt=Rn(),mt=Xy(k,O.draggable.measure);um({activeNode:Q!=null?nt.get(Q):null,config:Dt.layoutShiftCompensation,initialRect:mt,measure:O.draggable.measure});const dt=Jh(k,O.draggable.measure,mt),je=Jh(k?k.parentElement:null),ce=x.useRef({activatorEvent:null,active:null,activeNode:k,collisionRect:null,collisions:null,droppableRects:B,draggableNodes:nt,draggingNode:null,draggingNodeRect:null,droppableContainers:Rt,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),dl=Rt.getNodeFor((o=ce.current.over)==null?void 0:o.id),ee=ky({measure:O.dragOverlay.measure}),al=(s=ee.nodeRef.current)!=null?s:k,ul=$?(d=ee.rect)!=null?d:dt:null,Au=!!(ee.nodeRef.current&&ee.rect),pa=Ly(Au?null:dt),fn=gv(al?ze(al):null),He=Qy($?dl??k:null),jl=Jy(He),xn=nm(w,{transform:{x:ot.x-pa.x,y:ot.y-pa.y,scaleX:1,scaleY:1},activatorEvent:T,active:Yt,activeNodeRect:dt,containerNodeRect:je,draggingNodeRect:ul,over:ce.current.over,overlayNodeRect:ee.rect,scrollableAncestors:He,scrollableAncestorRects:jl,windowRect:fn}),zu=ct?ga(ct,ot):null,fe=Zy(He),Ii=kh(fe),Mu=kh(fe,[dt]),hl=ga(xn,Ii),Fe=ul?dy(ul,xn):null,sn=Yt&&Fe?M({active:Yt,collisionRect:Fe,droppableRects:B,droppableContainers:v,pointerCoordinates:zu}):null,Sa=uv(sn,"id"),[il,Ou]=x.useState(null),on=Au?xn:ga(xn,Mu),de=oy(on,(g=il==null?void 0:il.rect)!=null?g:null,dt),Be=x.useRef(null),se=x.useCallback((Xt,wt)=>{let{sensor:Ft,options:ge}=wt;if(Ht.current==null)return;const ye=nt.get(Ht.current);if(!ye)return;const oe=Xt.nativeEvent,me=new Ft({active:Ht.current,activeNode:ye,event:oe,options:ge,context:ce,onAbort(Wt){if(!nt.get(Wt))return;const{onDragAbort:Me}=G.current,Ye={id:Wt};Me==null||Me(Ye),at({type:"onDragAbort",event:Ye})},onPending(Wt,Ie,Me,Ye){if(!nt.get(Wt))return;const{onDragPending:gl}=G.current,Pe={id:Wt,constraint:Ie,initialCoordinates:Me,offset:Ye};gl==null||gl(Pe),at({type:"onDragPending",event:Pe})},onStart(Wt){const Ie=Ht.current;if(Ie==null)return;const Me=nt.get(Ie);if(!Me)return;const{onDragStart:Ye}=G.current,vl={activatorEvent:oe,active:{id:Ie,data:Me.data,rect:Mt}};hu.unstable_batchedUpdates(()=>{Ye==null||Ye(vl),it(cn.Initializing),V({type:$t.DragStart,initialCoordinates:Wt,active:Ie}),at({type:"onDragStart",event:vl}),R(Be.current),q(oe)})},onMove(Wt){V({type:$t.DragMove,coordinates:Wt})},onEnd:qe($t.DragEnd),onCancel:qe($t.DragCancel)});Be.current=me;function qe(Wt){return async function(){const{active:Me,collisions:Ye,over:vl,scrollAdjustedTranslate:gl}=ce.current;let Pe=null;if(Me&&gl){const{cancelDrop:Hl}=G.current;Pe={activatorEvent:oe,active:Me,collisions:Ye,delta:gl,over:vl},Wt===$t.DragEnd&&typeof Hl=="function"&&await Promise.resolve(Hl(Pe))&&(Wt=$t.DragCancel)}Ht.current=null,hu.unstable_batchedUpdates(()=>{V({type:Wt}),it(cn.Uninitialized),Ou(null),R(null),q(null),Be.current=null;const Hl=Wt===$t.DragEnd?"onDragEnd":"onDragCancel";if(Pe){const Xe=G.current[Hl];Xe==null||Xe(Pe),at({type:Hl,event:Pe})}})}}},[nt]),Pi=x.useCallback((Xt,wt)=>(Ft,ge)=>{const ye=Ft.nativeEvent,oe=nt.get(ge);if(Ht.current!==null||!oe||ye.dndKit||ye.defaultPrevented)return;const me={active:oe};Xt(Ft,wt.options,me)===!0&&(ye.dndKit={capturedBy:wt.sensor},Ht.current=ge,se(Ft,wt))},[nt,se]),xu=qy(_,Pi);Vy(_),rl(()=>{dt&&et===cn.Initializing&&it(cn.Initialized)},[dt,et]),x.useEffect(()=>{const{onDragMove:Xt}=G.current,{active:wt,activatorEvent:Ft,collisions:ge,over:ye}=ce.current;if(!wt||!Ft)return;const oe={active:wt,activatorEvent:Ft,collisions:ge,delta:{x:hl.x,y:hl.y},over:ye};hu.unstable_batchedUpdates(()=>{Xt==null||Xt(oe),at({type:"onDragMove",event:oe})})},[hl.x,hl.y]),x.useEffect(()=>{const{active:Xt,activatorEvent:wt,collisions:Ft,droppableContainers:ge,scrollAdjustedTranslate:ye}=ce.current;if(!Xt||Ht.current==null||!wt||!ye)return;const{onDragOver:oe}=G.current,me=ge.get(Sa),qe=me&&me.rect.current?{id:me.id,rect:me.rect.current,data:me.data,disabled:me.disabled}:null,Wt={active:Xt,activatorEvent:wt,collisions:Ft,delta:{x:ye.x,y:ye.y},over:qe};hu.unstable_batchedUpdates(()=>{Ou(qe),oe==null||oe(Wt),at({type:"onDragOver",event:Wt})})},[Sa]),rl(()=>{ce.current={activatorEvent:T,active:Yt,activeNode:k,collisionRect:Fe,collisions:sn,droppableRects:B,draggableNodes:nt,draggingNode:al,draggingNodeRect:ul,droppableContainers:Rt,over:il,scrollableAncestors:He,scrollAdjustedTranslate:hl},Mt.current={initial:ul,translated:Fe}},[Yt,k,sn,Fe,nt,al,ul,B,Rt,il,He,hl]),Uy({...Dt,delta:ot,draggingRect:Fe,pointerCoordinates:zu,scrollableAncestors:He,scrollableAncestorRects:jl});const tc=x.useMemo(()=>({active:Yt,activeNode:k,activeNodeRect:dt,activatorEvent:T,collisions:sn,containerNodeRect:je,dragOverlay:ee,draggableNodes:nt,droppableContainers:Rt,droppableRects:B,over:il,measureDroppableContainers:L,scrollableAncestors:He,scrollableAncestorRects:jl,measuringConfiguration:O,measuringScheduled:F,windowRect:fn}),[Yt,k,dt,T,sn,je,ee,nt,Rt,B,il,L,He,jl,O,F,fn]),Cn=x.useMemo(()=>({activatorEvent:T,activators:xu,active:Yt,activeNodeRect:dt,ariaDescribedById:{draggable:tt},dispatch:V,draggableNodes:nt,over:il,measureDroppableContainers:L}),[T,xu,Yt,dt,V,tt,nt,il,L]);return ve.createElement(lv.Provider,{value:W},ve.createElement(Fi.Provider,{value:Cn},ve.createElement(yv.Provider,{value:tc},ve.createElement(mv.Provider,{value:de},m)),ve.createElement(lm,{disabled:(S==null?void 0:S.restoreFocus)===!1})),ve.createElement(ny,{...S,hiddenTextDescribedById:tt}));function Rn(){const Xt=(Qt==null?void 0:Qt.autoScrollEnabled)===!1,wt=typeof E=="object"?E.enabled===!1:E===!1,Ft=$&&!Xt&&!wt;return typeof E=="object"?{...E,enabled:Ft}:{enabled:Ft}}}),cm=x.createContext(null),Fh="button",fm="Draggable";function sm(i){let{id:f,data:o,disabled:s=!1,attributes:d}=i;const g=Du(fm),{activators:y,activatorEvent:S,active:E,activeNodeRect:m,ariaDescribedById:_,draggableNodes:M,over:Y}=x.useContext(Fi),{role:w=Fh,roleDescription:P="draggable",tabIndex:X=0}=d??{},Z=(E==null?void 0:E.id)===f,V=x.useContext(Z?mv:cm),[at,W]=Zi(),[et,it]=Zi(),$=Ky(y,f),Q=mu(o);rl(()=>(M.set(f,{id:f,key:g,node:at,activatorNode:et,data:Q}),()=>{const ot=M.get(f);ot&&ot.key===g&&M.delete(f)}),[M,f]);const nt=x.useMemo(()=>({role:w,tabIndex:X,"aria-disabled":s,"aria-pressed":Z&&w===Fh?!0:void 0,"aria-roledescription":P,"aria-describedby":_.draggable}),[s,w,X,Z,P,_.draggable]);return{active:E,activatorEvent:S,activeNodeRect:m,attributes:nt,isDragging:Z,listeners:s?void 0:$,node:at,over:Y,setNodeRef:W,setActivatorNodeRef:it,transform:V}}function om(){return x.useContext(yv)}const rm="Droppable",dm={timeout:25};function hm(i){let{data:f,disabled:o=!1,id:s,resizeObserverConfig:d}=i;const g=Du(rm),{active:y,dispatch:S,over:E,measureDroppableContainers:m}=x.useContext(Fi),_=x.useRef({disabled:o}),M=x.useRef(!1),Y=x.useRef(null),w=x.useRef(null),{disabled:P,updateMeasurementsFor:X,timeout:Z}={...dm,...d},V=mu(X??s),at=x.useCallback(()=>{if(!M.current){M.current=!0;return}w.current!=null&&clearTimeout(w.current),w.current=setTimeout(()=>{m(Array.isArray(V.current)?V.current:[V.current]),w.current=null},Z)},[Z]),W=$i({callback:at,disabled:P||!y}),et=x.useCallback((nt,ot)=>{W&&(ot&&(W.unobserve(ot),M.current=!1),nt&&W.observe(nt))},[W]),[it,$]=Zi(et),Q=mu(f);return x.useEffect(()=>{!W||!it.current||(W.disconnect(),M.current=!1,W.observe(it.current))},[it,W]),x.useEffect(()=>(S({type:$t.RegisterDroppable,element:{id:s,key:g,disabled:o,node:it,rect:Y,data:Q}}),()=>S({type:$t.UnregisterDroppable,key:g,id:s})),[s]),x.useEffect(()=>{o!==_.current.disabled&&(S({type:$t.SetDroppableDisabled,id:s,key:g,disabled:o}),_.current.disabled=o)},[s,g,o,S]),{active:y,rect:Y,isOver:(E==null?void 0:E.id)===s,node:it,over:E,setNodeRef:$}}function Bs(i,f,o){const s=i.slice();return s.splice(o<0?s.length+o:o,0,s.splice(f,1)[0]),s}function vm(i,f){return i.reduce((o,s,d)=>{const g=f.get(s);return g&&(o[d]=g),o},Array(i.length))}function Gi(i){return i!==null&&i>=0}function gm(i,f){if(i===f)return!0;if(i.length!==f.length)return!1;for(let o=0;o<i.length;o++)if(i[o]!==f[o])return!1;return!0}function ym(i){return typeof i=="boolean"?{draggable:i,droppable:i}:i}const bv=i=>{let{rects:f,activeIndex:o,overIndex:s,index:d}=i;const g=Bs(f,s,o),y=f[d],S=g[d];return!S||!y?null:{x:S.left-y.left,y:S.top-y.top,scaleX:S.width/y.width,scaleY:S.height/y.height}},Li={scaleX:1,scaleY:1},mm=i=>{var f;let{activeIndex:o,activeNodeRect:s,index:d,rects:g,overIndex:y}=i;const S=(f=g[o])!=null?f:s;if(!S)return null;if(d===o){const m=g[y];return m?{x:0,y:o<y?m.top+m.height-(S.top+S.height):m.top-S.top,...Li}:null}const E=bm(g,d,o);return d>o&&d<=y?{x:0,y:-S.height-E,...Li}:d<o&&d>=y?{x:0,y:S.height+E,...Li}:{x:0,y:0,...Li}};function bm(i,f,o){const s=i[f],d=i[f-1],g=i[f+1];return s?o<f?d?s.top-(d.top+d.height):g?g.top-(s.top+s.height):0:g?g.top-(s.top+s.height):d?s.top-(d.top+d.height):0:0}const pv="Sortable",Sv=ve.createContext({activeIndex:-1,containerId:pv,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:bv,disabled:{draggable:!1,droppable:!1}});function pm(i){let{children:f,id:o,items:s,strategy:d=bv,disabled:g=!1}=i;const{active:y,dragOverlay:S,droppableRects:E,over:m,measureDroppableContainers:_}=om(),M=Du(pv,o),Y=S.rect!==null,w=x.useMemo(()=>s.map($=>typeof $=="object"&&"id"in $?$.id:$),[s]),P=y!=null,X=y?w.indexOf(y.id):-1,Z=m?w.indexOf(m.id):-1,V=x.useRef(w),at=!gm(w,V.current),W=Z!==-1&&X===-1||at,et=ym(g);rl(()=>{at&&P&&_(w)},[at,w,P,_]),x.useEffect(()=>{V.current=w},[w]);const it=x.useMemo(()=>({activeIndex:X,containerId:M,disabled:et,disableTransforms:W,items:w,overIndex:Z,useDragOverlay:Y,sortedRects:vm(w,E),strategy:d}),[X,M,et.draggable,et.droppable,W,w,Z,E,Y,d]);return ve.createElement(Sv.Provider,{value:it},f)}const Sm=i=>{let{id:f,items:o,activeIndex:s,overIndex:d}=i;return Bs(o,s,d).indexOf(f)},Em=i=>{let{containerId:f,isSorting:o,wasDragging:s,index:d,items:g,newIndex:y,previousItems:S,previousContainerId:E,transition:m}=i;return!m||!s||S!==g&&d===y?!1:o?!0:y!==d&&f===E},Tm={duration:200,easing:"ease"},Ev="transform",Dm=pu.Transition.toString({property:Ev,duration:0,easing:"linear"}),Am={roleDescription:"sortable"};function zm(i){let{disabled:f,index:o,node:s,rect:d}=i;const[g,y]=x.useState(null),S=x.useRef(o);return rl(()=>{if(!f&&o!==S.current&&s.current){const E=d.current;if(E){const m=ba(s.current,{ignoreTransform:!0}),_={x:E.left-m.left,y:E.top-m.top,scaleX:E.width/m.width,scaleY:E.height/m.height};(_.x||_.y)&&y(_)}}o!==S.current&&(S.current=o)},[f,o,s,d]),x.useEffect(()=>{g&&y(null)},[g]),g}function Mm(i){let{animateLayoutChanges:f=Em,attributes:o,disabled:s,data:d,getNewIndex:g=Sm,id:y,strategy:S,resizeObserverConfig:E,transition:m=Tm}=i;const{items:_,containerId:M,activeIndex:Y,disabled:w,disableTransforms:P,sortedRects:X,overIndex:Z,useDragOverlay:V,strategy:at}=x.useContext(Sv),W=Om(s,w),et=_.indexOf(y),it=x.useMemo(()=>({sortable:{containerId:M,index:et,items:_},...d}),[M,d,et,_]),$=x.useMemo(()=>_.slice(_.indexOf(y)),[_,y]),{rect:Q,node:nt,isOver:ot,setNodeRef:Rt}=hm({id:y,data:it,disabled:W.droppable,resizeObserverConfig:{updateMeasurementsFor:$,...E}}),{active:rt,activatorEvent:Mt,activeNodeRect:Yt,attributes:Ht,setNodeRef:Qt,listeners:R,isDragging:T,over:q,setActivatorNodeRef:G,transform:tt}=sm({id:y,data:it,attributes:{...Am,...o},disabled:W.draggable}),v=Zg(Rt,Qt),O=!!rt,B=O&&!P&&Gi(Y)&&Gi(Z),L=!V&&T,F=L&&B?tt:null,ct=B?F??(S??at)({rects:X,activeNodeRect:Yt,activeIndex:Y,overIndex:Z,index:et}):null,Dt=Gi(Y)&&Gi(Z)?g({id:y,items:_,activeIndex:Y,overIndex:Z}):et,mt=rt==null?void 0:rt.id,dt=x.useRef({activeId:mt,items:_,newIndex:Dt,containerId:M}),je=_!==dt.current.items,ce=f({active:rt,containerId:M,isDragging:T,isSorting:O,id:y,index:et,items:_,newIndex:dt.current.newIndex,previousItems:dt.current.items,previousContainerId:dt.current.containerId,transition:m,wasDragging:dt.current.activeId!=null}),dl=zm({disabled:!ce,index:et,node:nt,rect:Q});return x.useEffect(()=>{O&&dt.current.newIndex!==Dt&&(dt.current.newIndex=Dt),M!==dt.current.containerId&&(dt.current.containerId=M),_!==dt.current.items&&(dt.current.items=_)},[O,Dt,M,_]),x.useEffect(()=>{if(mt===dt.current.activeId)return;if(mt!=null&&dt.current.activeId==null){dt.current.activeId=mt;return}const al=setTimeout(()=>{dt.current.activeId=mt},50);return()=>clearTimeout(al)},[mt]),{active:rt,activeIndex:Y,attributes:Ht,data:it,rect:Q,index:et,newIndex:Dt,items:_,isOver:ot,isSorting:O,isDragging:T,listeners:R,node:nt,overIndex:Z,over:q,setNodeRef:v,setActivatorNodeRef:G,setDroppableNodeRef:Rt,setDraggableNodeRef:Qt,transform:dl??ct,transition:ee()};function ee(){if(dl||je&&dt.current.newIndex===et)return Dm;if(!(L&&!Ns(Mt)||!m)&&(O||ce))return pu.Transition.toString({...m,property:Ev})}}function Om(i,f){var o,s;return typeof i=="boolean"?{draggable:i,droppable:!1}:{draggable:(o=i==null?void 0:i.draggable)!=null?o:f.draggable,droppable:(s=i==null?void 0:i.droppable)!=null?s:f.droppable}}function Ji(i){if(!i)return!1;const f=i.data.current;return!!(f&&"sortable"in f&&typeof f.sortable=="object"&&"containerId"in f.sortable&&"items"in f.sortable&&"index"in f.sortable)}const xm=[pt.Down,pt.Right,pt.Up,pt.Left],Cm=(i,f)=>{let{context:{active:o,collisionRect:s,droppableRects:d,droppableContainers:g,over:y,scrollableAncestors:S}}=f;if(xm.includes(i.code)){if(i.preventDefault(),!o||!s)return;const E=[];g.getEnabled().forEach(M=>{if(!M||M!=null&&M.disabled)return;const Y=d.get(M.id);if(Y)switch(i.code){case pt.Down:s.top<Y.top&&E.push(M);break;case pt.Up:s.top>Y.top&&E.push(M);break;case pt.Left:s.left>Y.left&&E.push(M);break;case pt.Right:s.left<Y.left&&E.push(M);break}});const m=cy({collisionRect:s,droppableRects:d,droppableContainers:E});let _=uv(m,"id");if(_===(y==null?void 0:y.id)&&m.length>1&&(_=m[1].id),_!=null){const M=g.get(o.id),Y=g.get(_),w=Y?d.get(Y.id):null,P=Y==null?void 0:Y.node.current;if(P&&w&&M&&Y){const Z=ki(P).some(($,Q)=>S[Q]!==$),V=Tv(M,Y),at=Rm(M,Y),W=Z||!V?{x:0,y:0}:{x:at?s.width-w.width:0,y:at?s.height-w.height:0},et={x:w.left,y:w.top};return W.x&&W.y?et:bu(et,W)}}}};function Tv(i,f){return!Ji(i)||!Ji(f)?!1:i.data.current.sortable.containerId===f.data.current.sortable.containerId}function Rm(i,f){return!Ji(i)||!Ji(f)||!Tv(i,f)?!1:i.data.current.sortable.index<f.data.current.sortable.index}function Nm(i){return i.normalize("NFC").replace(/[\s\u3000]+/g,"-").replace(/[^\p{L}\p{N}-]+/gu,"").replace(/^-+|-+$/g,"")||"untitled-task"}function Ms(i){return i?new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(i)):"-"}function du(i){return{originalPath:i.path,path:i.path,title:i.frontmatter.title,priority:i.frontmatter.priority,status:i.frontmatter.status,content:i.content,updatedAt:i.frontmatter.updatedAt,createdAt:i.frontmatter.createdAt,extraFrontmatter:i.extraFrontmatter}}function _m({task:i,selected:f,onSelect:o}){const{attributes:s,listeners:d,setNodeRef:g,transform:y,transition:S}=Mm({id:i.path}),E={transform:pu.Transform.toString(y),transition:S};return H.jsxs("button",{ref:g,style:E,type:"button",className:`task-row${f?" task-row-selected":""}`,onClick:()=>o(i.path),...s,...d,children:[H.jsxs("span",{className:"task-row-badges",children:[H.jsx("span",{className:`badge badge-${i.frontmatter.priority.toLowerCase()}`,children:i.frontmatter.priority}),H.jsx("span",{className:`badge badge-${i.frontmatter.status.toLowerCase()}`,children:i.frontmatter.status})]}),H.jsx("strong",{children:i.frontmatter.title}),H.jsx("small",{children:i.path}),H.jsxs("small",{children:["Updated ",Ms(i.frontmatter.updatedAt)]})]})}async function un(i,f){const o=new Headers(f==null?void 0:f.headers);(f==null?void 0:f.body)!==void 0&&!o.has("Content-Type")&&o.set("Content-Type","application/json");const s=await fetch(i,{headers:o,...f});if(!s.ok){const d=await s.json().catch(()=>null);throw new Error((d==null?void 0:d.error)??`Request failed: ${s.status}`)}if(s.status!==204)return await s.json()}function Um({taskDirs:i,ignorePaths:f,busy:o,onSave:s,onClose:d}){const[g,y]=x.useState(i),[S,E]=x.useState(f.length>0?f:[""]);function m(X,Z){const V=[...g];V[X]=Z,y(V)}function _(){y([...g,""])}function M(X){y(g.filter((Z,V)=>V!==X))}function Y(X,Z){const V=[...S];V[X]=Z,E(V)}function w(){E([...S,""])}function P(X){E(S.filter((Z,V)=>V!==X))}return H.jsx("div",{className:"settings-overlay",onClick:d,children:H.jsxs("div",{className:"settings-modal",onClick:X=>X.stopPropagation(),children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:"Settings"}),H.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Close"})]}),H.jsxs("div",{className:"settings-body",children:[H.jsxs("label",{children:[H.jsx("span",{className:"settings-label",children:"Task directories"}),H.jsx("small",{className:"settings-hint",children:"Directories to scan for .md task files (relative to root)"})]}),H.jsx("div",{className:"settings-dir-list",children:g.map((X,Z)=>H.jsxs("div",{className:"settings-dir-row",children:[H.jsx("input",{value:X,onChange:V=>m(Z,V.target.value),placeholder:"e.g. tasks"}),H.jsx("button",{type:"button",className:"ghost-button settings-remove-button",onClick:()=>M(Z),disabled:g.length<=1,title:"Remove",children:H.jsx("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})})]},Z))}),H.jsx("button",{type:"button",className:"ghost-button",onClick:_,children:"+ Add directory"}),H.jsxs("label",{children:[H.jsx("span",{className:"settings-label",children:"Ignore patterns"}),H.jsx("small",{className:"settings-hint",children:"Glob patterns for paths to exclude (e.g. __done__/**, archived/**)"})]}),H.jsx("div",{className:"settings-dir-list",children:S.map((X,Z)=>H.jsxs("div",{className:"settings-dir-row",children:[H.jsx("input",{value:X,onChange:V=>Y(Z,V.target.value),placeholder:"e.g. __done__/**"}),H.jsx("button",{type:"button",className:"ghost-button settings-remove-button",onClick:()=>P(Z),disabled:S.length<=1,title:"Remove",children:H.jsx("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z",clipRule:"evenodd"})})})]},Z))}),H.jsx("button",{type:"button",className:"ghost-button",onClick:w,children:"+ Add pattern"})]}),H.jsxs("div",{className:"form-actions",children:[H.jsx("button",{type:"button",className:"primary-button",disabled:o||g.every(X=>!X.trim()),onClick:()=>s(g.filter(X=>X.trim()),S.filter(X=>X.trim())),children:"Save"}),H.jsx("button",{type:"button",className:"ghost-button",onClick:d,children:"Cancel"})]})]})})}function jm(){const[i,f]=x.useState([]),[o,s]=x.useState([]),[d,g]=x.useState(null),[y,S]=x.useState(null),[E,m]=x.useState("Loading tasks..."),[_,M]=x.useState(!1),[Y,w]=x.useState(!1),[P,X]=x.useState(["."]),[Z,V]=x.useState([]),[at,W]=x.useState(!1),[et,it]=x.useState(!0),$=x.useMemo(()=>i.find(T=>T.path===d)??null,[d,i]),Q=x.useMemo(()=>et?i.filter(T=>T.frontmatter.status!=="DONE"):i,[i,et]),nt=ay(Xh(Hs,{activationConstraint:{distance:8}}),Xh(Us,{coordinateGetter:Cm}));async function ot(T){const q=await un("/api/tasks");f(q.tasks),s(q.errors),g(G=>{var tt;return G&&q.tasks.some(v=>v.path===G)?G:((tt=q.tasks[0])==null?void 0:tt.path)??null}),T!=null&&T.preserveDraft||S(G=>{if(G!=null&&G.originalPath){const tt=q.tasks.find(v=>v.path===G.originalPath);if(tt)return du(tt)}return null})}async function Rt(){try{const T=await un("/api/config");X(T.taskDirs),V(T.ignorePaths??[])}catch{}}async function rt(T,q){M(!0);try{const G=await un("/api/config",{method:"PUT",body:JSON.stringify({taskDirs:T,ignorePaths:q})});X(G.taskDirs),V(G.ignorePaths??[]),m("Settings saved."),await ot()}catch(G){m(G instanceof Error?G.message:"Failed to save settings.")}finally{M(!1)}}x.useEffect(()=>{Rt(),ot(),m("Tasks loaded.")},[]),x.useEffect(()=>{if(!$){y!=null&&y.originalPath||S(T=>T??null);return}S(T=>!T||T.originalPath!==$.path?du($):T)},[$]),x.useEffect(()=>{const T=new EventSource("/api/events");return T.onmessage=()=>{ot({preserveDraft:!0})},T.onerror=()=>{T.close()},()=>T.close()},[]);async function Mt(){if(y){M(!0),m("");try{if(y.originalPath){const T=await un(`/api/tasks/${encodeURIComponent(y.originalPath)}`,{method:"PATCH",body:JSON.stringify({path:y.path,title:y.title,priority:y.priority,status:y.status,content:y.content,extraFrontmatter:y.extraFrontmatter,baseUpdatedAt:y.updatedAt})});await ot(),g(T.path),S(du(T)),m("Task saved.")}else{const T=await un("/api/tasks",{method:"POST",body:JSON.stringify({path:y.path||void 0,title:y.title,priority:y.priority,status:y.status,content:y.content,extraFrontmatter:y.extraFrontmatter})});await ot(),g(T.path),S(du(T)),m("Task created.")}}catch(T){m(T instanceof Error?T.message:"Failed to save task.")}finally{M(!1)}}}async function Yt(){if(y!=null&&y.originalPath){M(!0),m("");try{await un(`/api/tasks/${encodeURIComponent(y.originalPath)}`,{method:"DELETE"}),S(null),await ot(),m("Task deleted.")}catch(T){m(T instanceof Error?T.message:"Failed to delete task.")}finally{M(!1)}}}async function Ht(T){const{active:q,over:G}=T;if(!G||q.id===G.id)return;const tt=i.findIndex(B=>B.path===q.id),v=i.findIndex(B=>B.path===G.id),O=Bs(i,tt,v);f(O);try{await un("/api/order",{method:"PUT",body:JSON.stringify({order:O.map(B=>B.path)})}),m("Task order updated.")}catch(B){m(B instanceof Error?B.message:"Failed to save order."),await ot()}}async function Qt(T,q){if(y!=null&&y.originalPath)try{const G=await un(`/api/task-fields/${encodeURIComponent(y.originalPath)}`,{method:"PATCH",body:JSON.stringify({[T]:q})});await ot(),g(G.path),S(tt=>tt&&{...tt,[T]:q,updatedAt:G.frontmatter.updatedAt})}catch(G){m(G instanceof Error?G.message:`Failed to update ${T}.`)}}const R=!!y&&(y.originalPath===null||y.path!==y.originalPath||y.title!==($==null?void 0:$.frontmatter.title)||y.content!==($==null?void 0:$.content));return H.jsxs("div",{className:"app-shell",children:[H.jsxs("header",{className:"app-header",children:[H.jsxs("div",{className:"app-header-left",children:[H.jsx("h1",{children:"Markdown Task Viewer"}),H.jsx("p",{className:"eyebrow",children:"v0"})]}),H.jsxs("div",{className:"app-header-actions",children:[H.jsx("button",{type:"button",className:"ghost-button settings-button",onClick:()=>w(!0),title:"Settings",children:H.jsx("svg",{width:"18",height:"18",viewBox:"0 0 20 20",fill:"currentColor",children:H.jsx("path",{fillRule:"evenodd",d:"M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.062 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z",clipRule:"evenodd"})})}),H.jsx("button",{type:"button",className:"primary-button",onClick:()=>{W(!1),S({originalPath:null,path:P[0]?`${P[0]}/`:"",title:"",priority:"MUST",status:"TODO",content:"",extraFrontmatter:{}})},children:"New Task"})]})]}),H.jsxs("main",{className:"layout-grid",children:[H.jsxs("section",{className:"panel",children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:"Tasks"}),H.jsxs("span",{className:"panel-header-right",children:[H.jsxs("label",{className:"filter-toggle",children:[H.jsx("input",{type:"checkbox",checked:et,onChange:()=>it(!et)}),H.jsx("span",{children:"Hide DONE"})]}),H.jsxs("span",{children:[Q.length," items"]})]})]}),H.jsxs("div",{className:"sidebar-scroll",children:[H.jsx(im,{sensors:nt,collisionDetection:iy,onDragEnd:T=>void Ht(T),children:H.jsx(pm,{items:Q.map(T=>T.path),strategy:mm,children:H.jsxs("div",{className:"task-list",children:[Q.map(T=>H.jsx(_m,{task:T,selected:T.path===d,onSelect:q=>{g(q);const G=i.find(tt=>tt.path===q);G&&S(du(G))}},T.path)),Q.length===0?H.jsx("p",{className:"empty-list",children:et?"No active tasks.":"No tasks yet. Create your first markdown task."}):null]})})}),o.length>0?H.jsxs("div",{className:"error-panel",children:[H.jsx("h3",{children:"Unreadable Markdown"}),o.map(T=>H.jsxs("p",{children:[H.jsx("strong",{children:T.path}),H.jsx("span",{children:T.message})]},T.path))]}):null]})]}),H.jsxs("section",{className:"panel editor-panel",children:[H.jsxs("div",{className:"panel-header",children:[H.jsx("h2",{children:y!=null&&y.originalPath?"Edit Task":"Task Details"}),R?H.jsx("span",{className:"dirty-state",children:"Unsaved changes"}):null]}),y?H.jsxs("div",{className:"task-form",children:[H.jsxs("div",{className:"field-row field-row-top",children:[H.jsxs("label",{children:[H.jsx("span",{children:"Priority"}),H.jsxs("select",{value:y.priority,onChange:T=>{const q=T.target.value;S({...y,priority:q}),y.originalPath&&Qt("priority",q)},children:[H.jsx("option",{value:"MUST",children:"MUST"}),H.jsx("option",{value:"WANT",children:"WANT"})]})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Status"}),H.jsxs("select",{value:y.status,onChange:T=>{const q=T.target.value;S({...y,status:q}),y.originalPath&&Qt("status",q)},children:[H.jsx("option",{value:"TODO",children:"TODO"}),H.jsx("option",{value:"WIP",children:"WIP"}),H.jsx("option",{value:"DONE",children:"DONE"})]})]})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Title"}),H.jsx("input",{value:y.title,onChange:T=>{const q=T.target.value,G={title:q};if(!at&&y.originalPath===null){const tt=P[0]||"",v=tt?`${tt}/`:"";G.path=q.trim()?`${v}/${Nm(q)}.md`:`${v}/`}S({...y,...G})},placeholder:"Write release notes",required:!0})]}),H.jsxs("label",{children:[H.jsx("span",{children:"Relative path"}),H.jsx("input",{value:y.path,onChange:T=>{W(!0),S({...y,path:T.target.value})},placeholder:"planning/release-notes.md"})]}),H.jsxs("div",{className:"meta-strip",children:[H.jsxs("span",{children:["Created ",Ms(y.createdAt)]}),H.jsxs("span",{children:["Updated ",Ms(y.updatedAt)]})]}),H.jsxs("label",{className:"editor-label",children:[H.jsx("span",{children:"Markdown body"}),H.jsx("textarea",{value:y.content,onChange:T=>S({...y,content:T.target.value}),onKeyDown:T=>{if(T.nativeEvent.isComposing)return;const q=T.currentTarget,{selectionStart:G,selectionEnd:tt,value:v}=q;if(T.key==="Tab"){T.preventDefault();const O=v.lastIndexOf(`
54
54
  `,G-1)+1,B=v.indexOf(`
55
55
  `,tt),L=B===-1?v.length:B;if(G!==tt){const k=v.slice(O,L).split(`
56
56
  `).map(Dt=>T.shiftKey?Dt.startsWith(" ")?Dt.slice(2):Dt:" "+Dt).join(`
57
57
  `),ct=v.slice(0,O)+k+v.slice(L);S({...y,content:ct}),requestAnimationFrame(()=>{q.selectionStart=O,q.selectionEnd=O+k.length})}else if(T.shiftKey){const F=v.slice(O,L);if(F.startsWith(" ")){const k=v.slice(0,O)+F.slice(2)+v.slice(L),ct=Math.max(O,G-2);S({...y,content:k}),requestAnimationFrame(()=>{q.selectionStart=q.selectionEnd=ct})}}else{const F=v.slice(0,O)+" "+v.slice(O);S({...y,content:F}),requestAnimationFrame(()=>{q.selectionStart=q.selectionEnd=G+2})}return}if(T.key==="Enter"){const O=v.lastIndexOf(`
58
58
  `,G-1)+1,B=v.slice(O,G),L=B.match(/^(\s*)([-*]|\d+\.)\s/);if(L){T.preventDefault();const[F,k,ct]=L;if(B.slice(F.length).trim()===""){const mt=v.slice(0,O)+v.slice(G);S({...y,content:mt}),requestAnimationFrame(()=>{q.selectionStart=q.selectionEnd=O})}else{const mt=/^\d+\./.test(ct)?`${parseInt(ct)+1}.`:ct,dt=`
59
- ${k}${mt} `,je=v.slice(0,G)+dt+v.slice(tt),ce=G+dt.length;S({...y,content:je}),requestAnimationFrame(()=>{q.selectionStart=q.selectionEnd=ce})}}}},placeholder:"# Notes"})]}),H.jsxs("div",{className:"form-actions",children:[H.jsx("button",{type:"button",className:"primary-button",disabled:_,onClick:()=>void Mt(),children:y.originalPath?"Save Task":"Create Task"}),y.originalPath?H.jsx("button",{type:"button",className:"danger-button",disabled:_,onClick:()=>void Yt(),children:"Delete"}):H.jsx("button",{type:"button",className:"ghost-button",onClick:()=>S(null),children:"Cancel"})]}),E?H.jsx("p",{className:"notice",children:E}):null]}):H.jsx("div",{className:"empty-editor",children:H.jsx("p",{children:"Select a task to edit it, or create a new one."})})]})]}),Y?H.jsx(_m,{taskDirs:P,ignorePaths:Z,busy:_,onSave:(T,q)=>{rt(T,q),w(!1)},onClose:()=>w(!1)}):null]})}Qg.createRoot(document.getElementById("root")).render(H.jsx(ve.StrictMode,{children:H.jsx(Um,{})}));
59
+ ${k}${mt} `,je=v.slice(0,G)+dt+v.slice(tt),ce=G+dt.length;S({...y,content:je}),requestAnimationFrame(()=>{q.selectionStart=q.selectionEnd=ce})}}}},placeholder:"# Notes"})]}),H.jsxs("div",{className:"form-actions",children:[H.jsx("button",{type:"button",className:"primary-button",disabled:_,onClick:()=>void Mt(),children:y.originalPath?"Save Task":"Create Task"}),y.originalPath?H.jsx("button",{type:"button",className:"danger-button",disabled:_,onClick:()=>void Yt(),children:"Delete"}):H.jsx("button",{type:"button",className:"ghost-button",onClick:()=>S(null),children:"Cancel"})]}),E?H.jsx("p",{className:"notice",children:E}):null]}):H.jsx("div",{className:"empty-editor",children:H.jsx("p",{children:"Select a task to edit it, or create a new one."})})]})]}),Y?H.jsx(Um,{taskDirs:P,ignorePaths:Z,busy:_,onSave:(T,q)=>{rt(T,q),w(!1)},onClose:()=>w(!1)}):null]})}Qg.createRoot(document.getElementById("root")).render(H.jsx(ve.StrictMode,{children:H.jsx(jm,{})}));
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Markdown Task Viewer</title>
7
- <script type="module" crossorigin src="/assets/index-DThcqnLQ.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-1KFVs4-d.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-D8W_VwBM.css">
9
9
  </head>
10
10
  <body>
package/dist/server.js CHANGED
@@ -14,6 +14,12 @@ import { promises as fs } from "fs";
14
14
  // src/types.ts
15
15
  var CONFIG_FILE_NAME = ".md-task-viewer.json";
16
16
 
17
+ // src/slugify.ts
18
+ function slugify(value) {
19
+ const slug = value.normalize("NFC").replace(/[\s\u3000]+/g, "-").replace(/[^\p{L}\p{N}-]+/gu, "").replace(/^-+|-+$/g, "");
20
+ return slug || "untitled-task";
21
+ }
22
+
17
23
  // src/taskStore.ts
18
24
  var MARKDOWN_EXTENSIONS = /* @__PURE__ */ new Set([".md", ".markdown"]);
19
25
  var REQUIRED_PRIORITY = ["MUST", "WANT"];
@@ -38,10 +44,6 @@ function ensureMarkdownExtension(filePath) {
38
44
  function asUtcISOString(date) {
39
45
  return date.toISOString();
40
46
  }
41
- function slugify(value) {
42
- const slug = value.toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
43
- return slug || "untitled-task";
44
- }
45
47
  function buildDefaults(filePath, stats) {
46
48
  const basename = path.basename(filePath, path.extname(filePath));
47
49
  const title = basename.replace(/[-_]+/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/taskStore.ts","../src/types.ts"],"sourcesContent":["import Fastify, { type FastifyInstance } from \"fastify\";\nimport fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ConflictError,\n ValidationError,\n createTask,\n deleteTask,\n listTasks,\n parseOrderPayload,\n patchTaskFields,\n readConfig,\n saveConfig,\n saveOrder,\n updateTask\n} from \"./taskStore.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CreateServerOptions {\n rootDir: string;\n clientDir?: string | null;\n}\n\nfunction resolveClientDir(explicitClientDir?: string | null): string | null {\n if (explicitClientDir === null) {\n return null;\n }\n if (explicitClientDir) {\n return explicitClientDir;\n }\n return path.resolve(__dirname, \"client\");\n}\n\nfunction sendJsonError(reply: { code: (statusCode: number) => { send: (payload: unknown) => void } }, error: unknown): void {\n if (error instanceof ValidationError) {\n reply.code(400).send({ error: error.message });\n return;\n }\n if (error instanceof ConflictError) {\n reply.code(409).send({ error: error.message });\n return;\n }\n reply.code(500).send({ error: error instanceof Error ? error.message : \"Internal server error\" });\n}\n\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n const listeners = new Set<{ send: (payload: string) => void; close: () => void }>();\n const clientDir = resolveClientDir(options.clientDir);\n\n app.addHook(\"onClose\", async () => {\n for (const listener of listeners) {\n listener.close();\n }\n });\n\n app.get(\"/api/tasks\", async () => listTasks(options.rootDir));\n\n app.post(\"/api/tasks\", async (request, reply) => {\n try {\n const task = await createTask(options.rootDir, (request.body ?? {}) as never);\n return reply.code(201).send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await updateTask(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.delete(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n await deleteTask(options.rootDir, currentPath);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/task-fields/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await patchTaskFields(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.put(\"/api/order\", async (request, reply) => {\n try {\n const order = parseOrderPayload((request.body as { order?: unknown } | null)?.order ?? []);\n await saveOrder(options.rootDir, order);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/config\", async () => {\n try {\n return await readConfig(options.rootDir);\n } catch (error) {\n return { version: 1, taskDirs: [\".\"], order: [] };\n }\n });\n\n app.put(\"/api/config\", async (request, reply) => {\n try {\n const body = request.body as { taskDirs?: unknown; ignorePaths?: unknown } | null;\n const taskDirs = body?.taskDirs;\n if (!Array.isArray(taskDirs) || taskDirs.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"taskDirs must be an array of strings.\");\n }\n let ignorePaths: string[] | undefined;\n if (body?.ignorePaths !== undefined) {\n if (!Array.isArray(body.ignorePaths) || body.ignorePaths.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"ignorePaths must be an array of strings.\");\n }\n ignorePaths = body.ignorePaths as string[];\n }\n const config = await saveConfig(options.rootDir, taskDirs as string[], ignorePaths);\n return reply.send(config);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/events\", async (_request, reply) => {\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\"\n });\n reply.raw.write(\"\\n\");\n\n const listener = {\n send(payload: string) {\n reply.raw.write(`data: ${payload}\\n\\n`);\n },\n close() {\n reply.raw.end();\n }\n };\n\n listeners.add(listener);\n reply.raw.on(\"close\", () => {\n listeners.delete(listener);\n });\n\n return reply.hijack();\n });\n\n const watcher = chokidar.watch(options.rootDir, {\n ignoreInitial: true,\n ignored: (watchPath) => watchPath.includes(`${path.sep}.git`) || watchPath.includes(`${path.sep}node_modules`)\n });\n\n watcher.on(\"all\", (eventName, changedPath) => {\n const isMarkdown = changedPath.endsWith(\".md\") || changedPath.endsWith(\".markdown\");\n const isConfigFile = path.basename(changedPath) === \".md-task-viewer.json\";\n if (!isMarkdown && !isConfigFile) {\n return;\n }\n\n const payload = JSON.stringify({\n type: \"tasks-changed\",\n eventName,\n path: path.relative(options.rootDir, changedPath)\n });\n\n for (const listener of listeners) {\n listener.send(payload);\n }\n });\n\n app.addHook(\"onClose\", async () => {\n await watcher.close();\n });\n\n if (clientDir) {\n await app.register(fastifyStatic, {\n root: clientDir,\n prefix: \"/\"\n });\n\n app.setNotFoundHandler(async (request, reply) => {\n if (request.raw.url?.startsWith(\"/api/\")) {\n return reply.code(404).send({ error: \"Not found\" });\n }\n return reply.sendFile(\"index.html\");\n });\n }\n\n return app;\n}\n","import matter from \"gray-matter\";\nimport picomatch from \"picomatch\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport {\n CONFIG_FILE_NAME,\n type ConfigFile,\n type CreateTaskInput,\n type PatchTaskFieldsInput,\n type TaskFrontmatter,\n type TaskListResponse,\n type TaskParseError,\n type TaskPriority,\n type TaskRecord,\n type TaskStatus,\n type UpdateTaskInput\n} from \"./types.js\";\n\nconst MARKDOWN_EXTENSIONS = new Set([\".md\", \".markdown\"]);\nconst REQUIRED_PRIORITY: TaskPriority[] = [\"MUST\", \"WANT\"];\nconst REQUIRED_STATUS: TaskStatus[] = [\"TODO\", \"WIP\", \"DONE\"];\n\nexport class ConflictError extends Error {}\nexport class ValidationError extends Error {}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction normalizeRelativePath(candidate: string): string {\n const normalized = toPosixPath(path.posix.normalize(candidate.trim()));\n if (!normalized || normalized === \".\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"Path must stay within the workspace root.\");\n }\n\n return normalized.replace(/^\\.\\/+/, \"\");\n}\n\nfunction ensureMarkdownExtension(filePath: string): string {\n return path.posix.extname(filePath) ? filePath : `${filePath}.md`;\n}\n\nfunction asUtcISOString(date: Date): string {\n return date.toISOString();\n}\n\nfunction slugify(value: string): string {\n const slug = value\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n\n return slug || \"untitled-task\";\n}\n\nfunction buildDefaults(filePath: string, stats: { birthtime: Date; mtime: Date }): TaskFrontmatter {\n const basename = path.basename(filePath, path.extname(filePath));\n const title = basename.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n\n return {\n title,\n priority: \"WANT\",\n status: \"TODO\",\n createdAt: asUtcISOString(stats.birthtime),\n updatedAt: asUtcISOString(stats.mtime)\n };\n}\n\nfunction splitFrontmatter(data: Record<string, unknown>, statsDefaults: TaskFrontmatter): {\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n normalized: boolean;\n} {\n const extraFrontmatter: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (![\"title\", \"priority\", \"status\", \"createdAt\", \"updatedAt\"].includes(key)) {\n extraFrontmatter[key] = value;\n }\n }\n\n const title = typeof data.title === \"string\" && data.title.trim() ? data.title : statsDefaults.title;\n const priority = REQUIRED_PRIORITY.includes(data.priority as TaskPriority)\n ? (data.priority as TaskPriority)\n : statsDefaults.priority;\n const status = REQUIRED_STATUS.includes(data.status as TaskStatus)\n ? (data.status as TaskStatus)\n : statsDefaults.status;\n const createdAt =\n typeof data.createdAt === \"string\" && !Number.isNaN(Date.parse(data.createdAt))\n ? new Date(data.createdAt).toISOString()\n : statsDefaults.createdAt;\n const updatedAt =\n typeof data.updatedAt === \"string\" && !Number.isNaN(Date.parse(data.updatedAt))\n ? new Date(data.updatedAt).toISOString()\n : statsDefaults.updatedAt;\n\n const normalized =\n title !== data.title ||\n priority !== data.priority ||\n status !== data.status ||\n createdAt !== data.createdAt ||\n updatedAt !== data.updatedAt;\n\n return {\n frontmatter: { title, priority, status, createdAt, updatedAt },\n extraFrontmatter,\n normalized\n };\n}\n\nexport function serializeTask(record: TaskRecord): string {\n const data = {\n ...record.extraFrontmatter,\n title: record.frontmatter.title,\n priority: record.frontmatter.priority,\n status: record.frontmatter.status,\n createdAt: record.frontmatter.createdAt,\n updatedAt: record.frontmatter.updatedAt\n };\n\n return matter.stringify(record.content, data);\n}\n\nasync function readDirectoryRecursive(rootDir: string, currentDir: string, results: string[]): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === \".git\" || entry.name === \"node_modules\") {\n continue;\n }\n\n const absolutePath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n await readDirectoryRecursive(rootDir, absolutePath, results);\n continue;\n }\n\n if (entry.name === CONFIG_FILE_NAME) {\n continue;\n }\n\n if (!MARKDOWN_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n\n results.push(toPosixPath(path.relative(rootDir, absolutePath)));\n }\n}\n\nasync function listMarkdownFiles(rootDir: string, taskDirs: string[], ignorePaths: string[]): Promise<string[]> {\n const results: string[] = [];\n const seen = new Set<string>();\n\n const isIgnored = ignorePaths.length > 0 ? picomatch(ignorePaths) : null;\n\n for (const taskDir of taskDirs) {\n const scanDir = path.resolve(rootDir, taskDir);\n try {\n await fs.access(scanDir);\n } catch {\n continue;\n }\n const dirResults: string[] = [];\n await readDirectoryRecursive(rootDir, scanDir, dirResults);\n for (const filePath of dirResults) {\n if (!seen.has(filePath)) {\n seen.add(filePath);\n if (isIgnored && isIgnored(filePath)) {\n continue;\n }\n results.push(filePath);\n }\n }\n }\n\n return results.sort();\n}\n\nexport async function parseTask(rootDir: string, relativePath: string): Promise<TaskRecord> {\n const absolutePath = path.join(rootDir, relativePath);\n const raw = await fs.readFile(absolutePath, \"utf8\");\n const stats = await fs.stat(absolutePath);\n const parsed = matter(raw);\n const defaults = buildDefaults(relativePath, stats);\n const { frontmatter, extraFrontmatter, normalized } = splitFrontmatter(parsed.data, defaults);\n\n return {\n path: toPosixPath(relativePath),\n content: parsed.content,\n frontmatter,\n extraFrontmatter,\n raw,\n normalized\n };\n}\n\nexport async function readConfig(rootDir: string): Promise<ConfigFile> {\n const configFilePath = path.join(rootDir, CONFIG_FILE_NAME);\n\n try {\n const raw = await fs.readFile(configFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ConfigFile>;\n const taskDirs = Array.isArray(parsed.taskDirs)\n ? parsed.taskDirs.filter((item): item is string => typeof item === \"string\")\n : [\".\"];\n const ignorePaths = Array.isArray(parsed.ignorePaths)\n ? parsed.ignorePaths.filter((item): item is string => typeof item === \"string\")\n : [];\n const order = Array.isArray(parsed.order)\n ? parsed.order.filter((item): item is string => typeof item === \"string\")\n : [];\n return { version: parsed.version ?? 1, taskDirs, ignorePaths, order };\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code !== \"ENOENT\") {\n throw error;\n }\n return { version: 1, taskDirs: [\".\"], ignorePaths: [], order: [] };\n }\n}\n\nasync function reconcileOrder(rootDir: string, taskPaths: string[]): Promise<{ order: string[]; changed: boolean }> {\n const config = await readConfig(rootDir);\n const order = config.order;\n\n const known = new Set(taskPaths);\n const nextOrder = order.filter((item) => known.has(item));\n for (const taskPath of taskPaths) {\n if (!nextOrder.includes(taskPath)) {\n nextOrder.push(taskPath);\n }\n }\n\n const changed = nextOrder.length !== order.length || nextOrder.some((item, index) => item !== order[index]);\n return { order: nextOrder, changed };\n}\n\nexport async function saveOrder(rootDir: string, order: string[]): Promise<void> {\n const normalized = Array.from(\n new Set(\n order.map((item) => ensureMarkdownExtension(normalizeRelativePath(item)))\n )\n );\n const existing = await readConfig(rootDir);\n const payload: ConfigFile = { version: 1, taskDirs: existing.taskDirs, ignorePaths: existing.ignorePaths, order: normalized };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function saveConfig(rootDir: string, taskDirs: string[], ignorePaths?: string[]): Promise<ConfigFile> {\n const validated = taskDirs.map((dir) => {\n const normalized = dir.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\") || \".\";\n if (normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"taskDirs must stay within the workspace root.\");\n }\n return normalized;\n });\n if (validated.length === 0) {\n throw new ValidationError(\"taskDirs must contain at least one directory.\");\n }\n const existing = await readConfig(rootDir);\n const validatedIgnorePaths = ignorePaths ?? existing.ignorePaths;\n const payload: ConfigFile = { version: 1, taskDirs: validated, ignorePaths: validatedIgnorePaths, order: existing.order };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n return payload;\n}\n\nexport async function listTasks(rootDir: string): Promise<TaskListResponse> {\n const config = await readConfig(rootDir);\n const files = await listMarkdownFiles(rootDir, config.taskDirs, config.ignorePaths);\n const errors: TaskParseError[] = [];\n const tasks = await Promise.all(\n files.map(async (relativePath) => {\n try {\n return await parseTask(rootDir, relativePath);\n } catch (error) {\n errors.push({\n path: relativePath,\n message: error instanceof Error ? error.message : \"Unknown parse error\"\n });\n return null;\n }\n })\n );\n\n const taskRecords = tasks.filter((task): task is TaskRecord => task !== null);\n const { order, changed } = await reconcileOrder(\n rootDir,\n taskRecords.map((task) => task.path)\n );\n\n if (changed) {\n await saveOrder(rootDir, order);\n }\n\n const orderIndex = new Map(order.map((item, index) => [item, index]));\n taskRecords.sort((left, right) => {\n const leftIndex = orderIndex.get(left.path) ?? Number.MAX_SAFE_INTEGER;\n const rightIndex = orderIndex.get(right.path) ?? Number.MAX_SAFE_INTEGER;\n return leftIndex - rightIndex || left.path.localeCompare(right.path);\n });\n\n return { tasks: taskRecords, errors };\n}\n\nasync function ensureDirectoryForFile(rootDir: string, relativeFilePath: string): Promise<string> {\n const normalized = ensureMarkdownExtension(normalizeRelativePath(relativeFilePath));\n const absolutePath = path.join(rootDir, normalized);\n const directory = path.dirname(absolutePath);\n await fs.mkdir(directory, { recursive: true });\n return normalized;\n}\n\nasync function nextAvailablePath(rootDir: string, directory: string, title: string): Promise<string> {\n const safeDirectory = directory ? normalizeRelativePath(directory) : \"\";\n const slug = slugify(title);\n const base = safeDirectory ? `${safeDirectory}/${slug}` : slug;\n\n let attempt = 0;\n while (true) {\n const candidate = ensureMarkdownExtension(attempt === 0 ? base : `${base}-${attempt + 1}`);\n try {\n await fs.access(path.join(rootDir, candidate));\n attempt += 1;\n } catch {\n return candidate;\n }\n }\n}\n\nexport async function createTask(rootDir: string, input: CreateTaskInput): Promise<TaskRecord> {\n if (!input.title.trim()) {\n throw new ValidationError(\"Title is required.\");\n }\n\n const now = asUtcISOString(new Date());\n const relativePath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : await nextAvailablePath(rootDir, input.directory ?? \"\", input.title);\n const absolutePath = path.join(rootDir, relativePath);\n\n try {\n await fs.access(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at that path.\");\n }\n }\n\n const record: TaskRecord = {\n path: relativePath,\n content: input.content ?? \"\",\n raw: \"\",\n normalized: false,\n extraFrontmatter: input.extraFrontmatter ?? {},\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority ?? \"MUST\",\n status: input.status ?? \"TODO\",\n createdAt: now,\n updatedAt: now\n }\n };\n\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, serializeTask(record), \"utf8\");\n\n const current = await listTasks(rootDir);\n await saveOrder(rootDir, current.tasks.map((task) => task.path).concat(relativePath));\n return parseTask(rootDir, relativePath);\n}\n\nexport async function updateTask(rootDir: string, currentPath: string, input: UpdateTaskInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n if (input.baseUpdatedAt && existing.frontmatter.updatedAt !== input.baseUpdatedAt) {\n throw new ConflictError(\"The task changed on disk. Reload before saving.\");\n }\n\n const nextPath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : normalizedCurrentPath;\n const absoluteNextPath = path.join(rootDir, nextPath);\n\n if (nextPath !== normalizedCurrentPath) {\n try {\n await fs.access(absoluteNextPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at the target path.\");\n }\n }\n }\n\n const record: TaskRecord = {\n path: nextPath,\n raw: existing.raw,\n normalized: false,\n content: input.content,\n extraFrontmatter: input.extraFrontmatter ?? existing.extraFrontmatter,\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority,\n status: input.status,\n createdAt: existing.frontmatter.createdAt,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n if (nextPath !== normalizedCurrentPath) {\n await fs.mkdir(path.dirname(absoluteNextPath), { recursive: true });\n await fs.rename(absoluteCurrentPath, absoluteNextPath);\n }\n\n const current = await listTasks(rootDir);\n const updatedOrder = current.tasks.map((task) => task.path);\n await saveOrder(rootDir, updatedOrder);\n return parseTask(rootDir, nextPath);\n}\n\nexport async function deleteTask(rootDir: string, relativePath: string): Promise<void> {\n const normalizedPath = ensureMarkdownExtension(normalizeRelativePath(relativePath));\n const absolutePath = path.join(rootDir, normalizedPath);\n\n try {\n await fs.unlink(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const current = await listTasks(rootDir);\n await saveOrder(\n rootDir,\n current.tasks.map((task) => task.path)\n );\n}\n\nexport async function patchTaskFields(rootDir: string, currentPath: string, input: PatchTaskFieldsInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const priority = input.priority && REQUIRED_PRIORITY.includes(input.priority) ? input.priority : existing.frontmatter.priority;\n const status = input.status && REQUIRED_STATUS.includes(input.status) ? input.status : existing.frontmatter.status;\n\n if (priority === existing.frontmatter.priority && status === existing.frontmatter.status) {\n return existing;\n }\n\n const record: TaskRecord = {\n path: normalizedCurrentPath,\n raw: existing.raw,\n normalized: false,\n content: existing.content,\n extraFrontmatter: existing.extraFrontmatter,\n frontmatter: {\n ...existing.frontmatter,\n priority,\n status,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n return parseTask(rootDir, normalizedCurrentPath);\n}\n\nexport function parseOrderPayload(input: unknown): string[] {\n if (!Array.isArray(input)) {\n throw new ValidationError(\"Order payload must be an array.\");\n }\n\n return input.map((item) => ensureMarkdownExtension(normalizeRelativePath(String(item))));\n}\n\nexport async function readOrder(rootDir: string): Promise<ConfigFile> {\n const config = await readConfig(rootDir);\n const { order } = await reconcileOrder(\n rootDir,\n (await listTasks(rootDir)).tasks.map((task) => task.path)\n );\n return { version: 1, taskDirs: config.taskDirs, ignorePaths: config.ignorePaths, order };\n}\n\nexport const taskStoreUtils = {\n slugify,\n normalizeRelativePath,\n ensureMarkdownExtension,\n splitFrontmatter,\n buildDefaults\n};\n","export const CONFIG_FILE_NAME = \".md-task-viewer.json\";\n\nexport type TaskPriority = \"MUST\" | \"WANT\";\nexport type TaskStatus = \"TODO\" | \"WIP\" | \"DONE\";\n\nexport interface TaskFrontmatter {\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n createdAt: string;\n updatedAt: string;\n [key: string]: unknown;\n}\n\nexport interface TaskRecord {\n path: string;\n content: string;\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n raw: string;\n normalized: boolean;\n}\n\nexport interface TaskParseError {\n path: string;\n message: string;\n}\n\nexport interface TaskListResponse {\n tasks: TaskRecord[];\n errors: TaskParseError[];\n}\n\nexport interface CreateTaskInput {\n title: string;\n priority?: TaskPriority;\n status?: TaskStatus;\n content?: string;\n directory?: string;\n path?: string;\n extraFrontmatter?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskInput {\n path?: string;\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n content: string;\n extraFrontmatter?: Record<string, unknown>;\n baseUpdatedAt?: string;\n}\n\nexport interface PatchTaskFieldsInput {\n priority?: TaskPriority;\n status?: TaskStatus;\n}\n\nexport interface ConfigFile {\n version: number;\n taskDirs: string[];\n ignorePaths: string[];\n order: string[];\n}\n"],"mappings":"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","names":["path","path"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/taskStore.ts","../src/types.ts","../src/slugify.ts"],"sourcesContent":["import Fastify, { type FastifyInstance } from \"fastify\";\nimport fastifyStatic from \"@fastify/static\";\nimport chokidar from \"chokidar\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n ConflictError,\n ValidationError,\n createTask,\n deleteTask,\n listTasks,\n parseOrderPayload,\n patchTaskFields,\n readConfig,\n saveConfig,\n saveOrder,\n updateTask\n} from \"./taskStore.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface CreateServerOptions {\n rootDir: string;\n clientDir?: string | null;\n}\n\nfunction resolveClientDir(explicitClientDir?: string | null): string | null {\n if (explicitClientDir === null) {\n return null;\n }\n if (explicitClientDir) {\n return explicitClientDir;\n }\n return path.resolve(__dirname, \"client\");\n}\n\nfunction sendJsonError(reply: { code: (statusCode: number) => { send: (payload: unknown) => void } }, error: unknown): void {\n if (error instanceof ValidationError) {\n reply.code(400).send({ error: error.message });\n return;\n }\n if (error instanceof ConflictError) {\n reply.code(409).send({ error: error.message });\n return;\n }\n reply.code(500).send({ error: error instanceof Error ? error.message : \"Internal server error\" });\n}\n\nexport async function createServer(options: CreateServerOptions): Promise<FastifyInstance> {\n const app = Fastify({ logger: false });\n const listeners = new Set<{ send: (payload: string) => void; close: () => void }>();\n const clientDir = resolveClientDir(options.clientDir);\n\n app.addHook(\"onClose\", async () => {\n for (const listener of listeners) {\n listener.close();\n }\n });\n\n app.get(\"/api/tasks\", async () => listTasks(options.rootDir));\n\n app.post(\"/api/tasks\", async (request, reply) => {\n try {\n const task = await createTask(options.rootDir, (request.body ?? {}) as never);\n return reply.code(201).send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await updateTask(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.delete(\"/api/tasks/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n await deleteTask(options.rootDir, currentPath);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.patch(\"/api/task-fields/*\", async (request, reply) => {\n const currentPath = decodeURIComponent((request.params as { \"*\": string })[\"*\"] ?? \"\");\n try {\n const task = await patchTaskFields(options.rootDir, currentPath, (request.body ?? {}) as never);\n return reply.send(task);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.put(\"/api/order\", async (request, reply) => {\n try {\n const order = parseOrderPayload((request.body as { order?: unknown } | null)?.order ?? []);\n await saveOrder(options.rootDir, order);\n return reply.code(204).send();\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/config\", async () => {\n try {\n return await readConfig(options.rootDir);\n } catch (error) {\n return { version: 1, taskDirs: [\".\"], order: [] };\n }\n });\n\n app.put(\"/api/config\", async (request, reply) => {\n try {\n const body = request.body as { taskDirs?: unknown; ignorePaths?: unknown } | null;\n const taskDirs = body?.taskDirs;\n if (!Array.isArray(taskDirs) || taskDirs.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"taskDirs must be an array of strings.\");\n }\n let ignorePaths: string[] | undefined;\n if (body?.ignorePaths !== undefined) {\n if (!Array.isArray(body.ignorePaths) || body.ignorePaths.some((item) => typeof item !== \"string\")) {\n throw new ValidationError(\"ignorePaths must be an array of strings.\");\n }\n ignorePaths = body.ignorePaths as string[];\n }\n const config = await saveConfig(options.rootDir, taskDirs as string[], ignorePaths);\n return reply.send(config);\n } catch (error) {\n sendJsonError(reply, error);\n }\n });\n\n app.get(\"/api/events\", async (_request, reply) => {\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\"\n });\n reply.raw.write(\"\\n\");\n\n const listener = {\n send(payload: string) {\n reply.raw.write(`data: ${payload}\\n\\n`);\n },\n close() {\n reply.raw.end();\n }\n };\n\n listeners.add(listener);\n reply.raw.on(\"close\", () => {\n listeners.delete(listener);\n });\n\n return reply.hijack();\n });\n\n const watcher = chokidar.watch(options.rootDir, {\n ignoreInitial: true,\n ignored: (watchPath) => watchPath.includes(`${path.sep}.git`) || watchPath.includes(`${path.sep}node_modules`)\n });\n\n watcher.on(\"all\", (eventName, changedPath) => {\n const isMarkdown = changedPath.endsWith(\".md\") || changedPath.endsWith(\".markdown\");\n const isConfigFile = path.basename(changedPath) === \".md-task-viewer.json\";\n if (!isMarkdown && !isConfigFile) {\n return;\n }\n\n const payload = JSON.stringify({\n type: \"tasks-changed\",\n eventName,\n path: path.relative(options.rootDir, changedPath)\n });\n\n for (const listener of listeners) {\n listener.send(payload);\n }\n });\n\n app.addHook(\"onClose\", async () => {\n await watcher.close();\n });\n\n if (clientDir) {\n await app.register(fastifyStatic, {\n root: clientDir,\n prefix: \"/\"\n });\n\n app.setNotFoundHandler(async (request, reply) => {\n if (request.raw.url?.startsWith(\"/api/\")) {\n return reply.code(404).send({ error: \"Not found\" });\n }\n return reply.sendFile(\"index.html\");\n });\n }\n\n return app;\n}\n","import matter from \"gray-matter\";\nimport picomatch from \"picomatch\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport {\n CONFIG_FILE_NAME,\n type ConfigFile,\n type CreateTaskInput,\n type PatchTaskFieldsInput,\n type TaskFrontmatter,\n type TaskListResponse,\n type TaskParseError,\n type TaskPriority,\n type TaskRecord,\n type TaskStatus,\n type UpdateTaskInput\n} from \"./types.js\";\nimport { slugify } from \"./slugify.js\";\n\nconst MARKDOWN_EXTENSIONS = new Set([\".md\", \".markdown\"]);\nconst REQUIRED_PRIORITY: TaskPriority[] = [\"MUST\", \"WANT\"];\nconst REQUIRED_STATUS: TaskStatus[] = [\"TODO\", \"WIP\", \"DONE\"];\n\nexport class ConflictError extends Error {}\nexport class ValidationError extends Error {}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nfunction normalizeRelativePath(candidate: string): string {\n const normalized = toPosixPath(path.posix.normalize(candidate.trim()));\n if (!normalized || normalized === \".\" || normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"Path must stay within the workspace root.\");\n }\n\n return normalized.replace(/^\\.\\/+/, \"\");\n}\n\nfunction ensureMarkdownExtension(filePath: string): string {\n return path.posix.extname(filePath) ? filePath : `${filePath}.md`;\n}\n\nfunction asUtcISOString(date: Date): string {\n return date.toISOString();\n}\n\nfunction buildDefaults(filePath: string, stats: { birthtime: Date; mtime: Date }): TaskFrontmatter {\n const basename = path.basename(filePath, path.extname(filePath));\n const title = basename.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n\n return {\n title,\n priority: \"WANT\",\n status: \"TODO\",\n createdAt: asUtcISOString(stats.birthtime),\n updatedAt: asUtcISOString(stats.mtime)\n };\n}\n\nfunction splitFrontmatter(data: Record<string, unknown>, statsDefaults: TaskFrontmatter): {\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n normalized: boolean;\n} {\n const extraFrontmatter: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (![\"title\", \"priority\", \"status\", \"createdAt\", \"updatedAt\"].includes(key)) {\n extraFrontmatter[key] = value;\n }\n }\n\n const title = typeof data.title === \"string\" && data.title.trim() ? data.title : statsDefaults.title;\n const priority = REQUIRED_PRIORITY.includes(data.priority as TaskPriority)\n ? (data.priority as TaskPriority)\n : statsDefaults.priority;\n const status = REQUIRED_STATUS.includes(data.status as TaskStatus)\n ? (data.status as TaskStatus)\n : statsDefaults.status;\n const createdAt =\n typeof data.createdAt === \"string\" && !Number.isNaN(Date.parse(data.createdAt))\n ? new Date(data.createdAt).toISOString()\n : statsDefaults.createdAt;\n const updatedAt =\n typeof data.updatedAt === \"string\" && !Number.isNaN(Date.parse(data.updatedAt))\n ? new Date(data.updatedAt).toISOString()\n : statsDefaults.updatedAt;\n\n const normalized =\n title !== data.title ||\n priority !== data.priority ||\n status !== data.status ||\n createdAt !== data.createdAt ||\n updatedAt !== data.updatedAt;\n\n return {\n frontmatter: { title, priority, status, createdAt, updatedAt },\n extraFrontmatter,\n normalized\n };\n}\n\nexport function serializeTask(record: TaskRecord): string {\n const data = {\n ...record.extraFrontmatter,\n title: record.frontmatter.title,\n priority: record.frontmatter.priority,\n status: record.frontmatter.status,\n createdAt: record.frontmatter.createdAt,\n updatedAt: record.frontmatter.updatedAt\n };\n\n return matter.stringify(record.content, data);\n}\n\nasync function readDirectoryRecursive(rootDir: string, currentDir: string, results: string[]): Promise<void> {\n const entries = await fs.readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === \".git\" || entry.name === \"node_modules\") {\n continue;\n }\n\n const absolutePath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n await readDirectoryRecursive(rootDir, absolutePath, results);\n continue;\n }\n\n if (entry.name === CONFIG_FILE_NAME) {\n continue;\n }\n\n if (!MARKDOWN_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n\n results.push(toPosixPath(path.relative(rootDir, absolutePath)));\n }\n}\n\nasync function listMarkdownFiles(rootDir: string, taskDirs: string[], ignorePaths: string[]): Promise<string[]> {\n const results: string[] = [];\n const seen = new Set<string>();\n\n const isIgnored = ignorePaths.length > 0 ? picomatch(ignorePaths) : null;\n\n for (const taskDir of taskDirs) {\n const scanDir = path.resolve(rootDir, taskDir);\n try {\n await fs.access(scanDir);\n } catch {\n continue;\n }\n const dirResults: string[] = [];\n await readDirectoryRecursive(rootDir, scanDir, dirResults);\n for (const filePath of dirResults) {\n if (!seen.has(filePath)) {\n seen.add(filePath);\n if (isIgnored && isIgnored(filePath)) {\n continue;\n }\n results.push(filePath);\n }\n }\n }\n\n return results.sort();\n}\n\nexport async function parseTask(rootDir: string, relativePath: string): Promise<TaskRecord> {\n const absolutePath = path.join(rootDir, relativePath);\n const raw = await fs.readFile(absolutePath, \"utf8\");\n const stats = await fs.stat(absolutePath);\n const parsed = matter(raw);\n const defaults = buildDefaults(relativePath, stats);\n const { frontmatter, extraFrontmatter, normalized } = splitFrontmatter(parsed.data, defaults);\n\n return {\n path: toPosixPath(relativePath),\n content: parsed.content,\n frontmatter,\n extraFrontmatter,\n raw,\n normalized\n };\n}\n\nexport async function readConfig(rootDir: string): Promise<ConfigFile> {\n const configFilePath = path.join(rootDir, CONFIG_FILE_NAME);\n\n try {\n const raw = await fs.readFile(configFilePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ConfigFile>;\n const taskDirs = Array.isArray(parsed.taskDirs)\n ? parsed.taskDirs.filter((item): item is string => typeof item === \"string\")\n : [\".\"];\n const ignorePaths = Array.isArray(parsed.ignorePaths)\n ? parsed.ignorePaths.filter((item): item is string => typeof item === \"string\")\n : [];\n const order = Array.isArray(parsed.order)\n ? parsed.order.filter((item): item is string => typeof item === \"string\")\n : [];\n return { version: parsed.version ?? 1, taskDirs, ignorePaths, order };\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code !== \"ENOENT\") {\n throw error;\n }\n return { version: 1, taskDirs: [\".\"], ignorePaths: [], order: [] };\n }\n}\n\nasync function reconcileOrder(rootDir: string, taskPaths: string[]): Promise<{ order: string[]; changed: boolean }> {\n const config = await readConfig(rootDir);\n const order = config.order;\n\n const known = new Set(taskPaths);\n const nextOrder = order.filter((item) => known.has(item));\n for (const taskPath of taskPaths) {\n if (!nextOrder.includes(taskPath)) {\n nextOrder.push(taskPath);\n }\n }\n\n const changed = nextOrder.length !== order.length || nextOrder.some((item, index) => item !== order[index]);\n return { order: nextOrder, changed };\n}\n\nexport async function saveOrder(rootDir: string, order: string[]): Promise<void> {\n const normalized = Array.from(\n new Set(\n order.map((item) => ensureMarkdownExtension(normalizeRelativePath(item)))\n )\n );\n const existing = await readConfig(rootDir);\n const payload: ConfigFile = { version: 1, taskDirs: existing.taskDirs, ignorePaths: existing.ignorePaths, order: normalized };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nexport async function saveConfig(rootDir: string, taskDirs: string[], ignorePaths?: string[]): Promise<ConfigFile> {\n const validated = taskDirs.map((dir) => {\n const normalized = dir.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\") || \".\";\n if (normalized.startsWith(\"../\") || normalized.includes(\"/../\")) {\n throw new ValidationError(\"taskDirs must stay within the workspace root.\");\n }\n return normalized;\n });\n if (validated.length === 0) {\n throw new ValidationError(\"taskDirs must contain at least one directory.\");\n }\n const existing = await readConfig(rootDir);\n const validatedIgnorePaths = ignorePaths ?? existing.ignorePaths;\n const payload: ConfigFile = { version: 1, taskDirs: validated, ignorePaths: validatedIgnorePaths, order: existing.order };\n await fs.writeFile(path.join(rootDir, CONFIG_FILE_NAME), `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n return payload;\n}\n\nexport async function listTasks(rootDir: string): Promise<TaskListResponse> {\n const config = await readConfig(rootDir);\n const files = await listMarkdownFiles(rootDir, config.taskDirs, config.ignorePaths);\n const errors: TaskParseError[] = [];\n const tasks = await Promise.all(\n files.map(async (relativePath) => {\n try {\n return await parseTask(rootDir, relativePath);\n } catch (error) {\n errors.push({\n path: relativePath,\n message: error instanceof Error ? error.message : \"Unknown parse error\"\n });\n return null;\n }\n })\n );\n\n const taskRecords = tasks.filter((task): task is TaskRecord => task !== null);\n const { order, changed } = await reconcileOrder(\n rootDir,\n taskRecords.map((task) => task.path)\n );\n\n if (changed) {\n await saveOrder(rootDir, order);\n }\n\n const orderIndex = new Map(order.map((item, index) => [item, index]));\n taskRecords.sort((left, right) => {\n const leftIndex = orderIndex.get(left.path) ?? Number.MAX_SAFE_INTEGER;\n const rightIndex = orderIndex.get(right.path) ?? Number.MAX_SAFE_INTEGER;\n return leftIndex - rightIndex || left.path.localeCompare(right.path);\n });\n\n return { tasks: taskRecords, errors };\n}\n\nasync function ensureDirectoryForFile(rootDir: string, relativeFilePath: string): Promise<string> {\n const normalized = ensureMarkdownExtension(normalizeRelativePath(relativeFilePath));\n const absolutePath = path.join(rootDir, normalized);\n const directory = path.dirname(absolutePath);\n await fs.mkdir(directory, { recursive: true });\n return normalized;\n}\n\nasync function nextAvailablePath(rootDir: string, directory: string, title: string): Promise<string> {\n const safeDirectory = directory ? normalizeRelativePath(directory) : \"\";\n const slug = slugify(title);\n const base = safeDirectory ? `${safeDirectory}/${slug}` : slug;\n\n let attempt = 0;\n while (true) {\n const candidate = ensureMarkdownExtension(attempt === 0 ? base : `${base}-${attempt + 1}`);\n try {\n await fs.access(path.join(rootDir, candidate));\n attempt += 1;\n } catch {\n return candidate;\n }\n }\n}\n\nexport async function createTask(rootDir: string, input: CreateTaskInput): Promise<TaskRecord> {\n if (!input.title.trim()) {\n throw new ValidationError(\"Title is required.\");\n }\n\n const now = asUtcISOString(new Date());\n const relativePath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : await nextAvailablePath(rootDir, input.directory ?? \"\", input.title);\n const absolutePath = path.join(rootDir, relativePath);\n\n try {\n await fs.access(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at that path.\");\n }\n }\n\n const record: TaskRecord = {\n path: relativePath,\n content: input.content ?? \"\",\n raw: \"\",\n normalized: false,\n extraFrontmatter: input.extraFrontmatter ?? {},\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority ?? \"MUST\",\n status: input.status ?? \"TODO\",\n createdAt: now,\n updatedAt: now\n }\n };\n\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, serializeTask(record), \"utf8\");\n\n const current = await listTasks(rootDir);\n await saveOrder(rootDir, current.tasks.map((task) => task.path).concat(relativePath));\n return parseTask(rootDir, relativePath);\n}\n\nexport async function updateTask(rootDir: string, currentPath: string, input: UpdateTaskInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n if (input.baseUpdatedAt && existing.frontmatter.updatedAt !== input.baseUpdatedAt) {\n throw new ConflictError(\"The task changed on disk. Reload before saving.\");\n }\n\n const nextPath = input.path?.trim()\n ? await ensureDirectoryForFile(rootDir, input.path)\n : normalizedCurrentPath;\n const absoluteNextPath = path.join(rootDir, nextPath);\n\n if (nextPath !== normalizedCurrentPath) {\n try {\n await fs.access(absoluteNextPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n // The target path is available.\n } else if (maybeError.code) {\n throw error;\n } else {\n throw new ValidationError(\"A task already exists at the target path.\");\n }\n }\n }\n\n const record: TaskRecord = {\n path: nextPath,\n raw: existing.raw,\n normalized: false,\n content: input.content,\n extraFrontmatter: input.extraFrontmatter ?? existing.extraFrontmatter,\n frontmatter: {\n title: input.title.trim(),\n priority: input.priority,\n status: input.status,\n createdAt: existing.frontmatter.createdAt,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n if (nextPath !== normalizedCurrentPath) {\n await fs.mkdir(path.dirname(absoluteNextPath), { recursive: true });\n await fs.rename(absoluteCurrentPath, absoluteNextPath);\n }\n\n const current = await listTasks(rootDir);\n const updatedOrder = current.tasks.map((task) => task.path);\n await saveOrder(rootDir, updatedOrder);\n return parseTask(rootDir, nextPath);\n}\n\nexport async function deleteTask(rootDir: string, relativePath: string): Promise<void> {\n const normalizedPath = ensureMarkdownExtension(normalizeRelativePath(relativePath));\n const absolutePath = path.join(rootDir, normalizedPath);\n\n try {\n await fs.unlink(absolutePath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const current = await listTasks(rootDir);\n await saveOrder(\n rootDir,\n current.tasks.map((task) => task.path)\n );\n}\n\nexport async function patchTaskFields(rootDir: string, currentPath: string, input: PatchTaskFieldsInput): Promise<TaskRecord> {\n const normalizedCurrentPath = ensureMarkdownExtension(normalizeRelativePath(currentPath));\n const absoluteCurrentPath = path.join(rootDir, normalizedCurrentPath);\n\n let existing: TaskRecord;\n try {\n existing = await parseTask(rootDir, normalizedCurrentPath);\n } catch (error) {\n const maybeError = error as NodeJS.ErrnoException;\n if (maybeError.code === \"ENOENT\") {\n throw new ConflictError(\"The task no longer exists.\");\n }\n throw error;\n }\n\n const priority = input.priority && REQUIRED_PRIORITY.includes(input.priority) ? input.priority : existing.frontmatter.priority;\n const status = input.status && REQUIRED_STATUS.includes(input.status) ? input.status : existing.frontmatter.status;\n\n if (priority === existing.frontmatter.priority && status === existing.frontmatter.status) {\n return existing;\n }\n\n const record: TaskRecord = {\n path: normalizedCurrentPath,\n raw: existing.raw,\n normalized: false,\n content: existing.content,\n extraFrontmatter: existing.extraFrontmatter,\n frontmatter: {\n ...existing.frontmatter,\n priority,\n status,\n updatedAt: asUtcISOString(new Date())\n }\n };\n\n await fs.writeFile(absoluteCurrentPath, serializeTask(record), \"utf8\");\n return parseTask(rootDir, normalizedCurrentPath);\n}\n\nexport function parseOrderPayload(input: unknown): string[] {\n if (!Array.isArray(input)) {\n throw new ValidationError(\"Order payload must be an array.\");\n }\n\n return input.map((item) => ensureMarkdownExtension(normalizeRelativePath(String(item))));\n}\n\nexport async function readOrder(rootDir: string): Promise<ConfigFile> {\n const config = await readConfig(rootDir);\n const { order } = await reconcileOrder(\n rootDir,\n (await listTasks(rootDir)).tasks.map((task) => task.path)\n );\n return { version: 1, taskDirs: config.taskDirs, ignorePaths: config.ignorePaths, order };\n}\n\nexport const taskStoreUtils = {\n slugify,\n normalizeRelativePath,\n ensureMarkdownExtension,\n splitFrontmatter,\n buildDefaults\n};\n","export const CONFIG_FILE_NAME = \".md-task-viewer.json\";\n\nexport type TaskPriority = \"MUST\" | \"WANT\";\nexport type TaskStatus = \"TODO\" | \"WIP\" | \"DONE\";\n\nexport interface TaskFrontmatter {\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n createdAt: string;\n updatedAt: string;\n [key: string]: unknown;\n}\n\nexport interface TaskRecord {\n path: string;\n content: string;\n frontmatter: TaskFrontmatter;\n extraFrontmatter: Record<string, unknown>;\n raw: string;\n normalized: boolean;\n}\n\nexport interface TaskParseError {\n path: string;\n message: string;\n}\n\nexport interface TaskListResponse {\n tasks: TaskRecord[];\n errors: TaskParseError[];\n}\n\nexport interface CreateTaskInput {\n title: string;\n priority?: TaskPriority;\n status?: TaskStatus;\n content?: string;\n directory?: string;\n path?: string;\n extraFrontmatter?: Record<string, unknown>;\n}\n\nexport interface UpdateTaskInput {\n path?: string;\n title: string;\n priority: TaskPriority;\n status: TaskStatus;\n content: string;\n extraFrontmatter?: Record<string, unknown>;\n baseUpdatedAt?: string;\n}\n\nexport interface PatchTaskFieldsInput {\n priority?: TaskPriority;\n status?: TaskStatus;\n}\n\nexport interface ConfigFile {\n version: number;\n taskDirs: string[];\n ignorePaths: string[];\n order: string[];\n}\n","export function slugify(value: string): string {\n const slug = value\n // Unicode結合文字列を正規合成形に統一(例: か+濁点 → が)\n .normalize(\"NFC\")\n // 半角・全角スペース(U+3000)など空白文字をハイフンに変換。近年では \\s は U+3000 にもマッチするが、明示的に記載\n .replace(/[\\s\\u3000]+/g, \"-\")\n // Unicode文字(L)・数字(N)・ハイフン以外を除去(記号や句読点など)\n .replace(/[^\\p{L}\\p{N}-]+/gu, \"\")\n // 先頭・末尾の余分なハイフンを除去\n .replace(/^-+|-+$/g, \"\");\n return slug || \"untitled-task\";\n}\n"],"mappings":"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","names":["path","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "md-task-viewer",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Launch a local task viewer/editor for markdown files with frontmatter",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -62,4 +62,4 @@
62
62
  "vite": "^6.2.1",
63
63
  "vitest": "^3.0.8"
64
64
  }
65
- }
65
+ }