@webx-ui/module-tasks 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.d.ts CHANGED
@@ -9,7 +9,7 @@ export interface TasksApi {
9
9
  task(id: number): Promise<TaskDetail>;
10
10
  /** A draft with its stages. */
11
11
  create(input: TaskInput): Promise<TaskDetail>;
12
- /** Within the rules of §3: refused with 409 and the reason when the task has started. */
12
+ /** Within the rules of §3: refused with 422 and the reason when the task has started. */
13
13
  save(id: number, input: TaskInput): Promise<TaskDetail>;
14
14
  ready(id: number): Promise<TaskDetail>;
15
15
  cancel(id: number, reason?: string): Promise<TaskDetail>;
@@ -22,7 +22,7 @@ export interface TasksApi {
22
22
  /** The notification settings; the bot token only as whether one is set. */
23
23
  settings(): Promise<NotificationSettings>;
24
24
  saveSettings(values: Record<string, unknown>, forgetToken?: boolean): Promise<NotificationSettings>;
25
- /** Sends one message now; refused with 409 and Telegram's own words when it does not get through. */
25
+ /** Sends one message now; refused with 422 and Telegram's own words when it does not get through. */
26
26
  testNotice(): Promise<string>;
27
27
  }
28
28
  /** The queue's endpoints under the panel's API path; every change answers the whole task. */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/api.ts","../src/messages.ts","../src/i18n.ts","../src/ProjectDialog.vue","../src/ProjectsPage.vue","../src/tones.ts","../src/TaskFormPage.vue","../src/TasksMarkdown.vue","../src/TasksTextDialog.vue","../src/TaskPage.vue","../src/TasksPage.vue","../src/TasksSettingsPage.vue","../src/module.ts"],"sourcesContent":["import type { AdminContext } from '@webx-ui/module-admin'\nimport type {\n NotificationSettings,\n Project,\n ProjectInput,\n TaskDetail,\n TaskInput,\n TaskQuery,\n TasksPage,\n} from './types'\n\nexport interface TasksApi {\n projects(): Promise<Project[]>\n createProject(input: ProjectInput): Promise<Project>\n saveProject(id: number, input: ProjectInput): Promise<Project>\n /** A page of tasks under a view, with the count of every view. */\n tasks(query?: TaskQuery): Promise<TasksPage>\n task(id: number): Promise<TaskDetail>\n /** A draft with its stages. */\n create(input: TaskInput): Promise<TaskDetail>\n /** Within the rules of §3: refused with 409 and the reason when the task has started. */\n save(id: number, input: TaskInput): Promise<TaskDetail>\n ready(id: number): Promise<TaskDetail>\n cancel(id: number, reason?: string): Promise<TaskDetail>\n comment(id: number, body: string, stageId?: number | null): Promise<TaskDetail>\n accept(stage: number, note?: string): Promise<TaskDetail>\n rework(stage: number, remarks: string): Promise<TaskDetail>\n unblock(stage: number, answer: string): Promise<TaskDetail>\n release(stage: number, reason?: string): Promise<TaskDetail>\n cancelStage(stage: number, reason?: string): Promise<TaskDetail>\n /** The notification settings; the bot token only as whether one is set. */\n settings(): Promise<NotificationSettings>\n saveSettings(\n values: Record<string, unknown>,\n forgetToken?: boolean,\n ): Promise<NotificationSettings>\n /** Sends one message now; refused with 409 and Telegram's own words when it does not get through. */\n testNotice(): Promise<string>\n}\n\n/** The queue's endpoints under the panel's API path; every change answers the whole task. */\nexport function createTasksApi(admin: AdminContext): TasksApi {\n const base = `${admin.apiPath}/tasks`\n const data = <T>(body: { data: T }): T => body.data\n\n const task = (path: string, body: Record<string, unknown> = {}) =>\n admin.http.post<{ data: TaskDetail }>(`${base}/${path}`, body).then(data)\n\n return {\n projects: () => admin.http.get<{ data: Project[] }>(`${base}/projects`).then(data),\n\n createProject: (input) =>\n admin.http.post<{ data: Project }>(`${base}/projects`, input).then(data),\n\n saveProject: (id, input) =>\n admin.http.put<{ data: Project }>(`${base}/projects/${id}`, input).then(data),\n\n /* `undefined` drops a parameter; `null` and `''` would be sent as words. */\n tasks: (query = {}) =>\n admin.http.get<TasksPage>(`${base}/tasks`, {\n query: {\n view: query.view && query.view !== 'all' ? query.view : undefined,\n project: query.project ?? undefined,\n q: query.q || undefined,\n page: query.page,\n per_page: query.per_page,\n },\n }),\n\n task: (id) => admin.http.get<{ data: TaskDetail }>(`${base}/tasks/${id}`).then(data),\n\n create: (input) => admin.http.post<{ data: TaskDetail }>(`${base}/tasks`, input).then(data),\n\n save: (id, input) =>\n admin.http.put<{ data: TaskDetail }>(`${base}/tasks/${id}`, input).then(data),\n\n ready: (id) => task(`tasks/${id}/ready`),\n cancel: (id, reason) => task(`tasks/${id}/cancel`, { reason }),\n comment: (id, body, stageId) => task(`tasks/${id}/comments`, { body, stage_id: stageId }),\n accept: (stage, note) => task(`stages/${stage}/accept`, { note }),\n rework: (stage, remarks) => task(`stages/${stage}/rework`, { remarks }),\n unblock: (stage, answer) => task(`stages/${stage}/unblock`, { answer }),\n release: (stage, reason) => task(`stages/${stage}/release`, { reason }),\n cancelStage: (stage, reason) => task(`stages/${stage}/cancel`, { reason }),\n\n settings: () => admin.http.get<{ data: NotificationSettings }>(`${base}/settings`).then(data),\n\n saveSettings: (values, forgetToken = false) =>\n admin.http\n .put<{ data: NotificationSettings }>(`${base}/settings`, {\n values,\n forget_token: forgetToken || undefined,\n })\n .then(data),\n\n testNotice: () =>\n admin.http\n .post<{ message: string }>(`${base}/settings/test`, {})\n .then((body) => body.message),\n }\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * What this package says, in English — the same keys `webx-ui/module-tasks` ships as\n * `lang/en/*.php`, so a key never reaches the screen while the dictionary is on its way. The\n * server's dictionary wins; the labels of the form (`screen`) arrive translated with the screen\n * and are not repeated here.\n */\nexport const tasksMessages: Record<string, Messages> = {\n module: {\n title: 'Tasks',\n },\n\n panel: {\n new: 'New task',\n projects: 'Projects',\n 'view-all': 'All',\n 'view-waiting': 'Waiting for me',\n 'view-active': 'In work',\n 'view-draft': 'Drafts',\n 'view-closed': 'Closed',\n 'all-projects': 'All projects',\n search: 'Search tasks',\n empty: 'No tasks here.',\n 'column-task': 'Task',\n 'column-status': 'Status',\n 'column-stage': 'Stage',\n 'column-priority': 'Priority',\n 'column-updated': 'Updated',\n 'stage-of': 'Stage :position/:count',\n 'status-draft': 'Draft',\n 'status-ready': 'Ready',\n 'status-in_progress': 'In progress',\n 'status-review': 'In review',\n 'status-done': 'Done',\n 'status-cancelled': 'Cancelled',\n 'stage-pending': 'Waiting',\n 'stage-ready': 'Ready',\n 'stage-in_progress': 'In progress',\n 'stage-review': 'In review',\n 'stage-rework': 'Sent back',\n 'stage-blocked': 'Asked a question',\n 'stage-done': 'Done',\n 'stage-cancelled': 'The stage is cancelled.',\n 'priority-low': 'Low',\n 'priority-normal': 'Normal',\n 'priority-high': 'High',\n spec: 'Specification',\n acceptance: 'Acceptance criteria',\n 'no-spec': 'No specification.',\n branch: 'Branch',\n stages: 'Stages',\n journal: 'Journal',\n brief: 'Assignment',\n 'stage-acceptance': 'Criteria',\n report: 'Report',\n result: 'Result',\n 'no-report': 'Not reported yet.',\n agent: 'Agent',\n attempt: 'Attempt :attempt',\n 'by-person': 'Checked by a person',\n 'by-agent': 'Checked by an agent',\n question: 'Question',\n start: 'Put to work',\n started: 'The task is in work: the first stage can be taken.',\n edit: 'Edit',\n 'cancel-task': 'Cancel the task',\n 'cancel-task-title': 'Cancel «:title»?',\n 'cancel-task-text':\n 'Every stage that is not done is cancelled, and nothing of the task is handed out again.',\n cancelled: 'The task is cancelled.',\n accept: 'Accept',\n 'accept-title': 'Accept «:stage»?',\n 'accept-text': 'The next stage can be taken right after.',\n accepted: 'The stage is accepted.',\n rework: 'Send back',\n 'rework-title': 'Send «:stage» back',\n 'rework-label': 'What has to change',\n reworked: 'The stage is sent back.',\n answer: 'Answer',\n 'answer-title': 'Answer the question',\n 'answer-label': 'Your answer',\n answered: 'The answer is sent; the stage is back in the queue.',\n release: 'Release',\n 'release-title': 'Release «:stage»?',\n 'release-text': 'The stage goes back to the queue, and the agent that held it loses it.',\n released: 'The stage is released.',\n 'cancel-stage': 'Cancel the stage',\n 'cancel-stage-title': 'Cancel «:stage»?',\n 'cancel-stage-text': 'The stage is skipped and the next one can start.',\n note: 'Note',\n send: 'Send',\n keep: 'Keep',\n comment: 'Comment',\n 'comment-placeholder': 'Add a comment for people and agents',\n commented: 'The comment is added.',\n 'kind-status': 'changed the status',\n 'kind-report': 'reported',\n 'kind-rework': 'sent back',\n 'kind-question': 'asked',\n 'kind-answer': 'answered',\n 'kind-edit': 'edited the task',\n 'kind-comment': 'commented',\n system: 'System',\n 'journal-empty': 'Nothing has happened yet.',\n 'locked-stages': 'Started stages',\n 'locked-help':\n 'Stages already taken stay as they are. The others can be changed and reordered, and new ones go at the end.',\n 'locked-fields': 'Work has started: of the task itself, only the priority can change.',\n save: 'Save',\n saved: 'Saved.',\n created: 'The task is written. It stays a draft until you put it to work.',\n 'save-failed': 'The task is not saved: check the marked fields.',\n 'leave-title': 'Leave without saving?',\n 'leave-text': 'The changes made here will be lost.',\n leave: 'Leave',\n back: 'Back to tasks',\n untitled: 'Untitled task',\n 'need-project': 'Add a project first: every task belongs to one.',\n 'project-new': 'New project',\n 'project-edit': 'Edit the project',\n 'project-title': 'Name',\n 'project-slug': 'Slug',\n 'project-slug-help': 'Lowercase letters, digits and dashes. Tasks are named by it: shop#12.',\n 'project-workdir': 'Working folder',\n 'project-workdir-help': 'The folder an agent is started in.',\n 'project-repo': 'Repository',\n 'project-branch': 'Default branch',\n 'project-rules': 'Rules for agents',\n 'project-rules-help':\n 'Handed to every stage of the project: the gate to run, what never to touch.',\n 'project-archived': 'Archived',\n 'project-archived-help': 'An archived project takes no new tasks and hands nothing out.',\n 'project-tasks': 'Tasks',\n 'project-saved': 'The project is saved.',\n 'projects-empty': 'No projects yet. A task belongs to a project — add one first.',\n settings: 'Settings',\n 'settings-saved': 'The settings are saved.',\n 'send-test': 'Send a test message',\n 'test-sent': 'The test message is sent.',\n 'token-set': 'A bot token is set.',\n 'token-not-set': 'No bot token yet: nothing is sent.',\n 'forget-token': 'Forget the token',\n 'token-forgotten': 'The token is forgotten.',\n },\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { tasksMessages } from './messages'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useTasksMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults('webx-tasks', tasksMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { reactive, ref, useId } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n useModal,\n WxButton,\n WxDialog,\n WxFormItem,\n WxInput,\n WxSpace,\n WxSwitch,\n WxTextarea,\n} from '@webx-ui/core'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport type { Project, ProjectInput } from './types'\n\n/**\n * A project, new or changed: where agents work on it and the rules they are handed. Answers the\n * project as the server saved it; a refused field stays open with the reason under it.\n */\ndefineOptions({ name: 'WxTasksProjectDialog' })\n\nconst props = withDefaults(defineProps<{ project?: Project | null }>(), { project: null })\n\nconst { open, resolve, dismiss } = useModal<Project>()\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst formId = useId()\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst values = reactive({\n slug: props.project?.slug ?? '',\n title: props.project?.title ?? '',\n workdir: props.project?.workdir ?? '',\n repo_url: props.project?.repo_url ?? '',\n default_branch: props.project?.default_branch ?? 'main',\n rules: props.project?.rules ?? '',\n archived: props.project?.archived ?? false,\n})\n\nasync function submit(): Promise<void> {\n if (saving.value) return\n\n saving.value = true\n errors.value = {}\n\n const input: ProjectInput = {\n ...values,\n workdir: values.workdir || null,\n repo_url: values.repo_url || null,\n default_branch: values.default_branch || null,\n rules: values.rules || null,\n }\n\n try {\n resolve(\n props.project\n ? await api.saveProject(props.project.id, input)\n : await api.createProject(input),\n )\n toast.success(t('panel.project-saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n else toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"props.project ? t('panel.project-edit') : t('panel.project-new')\"\n :width=\"560\"\n >\n <form :id=\"formId\" class=\"wx-tasks-project\" @submit.prevent=\"submit\">\n <wx-form-item :label=\"t('panel.project-title')\" :error=\"errors.title\" required>\n <wx-input v-model=\"values.title\" :maxlength=\"255\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-slug')\"\n :help=\"t('panel.project-slug-help')\"\n :error=\"errors.slug\"\n required\n >\n <wx-input v-model=\"values.slug\" :maxlength=\"64\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-workdir')\"\n :help=\"t('panel.project-workdir-help')\"\n :error=\"errors.workdir\"\n >\n <wx-input v-model=\"values.workdir\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('panel.project-repo')\" :error=\"errors.repo_url\">\n <wx-input v-model=\"values.repo_url\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('panel.project-branch')\" :error=\"errors.default_branch\">\n <wx-input v-model=\"values.default_branch\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-rules')\"\n :help=\"t('panel.project-rules-help')\"\n :error=\"errors.rules\"\n >\n <wx-textarea v-model=\"values.rules\" :rows=\"5\" />\n </wx-form-item>\n\n <wx-form-item v-if=\"props.project\" :help=\"t('panel.project-archived-help')\">\n <wx-switch v-model=\"values.archived\" :label=\"t('panel.project-archived')\" />\n </wx-form-item>\n </form>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ t('panel.keep') }}</wx-button>\n <wx-button type=\"primary\" native-type=\"submit\" :form=\"formId\" :loading=\"saving\">\n {{ t('panel.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-tasks-project {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxListScreen,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n createModal,\n toast,\n WxBadge,\n WxButton,\n WxTable,\n WxText,\n type TableColumn,\n} from '@webx-ui/core'\nimport ProjectDialog from './ProjectDialog.vue'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport type { Project } from './types'\n\n/**\n * The projects (§6, «Projects»): where work happens. A short list — a handful of rows, archived\n * ones last — and a dialog to write one; nothing here pages or filters.\n */\ndefineOptions({ name: 'WxTasksProjectsPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst projects = ref<Project[]>([])\nconst loading = ref(true)\n\nconst canManage = context.can('tasks.manage')\n\nconst edit = createModal<Project, { project?: Project | null }>(ProjectDialog)\n\nconst columns = computed<TableColumn<Project>[]>(() => [\n { key: 'title', label: t('panel.project-title'), minWidth: 200 },\n { key: 'workdir', label: t('panel.project-workdir'), minWidth: 200, hideBelow: 640 },\n { key: 'tasks_count', label: t('panel.project-tasks'), width: 100, align: 'right' },\n { key: 'actions', label: '', width: 120, align: 'right' },\n])\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n projects.value = await api.projects()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function write(project: Project | null): Promise<void> {\n if (await edit({ project })) await load()\n}\n\nconst actions = computed<ScreenAction[]>(() =>\n canManage\n ? [\n {\n key: 'new',\n label: t('panel.project-new'),\n icon: 'plus',\n primary: true,\n run: () => void write(null),\n },\n ]\n : [],\n)\n</script>\n\n<template>\n <wx-list-screen\n :title=\"t('panel.projects')\"\n :back=\"props.base\"\n :back-label=\"t('panel.back')\"\n :actions=\"actions\"\n >\n <wx-table\n :data=\"projects\"\n :columns=\"columns\"\n row-key=\"id\"\n flush\n layout=\"fixed\"\n :loading=\"loading\"\n :cards-below=\"0\"\n :empty-text=\"projects.length === 0 && !loading ? t('panel.projects-empty') : undefined\"\n :aria-label=\"t('panel.projects')\"\n >\n <template #cell-title=\"{ row }\">\n <div class=\"wx-tasks-projects__title\">\n <wx-text truncate weight=\"medium\">{{ row.title }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" mono>{{ row.slug }}</wx-text>\n <wx-badge v-if=\"row.archived\" size=\"sm\">{{ t('panel.project-archived') }}</wx-badge>\n </div>\n </template>\n\n <template #cell-workdir=\"{ row }\">\n <wx-text size=\"sm\" tone=\"muted\" mono truncate>{{ row.workdir ?? '—' }}</wx-text>\n </template>\n\n <template #cell-actions=\"{ row }\">\n <wx-button v-if=\"canManage\" size=\"sm\" variant=\"outline\" @click=\"write(row)\">\n {{ t('panel.edit') }}\n </wx-button>\n </template>\n </wx-table>\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-tasks-projects__title {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-2);\n align-items: flex-start;\n min-width: 0;\n}\n</style>\n","import type { BadgeType } from '@webx-ui/core'\nimport type { Priority, StageStatus, TaskStatus } from './types'\n\n/**\n * The colour each status is said in. One table for the list and the task, so a stage that waits\n * for a person is the same colour in both: warning is \"somebody has to act\", primary is \"work is\n * going\", success and quiet are over.\n */\nexport const taskTones: Record<TaskStatus, BadgeType> = {\n draft: 'default',\n ready: 'info',\n in_progress: 'primary',\n review: 'warning',\n done: 'success',\n cancelled: 'default',\n}\n\nexport const stageTones: Record<StageStatus, BadgeType> = {\n pending: 'default',\n ready: 'info',\n in_progress: 'primary',\n review: 'warning',\n rework: 'danger',\n blocked: 'warning',\n done: 'success',\n cancelled: 'default',\n}\n\nexport const priorityTones: Record<Priority, BadgeType> = {\n low: 'default',\n normal: 'info',\n high: 'danger',\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useBodyKeys,\n useErrorText,\n useTranslate,\n WxSaveState,\n WxScreen,\n WxScreenHead,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n toast,\n WxActionBar,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxSkeleton,\n WxText,\n} from '@webx-ui/core'\nimport type { Patch, ScreenModel } from '@webx-ui/schema'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { stageTones } from './tones'\nimport type { Project, Stage, StageInput, TaskDetail, TaskInput } from './types'\n\n/**\n * The form of a task (§6.3): the described screen `tasks.form` — so a project can move or relabel\n * a field with a patch — with the rules of §3 laid over it by the page.\n *\n * A draft is the author's: every field, and the stages as one list to add to, reorder and remove\n * from. Once the task is in work the agents have read it, and what they read must stay what it\n * was: the task's own fields are shown but locked, except the priority — that is the order of the\n * queue, not the content of the work. Stages somebody already took are listed above the editor and\n * cannot be touched; the repeater holds only the ones nobody has started, and new ones go after\n * them. On save the list is put back together around the started stages, which keep their places.\n */\ndefineOptions({ name: 'WxTaskFormPage' })\n\nconst props = withDefaults(defineProps<{ id?: number | null; base?: string }>(), {\n id: null,\n base: '/tasks',\n})\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst task = ref<TaskDetail | null>(null)\nconst projects = ref<Project[]>([])\nconst values = ref<ScreenModel>({})\nconst snapshot = ref('')\nconst loading = ref(true)\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst canManage = context.can('tasks.manage')\n\nconst draft = computed(() => task.value === null || task.value.status === 'draft')\n\n/** Taken, reported, done or cancelled — the stages the rules keep as they are. */\nconst locked = computed<Stage[]>(() =>\n draft.value\n ? []\n : (task.value?.stages ?? []).filter(\n (stage) => stage.status !== 'pending' && stage.status !== 'ready',\n ),\n)\n\nconst current = computed(() => JSON.stringify(values.value))\nconst dirty = computed(() => snapshot.value !== '' && current.value !== snapshot.value)\n\nconst state = computed<'saving' | 'unsaved' | 'saved'>(() => {\n if (saving.value) return 'saving'\n\n return dirty.value || props.id === null ? 'unsaved' : 'saved'\n})\n\n/** What only the page knows: the projects to choose from, and what the rules lock. */\nconst patch = computed<Patch>(() => {\n const ops: Patch = [\n {\n op: 'set',\n target: 'project',\n props: {\n options: projects.value\n .filter((project) => !project.archived || project.id === values.value.project_id)\n .map((project) => ({ label: project.title, value: project.id })),\n // A task never moves between projects: its number is counted inside one.\n disabled: props.id !== null,\n },\n },\n ]\n\n if (!draft.value) {\n for (const target of ['title', 'branch', 'spec', 'acceptance']) {\n ops.push({ op: 'set', target, props: { disabled: true } })\n }\n }\n\n return ops\n})\n\nfunction editable(stage: Stage): StageInput {\n return {\n id: stage.id,\n title: stage.title,\n brief: stage.brief ?? '',\n acceptance: stage.acceptance ?? '',\n review_mode: stage.review_mode,\n }\n}\n\nfunction take(detail: TaskDetail | null): void {\n task.value = detail\n\n const model: ScreenModel = detail\n ? {\n project_id: projects.value.find((project) => project.slug === detail.project)?.id ?? null,\n title: detail.title,\n priority: detail.priority,\n branch: detail.branch ?? '',\n spec: detail.spec ?? '',\n acceptance: detail.acceptance ?? '',\n stages: detail.stages\n .filter(\n (stage) => detail.status === 'draft' || ['pending', 'ready'].includes(stage.status),\n )\n .map(editable),\n }\n : {\n project_id:\n Number(route.query.project) ||\n projects.value.find((project) => !project.archived)?.id ||\n null,\n title: '',\n priority: 'normal',\n branch: '',\n spec: '',\n acceptance: '',\n stages: [{ title: '', brief: '', acceptance: '', review_mode: 'auto' }],\n }\n\n values.value = model\n snapshot.value = JSON.stringify(model)\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n projects.value = await api.projects()\n take(props.id === null ? null : await api.task(props.id))\n } catch (error) {\n toast.danger(message(error))\n void router.push(props.base)\n } finally {\n loading.value = false\n }\n}\n\n/**\n * The stages as the server wants them (§3): in a draft, the list as it stands. In work, every\n * stage by id — the started ones in the places they had, the rest in the order of the editor —\n * and the new ones last.\n */\nfunction stagesToSend(): StageInput[] {\n const rows = (Array.isArray(values.value.stages) ? values.value.stages : []) as StageInput[]\n const clean = (row: StageInput): StageInput => ({\n ...(row.id ? { id: row.id } : {}),\n title: row.title ?? '',\n brief: row.brief || null,\n acceptance: row.acceptance || null,\n review_mode: row.review_mode ?? 'auto',\n })\n\n if (draft.value) return rows.map(clean)\n\n const existing = rows.filter((row) => row.id)\n const fresh = rows.filter((row) => !row.id)\n const slots: (StageInput | undefined)[] = []\n\n for (const stage of locked.value) slots[stage.position - 1] = { id: stage.id }\n\n let next = 0\n const total = locked.value.length + existing.length\n\n for (let index = 0; index < total; index += 1) {\n if (slots[index] === undefined) slots[index] = clean(existing[next++]!)\n }\n\n return [...(slots as StageInput[]), ...fresh.map(clean)]\n}\n\nfunction input(): TaskInput {\n const v = values.value\n\n if (!draft.value) {\n return { priority: v.priority as TaskInput['priority'], stages: stagesToSend() }\n }\n\n return {\n project_id: typeof v.project_id === 'number' ? v.project_id : undefined,\n title: String(v.title ?? ''),\n priority: v.priority as TaskInput['priority'],\n branch: v.branch ? String(v.branch) : null,\n spec: v.spec ? String(v.spec) : null,\n acceptance: v.acceptance ? String(v.acceptance) : null,\n stages: stagesToSend(),\n }\n}\n\nasync function save(): Promise<void> {\n if (saving.value || !canManage) return\n\n saving.value = true\n errors.value = {}\n\n try {\n const made = props.id === null\n const detail = made ? await api.create(input()) : await api.save(props.id as number, input())\n\n // Nothing left to protect: the page is about to be left for the task.\n snapshot.value = current.value\n toast.success(made ? t('panel.created') : t('panel.saved'))\n await router.push(`${props.base}/${detail.id}`)\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) {\n errors.value = body.errors\n toast.danger(t('panel.save-failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n\nfunction leaveGuard(event: BeforeUnloadEvent): void {\n if (dirty.value) event.preventDefault()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 's') {\n event.preventDefault()\n void save()\n }\n}\n\nuseBodyKeys(onKeydown)\n\nonMounted(() => {\n void load()\n window.addEventListener('beforeunload', leaveGuard)\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('beforeunload', leaveGuard)\n})\n\nonBeforeRouteLeave(async () => {\n if (!dirty.value || !canManage) return true\n\n return await confirm({\n title: t('panel.leave-title'),\n message: t('panel.leave-text'),\n confirmText: t('panel.leave'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n})\n\nconst title = computed(() =>\n props.id === null ? t('panel.new') : task.value?.title || t('panel.untitled'),\n)\n</script>\n\n<template>\n <div class=\"wx-task-form\" @keydown=\"onKeydown\">\n <wx-skeleton v-if=\"loading\" title :rows=\"8\" />\n\n <template v-else>\n <wx-screen-head\n :back=\"props.id === null ? props.base : `${props.base}/${props.id}`\"\n :back-label=\"t('panel.back')\"\n :title=\"title\"\n :subtitle=\"task?.ref\"\n />\n\n <wx-alert v-if=\"props.id === null && projects.length === 0\" type=\"info\">\n {{ t('panel.need-project') }}\n </wx-alert>\n\n <wx-alert v-if=\"!draft\" type=\"info\">{{ t('panel.locked-fields') }}</wx-alert>\n\n <wx-card v-if=\"locked.length > 0\" :title=\"t('panel.locked-stages')\">\n <wx-text size=\"sm\" tone=\"muted\">{{ t('panel.locked-help') }}</wx-text>\n <ol class=\"wx-task-form__locked\">\n <li v-for=\"stage in locked\" :key=\"stage.id\">\n <wx-text truncate>{{ stage.position }}. {{ stage.title }}</wx-text>\n <wx-badge size=\"sm\" :type=\"stageTones[stage.status]\">\n {{ t(`panel.stage-${stage.status}`) }}\n </wx-badge>\n </li>\n </ol>\n </wx-card>\n\n <wx-screen\n v-model=\"values\"\n name=\"tasks.form\"\n :patch=\"patch\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <wx-action-bar v-if=\"canManage\">\n <template #state>\n <wx-save-state :state=\"state\" />\n </template>\n\n <wx-button\n type=\"primary\"\n :loading=\"saving\"\n :disabled=\"(!dirty && props.id !== null) || projects.length === 0\"\n @click=\"save\"\n >\n {{ t('panel.save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-task-form {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n\n.wx-task-form__locked {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: var(--wx-space-12) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-task-form__locked li {\n display: flex;\n gap: var(--wx-space-8);\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { renderMarkdown } from '@webx-ui/module-admin'\nimport { WxProse } from '@webx-ui/core'\n\n/**\n * A specification, a brief or a report as it was written: markdown, rendered with the panel's own\n * renderer. `WxProse` injects what it is given as it is, and that is safe here because the\n * renderer escapes every character before it builds a tag — what arrives holds only the tags it\n * made, whoever wrote the text, an agent included.\n */\ndefineOptions({ name: 'WxTasksMarkdown' })\n\nconst props = defineProps<{ source: string | null | undefined; empty?: string }>()\n\nconst html = computed(() => (props.source ? renderMarkdown(props.source) : ''))\n</script>\n\n<template>\n <wx-prose v-if=\"html\" class=\"wx-tasks-markdown\" :html=\"html\" size=\"sm\" />\n <p v-else-if=\"empty\" class=\"wx-tasks-markdown is-empty\">{{ empty }}</p>\n</template>\n\n<style scoped>\n.wx-tasks-markdown {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/*\n * A report is written in sections (`## Done`, `## How to check`), and at the size of a page's\n * headings they outshout the stage they belong to. Here a heading is a label of the text under it.\n */\n.wx-tasks-markdown :deep(:is(h1, h2, h3, h4)) {\n margin-block: var(--wx-space-12) var(--wx-space-4);\n font-size: var(--wx-font-size-md);\n}\n\n.wx-tasks-markdown :deep(:is(h1, h2, h3, h4):first-child) {\n margin-block-start: 0;\n}\n\n.wx-tasks-markdown.is-empty {\n margin: 0;\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { nextTick, onMounted, ref, useId, useTemplateRef } from 'vue'\nimport { useModal, WxButton, WxDialog, WxFormItem, WxSpace, WxTextarea } from '@webx-ui/core'\n\n/**\n * One text and a button: the remarks a stage is sent back with, the answer to an agent's\n * question, the reason a task is cancelled. Answers the text, or nothing when closed.\n *\n * `required` is for the two the rules insist on (§3): sending back without saying what is wrong,\n * or answering with nothing, would hand the next session a decision nobody made.\n */\ndefineOptions({ name: 'WxTasksTextDialog' })\n\nconst props = withDefaults(\n defineProps<{\n title: string\n label: string\n confirmText: string\n cancelText: string\n message?: string\n required?: boolean\n danger?: boolean\n }>(),\n { message: undefined, required: false, danger: false },\n)\n\nconst { open, resolve, dismiss } = useModal<string>()\n\nconst formId = useId()\nconst text = ref('')\nconst form = useTemplateRef<HTMLFormElement>('form')\n\nonMounted(async () => {\n await nextTick()\n form.value?.querySelector('textarea')?.focus()\n})\n\nfunction submit(): void {\n if (props.required && text.value.trim() === '') return\n\n resolve(text.value.trim())\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"props.title\" :width=\"520\">\n <p v-if=\"props.message\" class=\"wx-tasks-text-dialog__message\">{{ props.message }}</p>\n\n <form :id=\"formId\" ref=\"form\" @submit.prevent=\"submit\">\n <wx-form-item :label=\"props.label\" :required=\"props.required\">\n <wx-textarea v-model=\"text\" :rows=\"5\" :aria-label=\"props.label\" />\n </wx-form-item>\n </form>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ props.cancelText }}</wx-button>\n <wx-button\n :type=\"props.danger ? 'danger' : 'primary'\"\n native-type=\"submit\"\n :form=\"formId\"\n :disabled=\"props.required && text.trim() === ''\"\n >\n {{ props.confirmText }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-tasks-text-dialog__message {\n margin: 0 0 var(--wx-space-12);\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxScreenHead,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n createModal,\n toast,\n WxAccordion,\n WxAccordionItem,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxSkeleton,\n WxText,\n WxTextarea,\n WxTimeline,\n WxTimelineItem,\n type AccordionModelValue,\n} from '@webx-ui/core'\nimport TasksMarkdown from './TasksMarkdown.vue'\nimport TasksTextDialog from './TasksTextDialog.vue'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { priorityTones, stageTones, taskTones } from './tones'\nimport type { JournalEntry, Stage, TaskDetail } from './types'\n\n/**\n * One task (§6.2): what it is for, its stages in order, and everything that happened to it.\n *\n * The buttons are the moves §3 allows at the status the task or stage is in, offered only to\n * whoever may make them — accepting and sending back to a reviewer, answering an agent's question\n * and cancelling to whoever plans, releasing a hung stage to whoever plans or works. A move the\n * server still refuses (somebody got there first) comes back as its reason, and the task is read\n * again, because the screen is then out of date.\n *\n * The stage that waits for somebody is opened on arrival: on a task with six stages it is the one\n * the person came for.\n */\ndefineOptions({ name: 'WxTaskPage' })\n\nconst props = withDefaults(defineProps<{ id: number; base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst task = ref<TaskDetail | null>(null)\nconst loading = ref(true)\nconst busy = ref(false)\nconst open = ref<AccordionModelValue>([])\nconst comment = ref('')\n\nconst canManage = context.can('tasks.manage')\nconst canReview = context.can('tasks.review')\nconst canWork = context.can('tasks.work')\nconst canComment = canManage || canReview || canWork\n\nconst ask = createModal<string, InstanceType<typeof TasksTextDialog>['$props']>(TasksTextDialog)\n\nconst closed = computed(() => task.value?.status === 'done' || task.value?.status === 'cancelled')\n\n/** The stages a person may be waiting on, first — what is opened on arrival. */\nfunction waiting(detail: TaskDetail): Stage | undefined {\n return (\n detail.stages.find((stage) => stage.status === 'review' || stage.status === 'blocked') ??\n detail.stages.find((stage) => !['done', 'cancelled', 'pending'].includes(stage.status))\n )\n}\n\nfunction take(detail: TaskDetail): void {\n task.value = detail\n\n if ((open.value as string[]).length === 0) {\n const first = waiting(detail)\n open.value = first ? [String(first.id)] : []\n }\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n take(await api.task(props.id))\n } catch (error) {\n toast.danger(message(error))\n void router.push(props.base)\n } finally {\n loading.value = false\n }\n}\n\nwatch(() => props.id, load, { immediate: true })\n\n/**\n * A move, its toast, and the task as the server has it afterwards. A refusal reloads too: the\n * screen was showing a task that is not there any more.\n */\nasync function act(work: () => Promise<TaskDetail>, said: string): Promise<void> {\n if (busy.value) return\n\n busy.value = true\n\n try {\n take(await work())\n toast.success(said)\n // The badge in the menu counts what waits for a person; this may have changed it.\n void context.refreshManifest()\n } catch (error) {\n toast.danger(message(error))\n await load()\n } finally {\n busy.value = false\n }\n}\n\nasync function start(): Promise<void> {\n const current = task.value\n if (current) await act(() => api.ready(current.id), t('panel.started'))\n}\n\nasync function cancelTask(): Promise<void> {\n const current = task.value\n if (!current) return\n\n const reason = await ask({\n title: t('panel.cancel-task-title', { title: current.title }),\n message: t('panel.cancel-task-text'),\n label: t('panel.note'),\n confirmText: t('panel.cancel-task'),\n cancelText: t('panel.keep'),\n danger: true,\n })\n\n if (reason !== null && reason !== undefined) {\n await act(() => api.cancel(current.id, reason), t('panel.cancelled'))\n }\n}\n\nasync function accept(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.accept-title', { stage: stage.title }),\n message: t('panel.accept-text'),\n confirmText: t('panel.accept'),\n cancelText: t('panel.keep'),\n })\n\n if (agreed) await act(() => api.accept(stage.id), t('panel.accepted'))\n}\n\nasync function rework(stage: Stage): Promise<void> {\n const remarks = await ask({\n title: t('panel.rework-title', { stage: stage.title }),\n label: t('panel.rework-label'),\n confirmText: t('panel.rework'),\n cancelText: t('panel.keep'),\n required: true,\n })\n\n if (remarks) await act(() => api.rework(stage.id, remarks), t('panel.reworked'))\n}\n\nasync function answer(stage: Stage): Promise<void> {\n const text = await ask({\n title: t('panel.answer-title'),\n message: question(stage)?.body ?? undefined,\n label: t('panel.answer-label'),\n confirmText: t('panel.send'),\n cancelText: t('panel.keep'),\n required: true,\n })\n\n if (text) await act(() => api.unblock(stage.id, text), t('panel.answered'))\n}\n\nasync function release(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.release-title', { stage: stage.title }),\n message: t('panel.release-text'),\n confirmText: t('panel.release'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n\n if (agreed) await act(() => api.release(stage.id), t('panel.released'))\n}\n\nasync function cancelStage(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.cancel-stage-title', { stage: stage.title }),\n message: t('panel.cancel-stage-text'),\n confirmText: t('panel.cancel-stage'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n\n if (agreed) await act(() => api.cancelStage(stage.id), t('panel.stage-cancelled'))\n}\n\nasync function send(): Promise<void> {\n const current = task.value\n const body = comment.value.trim()\n\n if (!current || body === '') return\n\n await act(() => api.comment(current.id, body), t('panel.commented'))\n comment.value = ''\n}\n\n/** The last question asked on a stage, when it is waiting for its answer. */\nfunction question(stage: Stage): JournalEntry | undefined {\n return [...(task.value?.journal ?? [])]\n .reverse()\n .find((entry) => entry.stage_id === stage.id && entry.kind === 'question')\n}\n\n/** Who may do what to this stage now (§3, §5). */\nfunction moves(stage: Stage): { key: string; label: string; primary?: boolean; run: () => void }[] {\n if (closed.value) return []\n\n const list: { key: string; label: string; primary?: boolean; run: () => void }[] = []\n\n if (stage.status === 'review' && canReview) {\n list.push({\n key: 'accept',\n label: t('panel.accept'),\n primary: true,\n run: () => void accept(stage),\n })\n list.push({ key: 'rework', label: t('panel.rework'), run: () => void rework(stage) })\n }\n\n if (stage.status === 'blocked' && canManage) {\n list.push({\n key: 'answer',\n label: t('panel.answer'),\n primary: true,\n run: () => void answer(stage),\n })\n }\n\n if (stage.status === 'in_progress' && (canManage || canWork)) {\n list.push({ key: 'release', label: t('panel.release'), run: () => void release(stage) })\n }\n\n if (canManage && !['done', 'cancelled'].includes(stage.status)) {\n list.push({ key: 'cancel', label: t('panel.cancel-stage'), run: () => void cancelStage(stage) })\n }\n\n return list\n}\n\nfunction stageNumber(entry: JournalEntry): number | null {\n return task.value?.stages.find((stage) => stage.id === entry.stage_id)?.position ?? null\n}\n\n/** What a line of the journal says happened, in the reader's words. */\nfunction said(entry: JournalEntry): string {\n const from = typeof entry.meta?.from === 'string' ? entry.meta.from : null\n const to = typeof entry.meta?.to === 'string' ? entry.meta.to : null\n\n if (entry.kind === 'status' && to !== null) {\n const words = (status: string) =>\n entry.stage_id === null ? t(`panel.status-${status}`) : t(`panel.stage-${status}`)\n\n return from === null ? words(to) : `${words(from)} → ${words(to)}`\n }\n\n return t(`panel.kind-${entry.kind}`)\n}\n\nconst actions = computed<ScreenAction[]>(() => {\n const current = task.value\n\n if (!current || !canManage) return []\n\n const list: ScreenAction[] = []\n\n if (current.status === 'draft') {\n list.push({\n key: 'start',\n label: t('panel.start'),\n icon: 'play',\n primary: true,\n run: () => void start(),\n })\n }\n\n if (!closed.value) {\n list.push({\n key: 'edit',\n label: t('panel.edit'),\n icon: 'edit',\n run: () => void router.push(`${props.base}/${current.id}/edit`),\n })\n list.push({\n key: 'cancel',\n label: t('panel.cancel-task'),\n icon: 'close',\n danger: true,\n menu: true,\n run: () => void cancelTask(),\n })\n }\n\n return list\n})\n</script>\n\n<template>\n <div class=\"wx-task\">\n <wx-skeleton v-if=\"loading && !task\" title :rows=\"8\" />\n\n <template v-else-if=\"task\">\n <wx-screen-head\n :back=\"props.base\"\n :back-label=\"t('panel.back')\"\n :title=\"task.title || t('panel.untitled')\"\n :subtitle=\"task.ref\"\n :actions=\"actions\"\n >\n <template #title-after>\n <wx-badge :type=\"taskTones[task.status]\">{{ t(`panel.status-${task.status}`) }}</wx-badge>\n </template>\n </wx-screen-head>\n\n <wx-card>\n <div class=\"wx-task__about\">\n <div class=\"wx-task__facts\">\n <wx-badge variant=\"outline\" :type=\"priorityTones[task.priority]\">\n {{ t(`panel.priority-${task.priority}`) }}\n </wx-badge>\n <wx-text v-if=\"task.branch\" size=\"sm\" tone=\"muted\" mono>\n {{ t('panel.branch') }}: {{ task.branch }}\n </wx-text>\n </div>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h3\" weight=\"semibold\">{{ t('panel.spec') }}</wx-text>\n <tasks-markdown :source=\"task.spec\" :empty=\"t('panel.no-spec')\" />\n </section>\n\n <section v-if=\"task.acceptance\" class=\"wx-task__section\">\n <wx-text as=\"h3\" weight=\"semibold\">{{ t('panel.acceptance') }}</wx-text>\n <tasks-markdown :source=\"task.acceptance\" />\n </section>\n </div>\n </wx-card>\n\n <wx-card :title=\"t('panel.stages')\">\n <wx-accordion v-model=\"open\" multiple>\n <wx-accordion-item\n v-for=\"stage in task.stages\"\n :key=\"stage.id\"\n :value=\"String(stage.id)\"\n :title=\"`${stage.position}. ${stage.title}`\"\n :subtitle=\"\n [\n stage.assignee,\n stage.attempt > 1 ? t('panel.attempt', { attempt: stage.attempt }) : null,\n stage.review_mode === 'human' ? t('panel.by-person') : null,\n ]\n .filter(Boolean)\n .join(' · ')\n \"\n >\n <template #extra>\n <wx-badge size=\"sm\" :type=\"stageTones[stage.status]\">\n {{ t(`panel.stage-${stage.status}`) }}\n </wx-badge>\n </template>\n\n <div class=\"wx-task__stage\">\n <wx-alert\n v-if=\"stage.status === 'blocked' && question(stage)\"\n type=\"warning\"\n :title=\"t('panel.question')\"\n >\n <tasks-markdown :source=\"question(stage)?.body\" />\n </wx-alert>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">{{ t('panel.brief') }}</wx-text>\n <tasks-markdown :source=\"stage.brief\" empty=\"—\" />\n </section>\n\n <section v-if=\"stage.acceptance\" class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">\n {{ t('panel.stage-acceptance') }}\n </wx-text>\n <tasks-markdown :source=\"stage.acceptance\" />\n </section>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">{{ t('panel.report') }}</wx-text>\n <tasks-markdown :source=\"stage.report\" :empty=\"t('panel.no-report')\" />\n <wx-text v-if=\"stage.result_ref\" size=\"sm\" mono class=\"wx-task__result\">\n {{ t('panel.result') }}: {{ stage.result_ref }}\n </wx-text>\n </section>\n\n <div v-if=\"moves(stage).length > 0\" class=\"wx-task__moves\">\n <wx-button\n v-for=\"move in moves(stage)\"\n :key=\"move.key\"\n size=\"sm\"\n :type=\"move.primary ? 'primary' : 'default'\"\n :variant=\"move.primary ? undefined : 'outline'\"\n :disabled=\"busy\"\n @click=\"move.run\"\n >\n {{ move.label }}\n </wx-button>\n </div>\n </div>\n </wx-accordion-item>\n </wx-accordion>\n </wx-card>\n\n <wx-card :title=\"t('panel.journal')\">\n <div v-if=\"canComment && !closed\" class=\"wx-task__comment\">\n <wx-textarea\n v-model=\"comment\"\n :rows=\"2\"\n :placeholder=\"t('panel.comment-placeholder')\"\n :aria-label=\"t('panel.comment')\"\n />\n <wx-button size=\"sm\" :disabled=\"busy || comment.trim() === ''\" @click=\"send\">\n {{ t('panel.comment') }}\n </wx-button>\n </div>\n\n <wx-text v-if=\"task.journal.length === 0\" tone=\"muted\">{{\n t('panel.journal-empty')\n }}</wx-text>\n\n <wx-timeline v-else size=\"sm\">\n <wx-timeline-item\n v-for=\"entry in [...task.journal].reverse()\"\n :key=\"entry.id\"\n :type=\"entry.actor_type === 'agent' ? 'primary' : undefined\"\n :hollow=\"entry.actor_type === 'system'\"\n >\n <div class=\"wx-task__entry\">\n <div class=\"wx-task__entry-head\">\n <wx-text size=\"sm\" weight=\"medium\">\n {{ entry.actor_type === 'system' ? t('panel.system') : entry.actor_name }}\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\">\n {{ said(entry) }}\n <template v-if=\"stageNumber(entry) !== null\"\n >· #{{ stageNumber(entry) }}</template\n >\n </wx-text>\n <wx-date :value=\"entry.created_at\" compact size=\"sm\" tone=\"muted\" />\n </div>\n <!-- A report is read on its stage; here it would be the same pages twice. -->\n <tasks-markdown v-if=\"entry.body && entry.kind !== 'report'\" :source=\"entry.body\" />\n </div>\n </wx-timeline-item>\n </wx-timeline>\n </wx-card>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-task {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n\n.wx-task__about,\n.wx-task__stage {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-task__facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-12);\n align-items: center;\n}\n\n.wx-task__section {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-task__section > :first-child {\n margin: 0;\n}\n\n.wx-task__result {\n overflow-wrap: anywhere;\n}\n\n.wx-task__moves {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n}\n\n.wx-task__comment {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n align-items: flex-end;\n margin-block-end: var(--wx-space-16);\n}\n\n.wx-task__entry {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-task__entry-head {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n align-items: baseline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxListScreen,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type SelectValue,\n type TabItem,\n type TableColumn,\n type TableState,\n type TabValue,\n} from '@webx-ui/core'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { priorityTones, stageTones, taskTones } from './tones'\nimport type { Project, TaskRow, TasksPage, TaskView } from './types'\n\n/**\n * The tasks (§6.1): a table, not a board. One row per task — its reference, what it is called,\n * where it is and which stage it is on — highest priority first, then the most recently changed.\n *\n * The views are the questions somebody opens this screen with: what waits for me, what is\n * being worked on, what I have not put to work yet, what is over. «Waiting for me» is the one\n * the badge in the menu counts — a stage a person has to check, or an agent's question.\n *\n * Everything the list is looking at lives in the address, so a link to it is a link.\n */\ndefineOptions({ name: 'WxTasksPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst page = ref<TasksPage | null>(null)\nconst projects = ref<Project[]>([])\nconst loading = ref(true)\n\nconst canManage = context.can('tasks.manage')\n\nconst VIEWS: TaskView[] = ['all', 'waiting', 'active', 'draft', 'closed']\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'tasks')?.title ??\n t('module.title'),\n)\n\nconst view = computed<TabValue>({\n get: () =>\n typeof route.query.view === 'string' && VIEWS.includes(route.query.view as TaskView)\n ? route.query.view\n : 'all',\n set: (value) => {\n void router.replace({\n query: { ...route.query, view: value === 'all' ? undefined : String(value), page: undefined },\n })\n },\n})\n\nconst project = computed<SelectValue | null>({\n get: () => (typeof route.query.project === 'string' ? Number(route.query.project) : null),\n set: (value) => {\n void router.replace({\n query: {\n ...route.query,\n project: value === null || value === '' ? undefined : String(value),\n page: undefined,\n },\n })\n },\n})\n\nconst views = computed<TabItem[]>(() =>\n VIEWS.map((value) => ({\n value,\n label: t(`panel.view-${value}`),\n badge: page.value?.counts[value] ?? undefined,\n })),\n)\n\nconst projectOptions = computed(() =>\n projects.value.map((one) => ({ label: one.title, value: one.id })),\n)\n\nconst rows = computed(() => page.value?.data ?? [])\n\n/*\n * The task and its stage stay at every width; the project goes first — it is in the reference\n * already — then the date and the priority.\n */\nconst columns = computed<TableColumn<TaskRow>[]>(() => [\n { key: 'title', label: t('panel.column-task'), minWidth: 220 },\n { key: 'status', label: t('panel.column-status'), width: 140 },\n { key: 'current_stage', label: t('panel.column-stage'), minWidth: 180, hideBelow: 640 },\n { key: 'priority', label: t('panel.column-priority'), width: 120, hideBelow: 760 },\n { key: 'updated_at', label: t('panel.column-updated'), width: 120, hideBelow: 900 },\n])\n\nasync function load(state?: TableState): Promise<void> {\n loading.value = true\n\n try {\n page.value = await api.tasks({\n view: view.value as TaskView,\n project: typeof project.value === 'number' ? project.value : null,\n q: state?.search ?? (typeof route.query.q === 'string' ? route.query.q : ''),\n page: state?.page ?? (Number(route.query.page ?? 1) || 1),\n per_page: state?.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction onState(state: TableState): void {\n void router.replace({\n query: {\n ...route.query,\n q: state.search === '' ? undefined : state.search,\n page: state.page === 1 ? undefined : String(state.page),\n },\n })\n void load(state)\n}\n\nasync function loadProjects(): Promise<void> {\n try {\n projects.value = await api.projects()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nwatch([view, project], () => void load())\n\nvoid load()\nvoid loadProjects()\n\nfunction open(row: TaskRow): void {\n void router.push(`${props.base}/${row.id}`)\n}\n\nconst actions = computed<ScreenAction[]>(() => [\n {\n key: 'projects',\n label: t('panel.projects'),\n icon: 'folder',\n run: () => void router.push(`${props.base}/projects`),\n },\n ...(canManage\n ? [\n {\n key: 'settings',\n label: t('panel.settings'),\n icon: 'settings' as const,\n menu: true,\n run: () => void router.push(`${props.base}/settings`),\n },\n {\n key: 'new',\n label: t('panel.new'),\n icon: 'plus' as const,\n primary: true,\n run: () => void router.push(`${props.base}/new`),\n },\n ]\n : []),\n])\n</script>\n\n<template>\n <div class=\"wx-tasks-list\">\n <wx-list-screen v-model:view=\"view\" :title=\"title\" :views=\"views\" :actions=\"actions\">\n <template #actions>\n <wx-select\n v-if=\"projects.length > 1\"\n v-model=\"project\"\n class=\"wx-tasks-list__project\"\n :options=\"projectOptions\"\n :placeholder=\"t('panel.all-projects')\"\n :aria-label=\"t('panel.all-projects')\"\n clearable\n size=\"sm\"\n />\n </template>\n\n <wx-table\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n hover\n flush\n layout=\"fixed\"\n :loading=\"loading\"\n :cards-below=\"0\"\n :search-placeholder=\"t('panel.search')\"\n :empty-text=\"rows.length === 0 && !loading ? t('panel.empty') : undefined\"\n :aria-label=\"title\"\n @state-change=\"onState\"\n @row-click=\"open\"\n >\n <template #cell-title=\"{ row }\">\n <div class=\"wx-tasks-list__task\">\n <wx-text size=\"sm\" tone=\"muted\" mono>{{ row.ref }}</wx-text>\n <wx-text truncate weight=\"medium\">{{ row.title }}</wx-text>\n </div>\n </template>\n\n <template #cell-status=\"{ row }\">\n <wx-badge :type=\"taskTones[row.status]\">{{ t(`panel.status-${row.status}`) }}</wx-badge>\n </template>\n\n <template #cell-current_stage=\"{ row }\">\n <div v-if=\"row.current_stage\" class=\"wx-tasks-list__stage\">\n <wx-text size=\"sm\" truncate>\n {{ t('panel.stage-of', { position: row.current_stage.position, count: row.stages }) }}\n · {{ row.current_stage.title }}\n </wx-text>\n <wx-badge size=\"sm\" :type=\"stageTones[row.current_stage.status]\">\n {{ t(`panel.stage-${row.current_stage.status}`) }}\n </wx-badge>\n </div>\n <wx-text v-else size=\"sm\" tone=\"muted\">—</wx-text>\n </template>\n\n <template #cell-priority=\"{ row }\">\n <wx-badge variant=\"outline\" :type=\"priorityTones[row.priority]\">\n {{ t(`panel.priority-${row.priority}`) }}\n </wx-badge>\n </template>\n\n <template #cell-updated_at=\"{ row }\">\n <wx-date :value=\"row.updated_at\" compact size=\"sm\" tone=\"muted\" />\n </template>\n </wx-table>\n </wx-list-screen>\n </div>\n</template>\n\n<style scoped>\n.wx-tasks-list {\n min-width: 0;\n}\n\n.wx-tasks-list__project {\n width: 200px;\n max-width: 100%;\n}\n\n.wx-tasks-list__task,\n.wx-tasks-list__stage {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-2);\n align-items: flex-start;\n min-width: 0;\n}\n\n/* Held to the cell, or a long title runs under the next column instead of ending in an ellipsis. */\n.wx-tasks-list__task > *,\n.wx-tasks-list__stage > * {\n max-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxSaveState,\n WxScreen,\n WxScreenHead,\n} from '@webx-ui/module-admin'\nimport { toast, WxActionBar, WxAlert, WxButton, WxSkeleton } from '@webx-ui/core'\nimport type { Patch, ScreenModel } from '@webx-ui/schema'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\n\n/**\n * Where a person decides what they are told about (§6a): the bot, the chats, the events.\n *\n * The described screen `tasks.settings`, a save, and a test message — the one way to know the\n * token and the chats are right before the first real notice goes nowhere. The token is typed in\n * and never shown again: the screen says whether one is set, an empty field keeps it, and\n * forgetting it is a button of its own.\n */\ndefineOptions({ name: 'WxTasksSettingsPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst TOKEN = 'tasks.telegram.token'\n\nconst values = ref<ScreenModel>({})\nconst snapshot = ref('')\nconst tokenSet = ref(false)\nconst loading = ref(true)\nconst saving = ref(false)\nconst testing = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst canManage = context.can('tasks.manage')\n\nconst dirty = computed(\n () => snapshot.value !== '' && JSON.stringify(values.value) !== snapshot.value,\n)\n\nconst state = computed<'saving' | 'unsaved' | 'saved'>(() =>\n saving.value ? 'saving' : dirty.value ? 'unsaved' : 'saved',\n)\n\n/* The field says whether a token is there without ever holding it. */\nconst patch = computed<Patch>(() => [\n { op: 'set', target: 'token', props: { placeholder: tokenSet.value ? '••••••••' : '' } },\n])\n\nfunction take(settings: { values: Record<string, unknown>; token_set: boolean }): void {\n values.value = { ...settings.values, [TOKEN]: '' }\n snapshot.value = JSON.stringify(values.value)\n tokenSet.value = settings.token_set\n}\n\nonMounted(async () => {\n try {\n take(await api.settings())\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n})\n\nasync function save(forget = false): Promise<void> {\n if (saving.value) return\n\n saving.value = true\n errors.value = {}\n\n try {\n take(await api.saveSettings(values.value, forget))\n toast.success(forget ? t('panel.token-forgotten') : t('panel.settings-saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n else toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nasync function test(): Promise<void> {\n testing.value = true\n\n try {\n toast.success(await api.testNotice())\n } catch (error) {\n toast.danger(message(error))\n } finally {\n testing.value = false\n }\n}\n</script>\n\n<template>\n <div class=\"wx-tasks-settings\">\n <wx-screen-head :back=\"props.base\" :back-label=\"t('panel.back')\" :title=\"t('panel.settings')\" />\n\n <wx-skeleton v-if=\"loading\" title :rows=\"6\" />\n\n <template v-else>\n <wx-alert :type=\"tokenSet ? 'success' : 'info'\">\n {{ tokenSet ? t('panel.token-set') : t('panel.token-not-set') }}\n </wx-alert>\n\n <wx-screen\n v-model=\"values\"\n name=\"tasks.settings\"\n :patch=\"patch\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <wx-action-bar v-if=\"canManage\">\n <template #state>\n <wx-save-state :state=\"state\" />\n </template>\n\n <wx-button v-if=\"tokenSet\" variant=\"outline\" :disabled=\"saving\" @click=\"save(true)\">\n {{ t('panel.forget-token') }}\n </wx-button>\n <wx-button variant=\"outline\" :loading=\"testing\" :disabled=\"dirty\" @click=\"test\">\n {{ t('panel.send-test') }}\n </wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"!dirty\" @click=\"save()\">\n {{ t('panel.save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-tasks-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n</style>\n","import type { AdminModule } from '@webx-ui/module-admin'\nimport ProjectsPage from './ProjectsPage.vue'\nimport TaskFormPage from './TaskFormPage.vue'\nimport TaskPage from './TaskPage.vue'\nimport TasksPage from './TasksPage.vue'\nimport TasksSettingsPage from './TasksSettingsPage.vue'\n\nexport interface TasksOptions {\n /** Where the section lives inside the panel. */\n path?: string\n}\n\n/**\n * «Tasks» as a section of the panel (§6): the list, one task, its form, the projects, and the\n * notification settings (§6a).\n *\n * The id matches the module the server reports, which is what makes the entry appear in the\n * navigation — with the count of what waits for a person beside it.\n */\nexport function tasks(options: TasksOptions = {}): AdminModule {\n const path = options.path ?? '/tasks'\n const base = { base: path }\n const id = (value: string | string[]) => Number(Array.isArray(value) ? value[0] : value)\n\n return {\n id: 'tasks',\n path,\n routes: [\n { path, name: 'webx.tasks', component: TasksPage, props: base },\n {\n path: `${path}/projects`,\n name: 'webx.tasks.projects',\n component: ProjectsPage,\n props: base,\n },\n {\n path: `${path}/settings`,\n name: 'webx.tasks.settings',\n component: TasksSettingsPage,\n props: base,\n },\n {\n path: `${path}/new`,\n name: 'webx.tasks.new',\n component: TaskFormPage,\n props: { ...base, id: null },\n },\n {\n path: `${path}/:id(\\\\d+)`,\n name: 'webx.tasks.task',\n component: TaskPage,\n props: (route) => ({ ...base, id: id(route.params.id as string) }),\n },\n {\n path: `${path}/:id(\\\\d+)/edit`,\n name: 'webx.tasks.edit',\n component: TaskFormPage,\n props: (route) => ({ ...base, id: id(route.params.id as string) }),\n },\n ],\n }\n}\n"],"names":["createTasksApi","admin","base","data","body","task","path","input","id","query","reason","stageId","stage","note","remarks","answer","values","forgetToken","tasksMessages","seeded","useTasksMessages","i18n","useAdmin","props","__props","open","resolve","dismiss","useModal","context","api","t","useTranslate","message","useErrorText","formId","useId","saving","ref","errors","reactive","submit","toast","error","_createBlock","_unref","WxDialog","$event","_createVNode","WxSpace","WxButton","_createElementVNode","WxFormItem","WxInput","_cache","WxTextarea","WxSwitch","projects","loading","canManage","edit","createModal","ProjectDialog","columns","computed","load","write","project","actions","WxListScreen","WxTable","_withCtx","row","_hoisted_1","WxText","_createTextVNode","_toDisplayString","WxBadge","taskTones","stageTones","priorityTones","route","useRoute","router","useRouter","snapshot","draft","locked","current","dirty","state","patch","ops","target","editable","take","detail","model","stagesToSend","rows","clean","existing","fresh","slots","next","total","index","v","save","made","leaveGuard","event","onKeydown","useBodyKeys","onMounted","onBeforeUnmount","onBeforeRouteLeave","confirm","title","_createElementBlock","WxSkeleton","_Fragment","WxScreenHead","WxAlert","WxCard","_renderList","WxScreen","WxActionBar","WxSaveState","html","renderMarkdown","WxProse","text","form","useTemplateRef","nextTick","_openBlock","busy","comment","canReview","canWork","canComment","ask","TasksTextDialog","closed","waiting","first","watch","act","work","said","start","cancelTask","accept","rework","question","release","cancelStage","send","entry","moves","list","stageNumber","from","to","words","status","_hoisted_2","_hoisted_3","_hoisted_4","TasksMarkdown","_hoisted_5","WxAccordion","WxAccordionItem","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","move","_hoisted_11","WxTimeline","WxTimelineItem","_hoisted_12","_hoisted_13","WxDate","page","VIEWS","module","view","value","views","projectOptions","one","onState","loadProjects","WxSelect","TOKEN","tokenSet","testing","settings","forget","test","tasks","options","TasksPage","ProjectsPage","TasksSettingsPage","TaskFormPage","TaskPage"],"mappings":";;;;AAyCO,SAASA,GAAeC,GAA+B;AAC5D,QAAMC,IAAO,GAAGD,EAAM,OAAO,UACvBE,IAAO,CAAIC,MAAyBA,EAAK,MAEzCC,IAAO,CAACC,GAAcF,IAAgC,CAAA,MAC1DH,EAAM,KAAK,KAA2B,GAAGC,CAAI,IAAII,CAAI,IAAIF,CAAI,EAAE,KAAKD,CAAI;AAE1E,SAAO;AAAA,IACL,UAAU,MAAMF,EAAM,KAAK,IAAyB,GAAGC,CAAI,WAAW,EAAE,KAAKC,CAAI;AAAA,IAEjF,eAAe,CAACI,MACdN,EAAM,KAAK,KAAwB,GAAGC,CAAI,aAAaK,CAAK,EAAE,KAAKJ,CAAI;AAAA,IAEzE,aAAa,CAACK,GAAID,MAChBN,EAAM,KAAK,IAAuB,GAAGC,CAAI,aAAaM,CAAE,IAAID,CAAK,EAAE,KAAKJ,CAAI;AAAA;AAAA,IAG9E,OAAO,CAACM,IAAQ,CAAA,MACdR,EAAM,KAAK,IAAe,GAAGC,CAAI,UAAU;AAAA,MACzC,OAAO;AAAA,QACL,MAAMO,EAAM,QAAQA,EAAM,SAAS,QAAQA,EAAM,OAAO;AAAA,QACxD,SAASA,EAAM,WAAW;AAAA,QAC1B,GAAGA,EAAM,KAAK;AAAA,QACd,MAAMA,EAAM;AAAA,QACZ,UAAUA,EAAM;AAAA,MAAA;AAAA,IAClB,CACD;AAAA,IAEH,MAAM,CAACD,MAAOP,EAAM,KAAK,IAA0B,GAAGC,CAAI,UAAUM,CAAE,EAAE,EAAE,KAAKL,CAAI;AAAA,IAEnF,QAAQ,CAACI,MAAUN,EAAM,KAAK,KAA2B,GAAGC,CAAI,UAAUK,CAAK,EAAE,KAAKJ,CAAI;AAAA,IAE1F,MAAM,CAACK,GAAID,MACTN,EAAM,KAAK,IAA0B,GAAGC,CAAI,UAAUM,CAAE,IAAID,CAAK,EAAE,KAAKJ,CAAI;AAAA,IAE9E,OAAO,CAACK,MAAOH,EAAK,SAASG,CAAE,QAAQ;AAAA,IACvC,QAAQ,CAACA,GAAIE,MAAWL,EAAK,SAASG,CAAE,WAAW,EAAE,QAAAE,GAAQ;AAAA,IAC7D,SAAS,CAACF,GAAIJ,GAAMO,MAAYN,EAAK,SAASG,CAAE,aAAa,EAAE,MAAAJ,GAAM,UAAUO,GAAS;AAAA,IACxF,QAAQ,CAACC,GAAOC,MAASR,EAAK,UAAUO,CAAK,WAAW,EAAE,MAAAC,GAAM;AAAA,IAChE,QAAQ,CAACD,GAAOE,MAAYT,EAAK,UAAUO,CAAK,WAAW,EAAE,SAAAE,GAAS;AAAA,IACtE,SAAS,CAACF,GAAOG,MAAWV,EAAK,UAAUO,CAAK,YAAY,EAAE,QAAAG,GAAQ;AAAA,IACtE,SAAS,CAACH,GAAOF,MAAWL,EAAK,UAAUO,CAAK,YAAY,EAAE,QAAAF,GAAQ;AAAA,IACtE,aAAa,CAACE,GAAOF,MAAWL,EAAK,UAAUO,CAAK,WAAW,EAAE,QAAAF,GAAQ;AAAA,IAEzE,UAAU,MAAMT,EAAM,KAAK,IAAoC,GAAGC,CAAI,WAAW,EAAE,KAAKC,CAAI;AAAA,IAE5F,cAAc,CAACa,GAAQC,IAAc,OACnChB,EAAM,KACH,IAAoC,GAAGC,CAAI,aAAa;AAAA,MACvD,QAAAc;AAAA,MACA,cAAcC,KAAe;AAAA,IAAA,CAC9B,EACA,KAAKd,CAAI;AAAA,IAEd,YAAY,MACVF,EAAM,KACH,KAA0B,GAAGC,CAAI,kBAAkB,CAAA,CAAE,EACrD,KAAK,CAACE,MAASA,EAAK,OAAO;AAAA,EAAA;AAEpC;AC5FO,MAAMc,KAA0C;AAAA,EACrD,QAAQ;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAGT,OAAO;AAAA,IACL,KAAK;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,oBACE;AAAA,IACF,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,eACE;AAAA,IACF,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,sBACE;AAAA,IACF,oBAAoB;AAAA,IACpB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EAAA;AAEvB,GC9IMC,yBAAa,QAAA;AAGZ,SAASC,KAAyB;AACvC,MAAI;AACF,UAAM,EAAE,MAAAC,EAAA,IAASC,GAAA;AAEjB,IAAKH,GAAO,IAAIE,CAAI,MAClBA,EAAK,SAAS,cAAcH,EAAa,GACzCC,GAAO,IAAIE,CAAI;AAAA,EAEnB,QAAQ;AAAA,EAER;AACF;;;;;;;;ACOA,UAAME,IAAQC,GAER,EAAE,MAAAC,GAAM,SAAAC,GAAS,SAAAC,EAAA,IAAYC,GAAA,GAE7BC,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO;AAClC,IAAAT,GAAA;AAEA,UAAMW,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVC,IAASC,GAAA,GACTC,IAASC,EAAI,EAAK,GAClBC,IAASD,EAA8B,EAAE,GAEzCtB,IAASwB,GAAS;AAAA,MACtB,MAAMjB,EAAM,SAAS,QAAQ;AAAA,MAC7B,OAAOA,EAAM,SAAS,SAAS;AAAA,MAC/B,SAASA,EAAM,SAAS,WAAW;AAAA,MACnC,UAAUA,EAAM,SAAS,YAAY;AAAA,MACrC,gBAAgBA,EAAM,SAAS,kBAAkB;AAAA,MACjD,OAAOA,EAAM,SAAS,SAAS;AAAA,MAC/B,UAAUA,EAAM,SAAS,YAAY;AAAA,IAAA,CACtC;AAED,mBAAekB,IAAwB;AACrC,UAAIJ,EAAO,MAAO;AAElB,MAAAA,EAAO,QAAQ,IACfE,EAAO,QAAQ,CAAA;AAEf,YAAMhC,IAAsB;AAAA,QAC1B,GAAGS;AAAA,QACH,SAASA,EAAO,WAAW;AAAA,QAC3B,UAAUA,EAAO,YAAY;AAAA,QAC7B,gBAAgBA,EAAO,kBAAkB;AAAA,QACzC,OAAOA,EAAO,SAAS;AAAA,MAAA;AAGzB,UAAI;AACF,QAAAU;AAAA,UACEH,EAAM,UACF,MAAMO,EAAI,YAAYP,EAAM,QAAQ,IAAIhB,CAAK,IAC7C,MAAMuB,EAAI,cAAcvB,CAAK;AAAA,QAAA,GAEnCmC,EAAM,QAAQX,EAAE,qBAAqB,CAAC;AAAA,MACxC,SAASY,GAAO;AACd,cAAMvC,IAAQuC,EAA2D;AAEzE,QAAIvC,GAAM,SAAQmC,EAAO,QAAQnC,EAAK,SACjCsC,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAClC,UAAA;AACE,QAAAN,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;2BAIEO,EAwDYC,EAAAC,EAAA,GAAA;AAAA,MAvDF,MAAMD,EAAApB,CAAA;AAAA,sDAAAA,EAAI,QAAAsB,IAAA;AAAA,MACjB,OAAOxB,EAAM,UAAUsB,EAAAd,CAAA,0BAA0Bc,EAAAd,CAAA,EAAC,mBAAA;AAAA,MAClD,OAAO;AAAA,IAAA;MA6CG,UACT,MAKW;AAAA,QALXiB,EAKWH,EAAAI,EAAA,GAAA,EALD,MAAK,QAAI;AAAA,qBACjB,MAAiF;AAAA,YAAjFD,EAAiFH,EAAAK,CAAA,GAAA;AAAA,cAAtE,SAAQ;AAAA,cAAW,gCAAOL,EAAAlB,CAAA,EAAA;AAAA,YAAO;yBAAI,MAAqB;AAAA,oBAAlBkB,EAAAd,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YACpDiB,EAEYH,EAAAK,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAU,eAAY;AAAA,cAAU,MAAML,EAAAV,CAAA;AAAA,cAAS,SAASE,EAAA;AAAA,YAAA;yBACtE,MAAqB;AAAA,oBAAlBQ,EAAAd,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;;iBA/CV,MAyCO;AAAA,QAzCPoB,EAyCO,QAAA;AAAA,UAzCA,IAAIN,EAAAV,CAAA;AAAA,UAAQ,OAAM;AAAA,UAAoB,aAAgBM,GAAM,CAAA,SAAA,CAAA;AAAA,QAAA;UACjEO,EAEeH,EAAAO,CAAA,GAAA;AAAA,YAFA,OAAOP,EAAAd,CAAA,EAAC,qBAAA;AAAA,YAA0B,OAAOQ,EAAA,MAAO;AAAA,YAAO,UAAA;AAAA,UAAA;uBACpE,MAAoD;AAAA,cAApDS,EAAoDH,EAAAQ,EAAA,GAAA;AAAA,gBAAjC,YAAArC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,QAAK+B;AAAA,gBAAG,WAAW;AAAA,cAAA;;;;UAG/CC,EAOeH,EAAAO,CAAA,GAAA;AAAA,YANZ,OAAOP,EAAAd,CAAA,EAAC,oBAAA;AAAA,YACR,MAAMc,EAAAd,CAAA,EAAC,yBAAA;AAAA,YACP,OAAOQ,EAAA,MAAO;AAAA,YACf,UAAA;AAAA,UAAA;uBAEA,MAAkD;AAAA,cAAlDS,EAAkDH,EAAAQ,EAAA,GAAA;AAAA,gBAA/B,YAAArC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,OAAI+B;AAAA,gBAAG,WAAW;AAAA,cAAA;;;;UAG9CC,EAMeH,EAAAO,CAAA,GAAA;AAAA,YALZ,OAAOP,EAAAd,CAAA,EAAC,uBAAA;AAAA,YACR,MAAMc,EAAAd,CAAA,EAAC,4BAAA;AAAA,YACP,OAAOQ,EAAA,MAAO;AAAA,UAAA;uBAEf,MAAqC;AAAA,cAArCS,EAAqCH,EAAAQ,EAAA,GAAA;AAAA,gBAAlB,YAAArC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,UAAO+B;AAAA,cAAA;;;;UAGnCC,EAEeH,EAAAO,CAAA,GAAA;AAAA,YAFA,OAAOP,EAAAd,CAAA,EAAC,oBAAA;AAAA,YAAyB,OAAOQ,EAAA,MAAO;AAAA,UAAA;uBAC5D,MAAsC;AAAA,cAAtCS,EAAsCH,EAAAQ,EAAA,GAAA;AAAA,gBAAnB,YAAArC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,WAAQ+B;AAAA,cAAA;;;;UAGpCC,EAEeH,EAAAO,CAAA,GAAA;AAAA,YAFA,OAAOP,EAAAd,CAAA,EAAC,sBAAA;AAAA,YAA2B,OAAOQ,EAAA,MAAO;AAAA,UAAA;uBAC9D,MAA4C;AAAA,cAA5CS,EAA4CH,EAAAQ,EAAA,GAAA;AAAA,gBAAzB,YAAArC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,iBAAc+B;AAAA,cAAA;;;;UAG1CC,EAMeH,EAAAO,CAAA,GAAA;AAAA,YALZ,OAAOP,EAAAd,CAAA,EAAC,qBAAA;AAAA,YACR,MAAMc,EAAAd,CAAA,EAAC,0BAAA;AAAA,YACP,OAAOQ,EAAA,MAAO;AAAA,UAAA;uBAEf,MAAgD;AAAA,cAAhDS,EAAgDH,EAAAU,EAAA,GAAA;AAAA,gBAA1B,YAAAvC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,QAAK+B;AAAA,gBAAG,MAAM;AAAA,cAAA;;;;UAGzBxB,EAAM,gBAA1BqB,EAEeC,EAAAO,CAAA,GAAA;AAAA;YAFqB,MAAMP,EAAAd,CAAA,EAAC,6BAAA;AAAA,UAAA;uBACzC,MAA4E;AAAA,cAA5EiB,EAA4EH,EAAAW,EAAA,GAAA;AAAA,gBAAxD,YAAAxC,EAAO;AAAA,gBAAP,uBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAP,MAAA/B,EAAO,WAAQ+B;AAAA,gBAAG,OAAOF,EAAAd,CAAA,EAAC,wBAAA;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;ACjGtD,UAAMR,IAAQC,GAERK,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO;AAClC,IAAAT,GAAA;AAEA,UAAMW,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVuB,IAAWnB,EAAe,EAAE,GAC5BoB,IAAUpB,EAAI,EAAI,GAElBqB,IAAY9B,EAAQ,IAAI,cAAc,GAEtC+B,IAAOC,GAAmDC,EAAa,GAEvEC,IAAUC,EAAiC,MAAM;AAAA,MACrD,EAAE,KAAK,SAAS,OAAOjC,EAAE,qBAAqB,GAAG,UAAU,IAAA;AAAA,MAC3D,EAAE,KAAK,WAAW,OAAOA,EAAE,uBAAuB,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,MAC/E,EAAE,KAAK,eAAe,OAAOA,EAAE,qBAAqB,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,MAC1E,EAAE,KAAK,WAAW,OAAO,IAAI,OAAO,KAAK,OAAO,QAAA;AAAA,IAAQ,CACzD;AAED,mBAAekC,IAAsB;AACnC,MAAAP,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAD,EAAS,QAAQ,MAAM3B,EAAI,SAAA;AAAA,MAC7B,SAASa,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAe,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,IAAKO,EAAA;AAEL,mBAAeC,EAAMC,GAAwC;AAC3D,MAAI,MAAMP,EAAK,EAAE,SAAAO,GAAS,WAASF,EAAA;AAAA,IACrC;AAEA,UAAMG,IAAUJ;AAAA,MAAyB,MACvCL,IACI;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,OAAO5B,EAAE,mBAAmB;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK,MAAA;AAAM,YAAKmC,EAAM,IAAI;AAAA;AAAA,QAAA;AAAA,MAC5B,IAEF,CAAA;AAAA,IAAC;2BAKLtB,EAmCiBC,EAAAwB,EAAA,GAAA;AAAA,MAlCd,OAAOxB,EAAAd,CAAA,EAAC,gBAAA;AAAA,MACR,MAAMR,EAAM;AAAA,MACZ,cAAYsB,EAAAd,CAAA,EAAC,YAAA;AAAA,MACb,SAASqC,EAAA;AAAA,IAAA;iBAEV,MA4BW;AAAA,QA5BXpB,EA4BWH,EAAAyB,EAAA,GAAA;AAAA,UA3BR,MAAMb,EAAA;AAAA,UACN,SAASM,EAAA;AAAA,UACV,WAAQ;AAAA,UACR,OAAA;AAAA,UACA,QAAO;AAAA,UACN,SAASL,EAAA;AAAA,UACT,eAAa;AAAA,UACb,cAAYD,QAAS,iBAAiBC,EAAA,QAAUb,EAAAd,CAAA,EAAC,sBAAA,IAA2B;AAAA,UAC5E,cAAYc,EAAAd,CAAA,EAAC,gBAAA;AAAA,QAAA;UAEH,cAAUwC,EACnB,CAIM,EALiB,KAAAC,QAAG;AAAA,YAC1BrB,EAIM,OAJNsB,IAIM;AAAA,cAHJzB,EAA2DH,EAAA6B,CAAA,GAAA;AAAA,gBAAlD,UAAA;AAAA,gBAAS,QAAO;AAAA,cAAA;2BAAS,MAAe;AAAA,kBAAZC,EAAAC,EAAAJ,EAAI,KAAK,GAAA,CAAA;AAAA,gBAAA;;;cAC9CxB,EAA6DH,EAAA6B,CAAA,GAAA;AAAA,gBAApD,MAAK;AAAA,gBAAK,MAAK;AAAA,gBAAQ,MAAA;AAAA,cAAA;2BAAK,MAAc;AAAA,kBAAXC,EAAAC,EAAAJ,EAAI,IAAI,GAAA,CAAA;AAAA,gBAAA;;;cAChCA,EAAI,iBAApB5B,EAAoFC,EAAAgC,CAAA,GAAA;AAAA;gBAAtD,MAAK;AAAA,cAAA;2BAAK,MAAiC;AAAA,sBAA9BhC,EAAAd,CAAA,EAAC,wBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;UAIrC,gBAAYwC,EACrB,CAAgF,EADvD,KAAAC,QAAG;AAAA,YAC5BxB,EAAgFH,EAAA6B,CAAA,GAAA;AAAA,cAAvE,MAAK;AAAA,cAAK,MAAK;AAAA,cAAQ,MAAA;AAAA,cAAK,UAAA;AAAA,YAAA;yBAAS,MAAwB;AAAA,gBAArBC,EAAAC,EAAAJ,EAAI,WAAO,GAAA,GAAA,CAAA;AAAA,cAAA;;;;UAGnD,gBAAYD,EACrB,CAEY,EAHa,KAAAC,QAAG;AAAA,YACX3B,EAAAc,CAAA,UAAjBf,EAEYC,EAAAK,CAAA,GAAA;AAAA;cAFgB,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAW,SAAK,CAAAH,MAAEmB,EAAMM,CAAG;AAAA,YAAA;yBACvE,MAAqB;AAAA,oBAAlB3B,EAAAd,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;oEC7GD+C,KAA2C;AAAA,EACtD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AACb,GAEaC,KAA6C;AAAA,EACxD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AACb,GAEaC,KAA6C;AAAA,EACxD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;;;;;;;;ACUA,UAAMzD,IAAQC,GAKRK,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO,GAC5BoD,IAAQC,GAAA,GACRC,IAASC,GAAA;AACf,IAAAhE,GAAA;AAEA,UAAMW,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEV7B,IAAOiC,EAAuB,IAAI,GAClCmB,IAAWnB,EAAe,EAAE,GAC5BtB,IAASsB,EAAiB,EAAE,GAC5B+C,IAAW/C,EAAI,EAAE,GACjBoB,IAAUpB,EAAI,EAAI,GAClBD,IAASC,EAAI,EAAK,GAClBC,IAASD,EAA8B,EAAE,GAEzCqB,IAAY9B,EAAQ,IAAI,cAAc,GAEtCyD,IAAQtB,EAAS,MAAM3D,EAAK,UAAU,QAAQA,EAAK,MAAM,WAAW,OAAO,GAG3EkF,IAASvB;AAAA,MAAkB,MAC/BsB,EAAM,QACF,MACCjF,EAAK,OAAO,UAAU,CAAA,GAAI;AAAA,QACzB,CAACO,MAAUA,EAAM,WAAW,aAAaA,EAAM,WAAW;AAAA,MAAA;AAAA,IAC5D,GAGA4E,IAAUxB,EAAS,MAAM,KAAK,UAAUhD,EAAO,KAAK,CAAC,GACrDyE,IAAQzB,EAAS,MAAMqB,EAAS,UAAU,MAAMG,EAAQ,UAAUH,EAAS,KAAK,GAEhFK,IAAQ1B,EAAyC,MACjD3B,EAAO,QAAc,WAElBoD,EAAM,SAASlE,EAAM,OAAO,OAAO,YAAY,OACvD,GAGKoE,IAAQ3B,EAAgB,MAAM;AAClC,YAAM4B,IAAa;AAAA,QACjB;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,YACL,SAASnC,EAAS,MACf,OAAO,CAACU,MAAY,CAACA,EAAQ,YAAYA,EAAQ,OAAOnD,EAAO,MAAM,UAAU,EAC/E,IAAI,CAACmD,OAAa,EAAE,OAAOA,EAAQ,OAAO,OAAOA,EAAQ,GAAA,EAAK;AAAA;AAAA,YAEjE,UAAU5C,EAAM,OAAO;AAAA,UAAA;AAAA,QACzB;AAAA,MACF;AAGF,UAAI,CAAC+D,EAAM;AACT,mBAAWO,KAAU,CAAC,SAAS,UAAU,QAAQ,YAAY;AAC3D,UAAAD,EAAI,KAAK,EAAE,IAAI,OAAO,QAAAC,GAAQ,OAAO,EAAE,UAAU,GAAA,GAAQ;AAI7D,aAAOD;AAAA,IACT,CAAC;AAED,aAASE,EAASlF,GAA0B;AAC1C,aAAO;AAAA,QACL,IAAIA,EAAM;AAAA,QACV,OAAOA,EAAM;AAAA,QACb,OAAOA,EAAM,SAAS;AAAA,QACtB,YAAYA,EAAM,cAAc;AAAA,QAChC,aAAaA,EAAM;AAAA,MAAA;AAAA,IAEvB;AAEA,aAASmF,GAAKC,GAAiC;AAC7C,MAAA3F,EAAK,QAAQ2F;AAEb,YAAMC,IAAqBD,IACvB;AAAA,QACE,YAAYvC,EAAS,MAAM,KAAK,CAACU,MAAYA,EAAQ,SAAS6B,EAAO,OAAO,GAAG,MAAM;AAAA,QACrF,OAAOA,EAAO;AAAA,QACd,UAAUA,EAAO;AAAA,QACjB,QAAQA,EAAO,UAAU;AAAA,QACzB,MAAMA,EAAO,QAAQ;AAAA,QACrB,YAAYA,EAAO,cAAc;AAAA,QACjC,QAAQA,EAAO,OACZ;AAAA,UACC,CAACpF,MAAUoF,EAAO,WAAW,WAAW,CAAC,WAAW,OAAO,EAAE,SAASpF,EAAM,MAAM;AAAA,QAAA,EAEnF,IAAIkF,CAAQ;AAAA,MAAA,IAEjB;AAAA,QACE,YACE,OAAOb,EAAM,MAAM,OAAO,KAC1BxB,EAAS,MAAM,KAAK,CAACU,MAAY,CAACA,EAAQ,QAAQ,GAAG,MACrD;AAAA,QACF,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,QAAQ,CAAC,EAAE,OAAO,IAAI,OAAO,IAAI,YAAY,IAAI,aAAa,OAAA,CAAQ;AAAA,MAAA;AAG5E,MAAAnD,EAAO,QAAQiF,GACfZ,EAAS,QAAQ,KAAK,UAAUY,CAAK;AAAA,IACvC;AAEA,mBAAehC,KAAsB;AACnC,MAAAP,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAD,EAAS,QAAQ,MAAM3B,EAAI,SAAA,GAC3BiE,GAAKxE,EAAM,OAAO,OAAO,OAAO,MAAMO,EAAI,KAAKP,EAAM,EAAE,CAAC;AAAA,MAC1D,SAASoB,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC,GACtBwC,EAAO,KAAK5D,EAAM,IAAI;AAAA,MAC7B,UAAA;AACE,QAAAmC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAOA,aAASwC,IAA6B;AACpC,YAAMC,IAAQ,MAAM,QAAQnF,EAAO,MAAM,MAAM,IAAIA,EAAO,MAAM,SAAS,CAAA,GACnEoF,IAAQ,CAAC5B,OAAiC;AAAA,QAC9C,GAAIA,EAAI,KAAK,EAAE,IAAIA,EAAI,GAAA,IAAO,CAAA;AAAA,QAC9B,OAAOA,EAAI,SAAS;AAAA,QACpB,OAAOA,EAAI,SAAS;AAAA,QACpB,YAAYA,EAAI,cAAc;AAAA,QAC9B,aAAaA,EAAI,eAAe;AAAA,MAAA;AAGlC,UAAIc,EAAM,MAAO,QAAOa,EAAK,IAAIC,CAAK;AAEtC,YAAMC,IAAWF,EAAK,OAAO,CAAC3B,MAAQA,EAAI,EAAE,GACtC8B,KAAQH,EAAK,OAAO,CAAC3B,MAAQ,CAACA,EAAI,EAAE,GACpC+B,IAAoC,CAAA;AAE1C,iBAAW3F,KAAS2E,EAAO,MAAO,CAAAgB,EAAM3F,EAAM,WAAW,CAAC,IAAI,EAAE,IAAIA,EAAM,GAAA;AAE1E,UAAI4F,IAAO;AACX,YAAMC,IAAQlB,EAAO,MAAM,SAASc,EAAS;AAE7C,eAASK,IAAQ,GAAGA,IAAQD,GAAOC,KAAS;AAC1C,QAAIH,EAAMG,CAAK,MAAM,WAAWH,EAAMG,CAAK,IAAIN,EAAMC,EAASG,GAAM,CAAE;AAGxE,aAAO,CAAC,GAAID,GAAwB,GAAGD,GAAM,IAAIF,CAAK,CAAC;AAAA,IACzD;AAEA,aAAS7F,IAAmB;AAC1B,YAAMoG,IAAI3F,EAAO;AAEjB,aAAKsE,EAAM,QAIJ;AAAA,QACL,YAAY,OAAOqB,EAAE,cAAe,WAAWA,EAAE,aAAa;AAAA,QAC9D,OAAO,OAAOA,EAAE,SAAS,EAAE;AAAA,QAC3B,UAAUA,EAAE;AAAA,QACZ,QAAQA,EAAE,SAAS,OAAOA,EAAE,MAAM,IAAI;AAAA,QACtC,MAAMA,EAAE,OAAO,OAAOA,EAAE,IAAI,IAAI;AAAA,QAChC,YAAYA,EAAE,aAAa,OAAOA,EAAE,UAAU,IAAI;AAAA,QAClD,QAAQT,EAAA;AAAA,MAAa,IAVd,EAAE,UAAUS,EAAE,UAAmC,QAAQT,IAAa;AAAA,IAYjF;AAEA,mBAAeU,IAAsB;AACnC,UAAI,EAAAvE,EAAO,SAAS,CAACsB,IAErB;AAAA,QAAAtB,EAAO,QAAQ,IACfE,EAAO,QAAQ,CAAA;AAEf,YAAI;AACF,gBAAMsE,IAAOtF,EAAM,OAAO,MACpByE,IAASa,IAAO,MAAM/E,EAAI,OAAOvB,EAAA,CAAO,IAAI,MAAMuB,EAAI,KAAKP,EAAM,IAAchB,GAAO;AAG5F,UAAA8E,EAAS,QAAQG,EAAQ,OACzB9C,EAAM,QAAeX,EAAP8E,IAAS,kBAAqB,aAAN,CAAoB,GAC1D,MAAM1B,EAAO,KAAK,GAAG5D,EAAM,IAAI,IAAIyE,EAAO,EAAE,EAAE;AAAA,QAChD,SAASrD,GAAO;AACd,gBAAMvC,IAAQuC,EAA2D;AAEzE,UAAIvC,GAAM,UACRmC,EAAO,QAAQnC,EAAK,QACpBsC,EAAM,OAAOX,EAAE,mBAAmB,CAAC,KAEnCW,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,QAE/B,UAAA;AACE,UAAAN,EAAO,QAAQ;AAAA,QACjB;AAAA;AAAA,IACF;AAEA,aAASyE,GAAWC,GAAgC;AAClD,MAAItB,EAAM,SAAOsB,EAAM,eAAA;AAAA,IACzB;AAEA,aAASC,GAAUD,GAA4B;AAC7C,OAAKA,EAAM,WAAWA,EAAM,YAAYA,EAAM,IAAI,YAAA,MAAkB,QAClEA,EAAM,eAAA,GACDH,EAAA;AAAA,IAET;AAEA,IAAAK,GAAYD,EAAS,GAErBE,GAAU,MAAM;AACd,MAAKjD,GAAA,GACL,OAAO,iBAAiB,gBAAgB6C,EAAU;AAAA,IACpD,CAAC,GAEDK,GAAgB,MAAM;AACpB,aAAO,oBAAoB,gBAAgBL,EAAU;AAAA,IACvD,CAAC,GAEDM,GAAmB,YACb,CAAC3B,EAAM,SAAS,CAAC9B,IAAkB,KAEhC,MAAM0D,GAAQ;AAAA,MACnB,OAAOtF,EAAE,mBAAmB;AAAA,MAC5B,SAASA,EAAE,kBAAkB;AAAA,MAC7B,aAAaA,EAAE,aAAa;AAAA,MAC5B,YAAYA,EAAE,YAAY;AAAA,MAC1B,MAAM;AAAA,IAAA,CACP,CACF;AAED,UAAMuF,KAAQtD;AAAA,MAAS,MACrBzC,EAAM,OAAO,OAAOQ,EAAE,WAAW,IAAI1B,EAAK,OAAO,SAAS0B,EAAE,gBAAgB;AAAA,IAAA;2BAK5EwF,EAoDM,OAAA;AAAA,MApDD,OAAM;AAAA,MAAgB,WAAAP;AAAA,IAAA;MACNtD,EAAA,cAAnBd,EAA8CC,EAAA2E,EAAA,GAAA;AAAA;QAAlB,OAAA;AAAA,QAAO,MAAM;AAAA,MAAA,YAEzCD,EAgDWE,GAAA,EAAA,KAAA,KAAA;AAAA,QA/CTzE,EAKEH,EAAA6E,EAAA,GAAA;AAAA,UAJC,MAAMnG,EAAM,cAAcA,EAAM,OAAI,GAAMA,EAAM,IAAI,IAAIA,EAAM,EAAE;AAAA,UAChE,cAAYsB,EAAAd,CAAA,EAAC,YAAA;AAAA,UACb,OAAOuF,GAAA;AAAA,UACP,UAAUjH,EAAA,OAAM;AAAA,QAAA;QAGHkB,EAAM,OAAE,QAAakC,EAAA,MAAS,WAAM,UAApDb,EAEWC,EAAA8E,EAAA,GAAA;AAAA;UAFiD,MAAK;AAAA,QAAA;qBAC/D,MAA6B;AAAA,gBAA1B9E,EAAAd,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QAGWuD,EAAA,0BAAjB1C,EAA6EC,EAAA8E,EAAA,GAAA;AAAA;UAArD,MAAK;AAAA,QAAA;qBAAO,MAA8B;AAAA,gBAA3B9E,EAAAd,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QAEzBwD,EAAA,MAAO,SAAM,UAA5B3C,EAUUC,EAAA+E,EAAA,GAAA;AAAA;UAVyB,OAAO/E,EAAAd,CAAA,EAAC,qBAAA;AAAA,QAAA;qBACzC,MAAsE;AAAA,YAAtEiB,EAAsEH,EAAA6B,CAAA,GAAA;AAAA,cAA7D,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAA4B;AAAA,oBAAzB7B,EAAAd,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YACpCoB,EAOK,MAPLsB,IAOK;AAAA,sBANH8C,EAKKE,GAAA,MAAAI,GALetC,EAAA,OAAM,CAAf3E,YAAX2G,EAKK,MAAA;AAAA,gBALwB,KAAK3G,EAAM;AAAA,cAAA;gBACtCoC,EAAmEH,EAAA6B,CAAA,GAAA,EAA1D,UAAA,MAAQ;AAAA,6BAAC,MAAoB;AAAA,oBAAjBC,EAAAC,EAAAhE,EAAM,QAAQ,IAAG,OAAEgE,EAAGhE,EAAM,KAAK,GAAA,CAAA;AAAA,kBAAA;;;gBACtDoC,EAEWH,EAAAgC,CAAA,GAAA;AAAA,kBAFD,MAAK;AAAA,kBAAM,MAAMhC,EAAAkC,EAAA,EAAWnE,EAAM,MAAM;AAAA,gBAAA;6BAChD,MAAsC;AAAA,wBAAnCiC,EAAAd,CAAA,EAAC,eAAgBnB,EAAM,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;;QAMxCoC,EAMEH,EAAAiF,EAAA,GAAA;AAAA,sBALS9G,EAAA;AAAA,wDAAAA,EAAM,QAAA+B;AAAA,UACf,MAAK;AAAA,UACJ,OAAO4C,EAAA;AAAA,UACP,QAAQpD,EAAA;AAAA,UACR,UAAQ,CAAGM,EAAAc,CAAA,KAAatB,EAAA;AAAA,QAAA;QAGNQ,EAAAc,CAAA,UAArBf,EAagBC,EAAAkF,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,UAZH,SACT,MAAgC;AAAA,YAAhC/E,EAAgCH,EAAAmF,EAAA,GAAA,EAAhB,OAAOtC,EAAA,SAAK,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UAAA;qBAG9B,MAOY;AAAA,YAPZ1C,EAOYH,EAAAK,CAAA,GAAA;AAAA,cANV,MAAK;AAAA,cACJ,SAASb,EAAA;AAAA,cACT,UAAQ,CAAIoD,WAASlE,EAAM,OAAE,QAAckC,EAAA,MAAS,WAAM;AAAA,cAC1D,SAAOmD;AAAA,YAAA;yBAER,MAAqB;AAAA,oBAAlB/D,EAAAd,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;ACnUd,UAAMR,IAAQC,GAERyG,IAAOjE,EAAS,MAAOzC,EAAM,SAAS2G,GAAe3G,EAAM,MAAM,IAAI,EAAG;qBAI5D0G,EAAA,cAAhBrF,EAAyEC,EAAAsF,EAAA,GAAA;AAAA;MAAnD,OAAM;AAAA,MAAqB,MAAMF,EAAA;AAAA,MAAM,MAAK;AAAA,IAAA,yBACpDzG,EAAA,cAAd+F,EAAuE,KAAvE9C,IAAuEG,EAAZpD,EAAA,KAAK,GAAA,CAAA;;;;;;;;;;;;;;;;;;ACPlE,UAAMD,IAAQC,GAaR,EAAE,MAAAC,GAAM,SAAAC,GAAS,SAAAC,EAAA,IAAYC,GAAA,GAE7BO,IAASC,GAAA,GACTgG,IAAO9F,EAAI,EAAE,GACb+F,IAAOC,GAAgC,MAAM;AAEnD,IAAApB,GAAU,YAAY;AACpB,YAAMqB,GAAA,GACNF,EAAK,OAAO,cAAc,UAAU,GAAG,MAAA;AAAA,IACzC,CAAC;AAED,aAAS5F,IAAe;AACtB,MAAIlB,EAAM,YAAY6G,EAAK,MAAM,KAAA,MAAW,MAE5C1G,EAAQ0G,EAAK,MAAM,MAAM;AAAA,IAC3B;2BAIExF,EAsBYC,EAAAC,EAAA,GAAA;AAAA,MAtBO,MAAMD,EAAApB,CAAA;AAAA,sDAAAA,EAAI,QAAAsB,IAAA;AAAA,MAAG,OAAOxB,EAAM;AAAA,MAAQ,OAAO;AAAA,IAAA;MAS/C,UACT,MAUW;AAAA,QAVXyB,EAUWH,EAAAI,EAAA,GAAA,EAVD,MAAK,QAAI;AAAA,qBACjB,MAAkF;AAAA,YAAlFD,EAAkFH,EAAAK,CAAA,GAAA;AAAA,cAAvE,SAAQ;AAAA,cAAW,gCAAOL,EAAAlB,CAAA,EAAA;AAAA,YAAO;yBAAI,MAAsB;AAAA,gBAAnBgD,EAAAC,EAAArD,EAAM,UAAU,GAAA,CAAA;AAAA,cAAA;;;YACnEyB,EAOYH,EAAAK,CAAA,GAAA;AAAA,cANT,MAAM3B,EAAM,SAAM,WAAA;AAAA,cACnB,eAAY;AAAA,cACX,MAAMsB,EAAAV,CAAA;AAAA,cACN,UAAUZ,EAAM,YAAY6G,EAAA,MAAK,WAAI;AAAA,YAAA;yBAEtC,MAAuB;AAAA,gBAApBzD,EAAAC,EAAArD,EAAM,WAAW,GAAA,CAAA;AAAA,cAAA;;;;;;;iBAjB1B,MAAqF;AAAA,QAA5EA,EAAM,WAAfiH,EAAA,GAAAjB,EAAqF,KAArF9C,IAAqFG,EAApBrD,EAAM,OAAO,GAAA,CAAA;QAE9E4B,EAIO,QAAA;AAAA,UAJA,IAAIN,EAAAV,CAAA;AAAA,mBAAY;AAAA,UAAJ,KAAIkG;AAAA,UAAQ,aAAgB5F,GAAM,CAAA,SAAA,CAAA;AAAA,QAAA;UACnDO,EAEeH,EAAAO,CAAA,GAAA;AAAA,YAFA,OAAO7B,EAAM;AAAA,YAAQ,UAAUA,EAAM;AAAA,UAAA;uBAClD,MAAkE;AAAA,cAAlEyB,EAAkEH,EAAAU,EAAA,GAAA;AAAA,4BAA5C6E,EAAA;AAAA,8DAAAA,EAAI,QAAArF;AAAA,gBAAG,MAAM;AAAA,gBAAI,cAAYxB,EAAM;AAAA,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACDjE,UAAMA,IAAQC,GAERK,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO,GAC5BsD,IAASC,GAAA;AACf,IAAAhE,GAAA;AAEA,UAAM,IAAIY,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEV7B,IAAOiC,EAAuB,IAAI,GAClCoB,IAAUpB,EAAI,EAAI,GAClBmG,IAAOnG,EAAI,EAAK,GAChBb,IAAOa,EAAyB,EAAE,GAClCoG,IAAUpG,EAAI,EAAE,GAEhBqB,IAAY9B,EAAQ,IAAI,cAAc,GACtC8G,IAAY9G,EAAQ,IAAI,cAAc,GACtC+G,IAAU/G,EAAQ,IAAI,YAAY,GAClCgH,IAAalF,KAAagF,KAAaC,GAEvCE,IAAMjF,GAAoEkF,EAAe,GAEzFC,IAAShF,EAAS,MAAM3D,EAAK,OAAO,WAAW,UAAUA,EAAK,OAAO,WAAW,WAAW;AAGjG,aAAS4I,EAAQjD,GAAuC;AACtD,aACEA,EAAO,OAAO,KAAK,CAACpF,MAAUA,EAAM,WAAW,YAAYA,EAAM,WAAW,SAAS,KACrFoF,EAAO,OAAO,KAAK,CAACpF,MAAU,CAAC,CAAC,QAAQ,aAAa,SAAS,EAAE,SAASA,EAAM,MAAM,CAAC;AAAA,IAE1F;AAEA,aAASmF,EAAKC,GAA0B;AAGtC,UAFA3F,EAAK,QAAQ2F,GAERvE,EAAK,MAAmB,WAAW,GAAG;AACzC,cAAMyH,IAAQD,EAAQjD,CAAM;AAC5B,QAAAvE,EAAK,QAAQyH,IAAQ,CAAC,OAAOA,EAAM,EAAE,CAAC,IAAI,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,mBAAejF,IAAsB;AACnC,MAAAP,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAqC,EAAK,MAAMjE,EAAI,KAAKP,EAAM,EAAE,CAAC;AAAA,MAC/B,SAASoB,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC,GACtBwC,EAAO,KAAK5D,EAAM,IAAI;AAAA,MAC7B,UAAA;AACE,QAAAmC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,IAAAyF,GAAM,MAAM5H,EAAM,IAAI0C,GAAM,EAAE,WAAW,IAAM;AAM/C,mBAAemF,EAAIC,GAAiCC,GAA6B;AAC/E,UAAI,CAAAb,EAAK,OAET;AAAA,QAAAA,EAAK,QAAQ;AAEb,YAAI;AACF,UAAA1C,EAAK,MAAMsD,GAAM,GACjB3G,EAAM,QAAQ4G,CAAI,GAEbzH,EAAQ,gBAAA;AAAA,QACf,SAASc,GAAO;AACd,UAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC,GAC3B,MAAMsB,EAAA;AAAA,QACR,UAAA;AACE,UAAAwE,EAAK,QAAQ;AAAA,QACf;AAAA;AAAA,IACF;AAEA,mBAAec,IAAuB;AACpC,YAAM/D,IAAUnF,EAAK;AACrB,MAAImF,KAAS,MAAM4D,EAAI,MAAMtH,EAAI,MAAM0D,EAAQ,EAAE,GAAG,EAAE,eAAe,CAAC;AAAA,IACxE;AAEA,mBAAegE,KAA4B;AACzC,YAAMhE,IAAUnF,EAAK;AACrB,UAAI,CAACmF,EAAS;AAEd,YAAM9E,IAAS,MAAMoI,EAAI;AAAA,QACvB,OAAO,EAAE,2BAA2B,EAAE,OAAOtD,EAAQ,OAAO;AAAA,QAC5D,SAAS,EAAE,wBAAwB;AAAA,QACnC,OAAO,EAAE,YAAY;AAAA,QACrB,aAAa,EAAE,mBAAmB;AAAA,QAClC,YAAY,EAAE,YAAY;AAAA,QAC1B,QAAQ;AAAA,MAAA,CACT;AAED,MAAI9E,KAAW,QACb,MAAM0I,EAAI,MAAMtH,EAAI,OAAO0D,EAAQ,IAAI9E,CAAM,GAAG,EAAE,iBAAiB,CAAC;AAAA,IAExE;AAEA,mBAAe+I,GAAO7I,GAA6B;AAQjD,MAPe,MAAMyG,GAAQ;AAAA,QAC3B,OAAO,EAAE,sBAAsB,EAAE,OAAOzG,EAAM,OAAO;AAAA,QACrD,SAAS,EAAE,mBAAmB;AAAA,QAC9B,aAAa,EAAE,cAAc;AAAA,QAC7B,YAAY,EAAE,YAAY;AAAA,MAAA,CAC3B,KAEW,MAAMwI,EAAI,MAAMtH,EAAI,OAAOlB,EAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACvE;AAEA,mBAAe8I,EAAO9I,GAA6B;AACjD,YAAME,IAAU,MAAMgI,EAAI;AAAA,QACxB,OAAO,EAAE,sBAAsB,EAAE,OAAOlI,EAAM,OAAO;AAAA,QACrD,OAAO,EAAE,oBAAoB;AAAA,QAC7B,aAAa,EAAE,cAAc;AAAA,QAC7B,YAAY,EAAE,YAAY;AAAA,QAC1B,UAAU;AAAA,MAAA,CACX;AAED,MAAIE,KAAS,MAAMsI,EAAI,MAAMtH,EAAI,OAAOlB,EAAM,IAAIE,CAAO,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACjF;AAEA,mBAAeC,EAAOH,GAA6B;AACjD,YAAMwH,IAAO,MAAMU,EAAI;AAAA,QACrB,OAAO,EAAE,oBAAoB;AAAA,QAC7B,SAASa,GAAS/I,CAAK,GAAG,QAAQ;AAAA,QAClC,OAAO,EAAE,oBAAoB;AAAA,QAC7B,aAAa,EAAE,YAAY;AAAA,QAC3B,YAAY,EAAE,YAAY;AAAA,QAC1B,UAAU;AAAA,MAAA,CACX;AAED,MAAIwH,KAAM,MAAMgB,EAAI,MAAMtH,EAAI,QAAQlB,EAAM,IAAIwH,CAAI,GAAG,EAAE,gBAAgB,CAAC;AAAA,IAC5E;AAEA,mBAAewB,EAAQhJ,GAA6B;AASlD,MARe,MAAMyG,GAAQ;AAAA,QAC3B,OAAO,EAAE,uBAAuB,EAAE,OAAOzG,EAAM,OAAO;AAAA,QACtD,SAAS,EAAE,oBAAoB;AAAA,QAC/B,aAAa,EAAE,eAAe;AAAA,QAC9B,YAAY,EAAE,YAAY;AAAA,QAC1B,MAAM;AAAA,MAAA,CACP,KAEW,MAAMwI,EAAI,MAAMtH,EAAI,QAAQlB,EAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;AAAA,IACxE;AAEA,mBAAeiJ,GAAYjJ,GAA6B;AAStD,MARe,MAAMyG,GAAQ;AAAA,QAC3B,OAAO,EAAE,4BAA4B,EAAE,OAAOzG,EAAM,OAAO;AAAA,QAC3D,SAAS,EAAE,yBAAyB;AAAA,QACpC,aAAa,EAAE,oBAAoB;AAAA,QACnC,YAAY,EAAE,YAAY;AAAA,QAC1B,MAAM;AAAA,MAAA,CACP,KAEW,MAAMwI,EAAI,MAAMtH,EAAI,YAAYlB,EAAM,EAAE,GAAG,EAAE,uBAAuB,CAAC;AAAA,IACnF;AAEA,mBAAekJ,KAAsB;AACnC,YAAMtE,IAAUnF,EAAK,OACfD,IAAOsI,EAAQ,MAAM,KAAA;AAE3B,MAAI,CAAClD,KAAWpF,MAAS,OAEzB,MAAMgJ,EAAI,MAAMtH,EAAI,QAAQ0D,EAAQ,IAAIpF,CAAI,GAAG,EAAE,iBAAiB,CAAC,GACnEsI,EAAQ,QAAQ;AAAA,IAClB;AAGA,aAASiB,GAAS/I,GAAwC;AACxD,aAAO,CAAC,GAAIP,EAAK,OAAO,WAAW,CAAA,CAAG,EACnC,UACA,KAAK,CAAC0J,MAAUA,EAAM,aAAanJ,EAAM,MAAMmJ,EAAM,SAAS,UAAU;AAAA,IAC7E;AAGA,aAASC,EAAMpJ,GAAoF;AACjG,UAAIoI,EAAO,MAAO,QAAO,CAAA;AAEzB,YAAMiB,IAA6E,CAAA;AAEnF,aAAIrJ,EAAM,WAAW,YAAY+H,MAC/BsB,EAAK,KAAK;AAAA,QACR,KAAK;AAAA,QACL,OAAO,EAAE,cAAc;AAAA,QACvB,SAAS;AAAA,QACT,KAAK,MAAA;AAAM,UAAKR,GAAO7I,CAAK;AAAA;AAAA,MAAA,CAC7B,GACDqJ,EAAK,KAAK,EAAE,KAAK,UAAU,OAAO,EAAE,cAAc,GAAG,KAAK,MAAA;AAAM,QAAKP,EAAO9I,CAAK;AAAA,SAAG,IAGlFA,EAAM,WAAW,aAAa+C,KAChCsG,EAAK,KAAK;AAAA,QACR,KAAK;AAAA,QACL,OAAO,EAAE,cAAc;AAAA,QACvB,SAAS;AAAA,QACT,KAAK,MAAA;AAAM,UAAKlJ,EAAOH,CAAK;AAAA;AAAA,MAAA,CAC7B,GAGCA,EAAM,WAAW,kBAAkB+C,KAAaiF,MAClDqB,EAAK,KAAK,EAAE,KAAK,WAAW,OAAO,EAAE,eAAe,GAAG,KAAK,MAAA;AAAM,QAAKL,EAAQhJ,CAAK;AAAA,SAAG,GAGrF+C,KAAa,CAAC,CAAC,QAAQ,WAAW,EAAE,SAAS/C,EAAM,MAAM,KAC3DqJ,EAAK,KAAK,EAAE,KAAK,UAAU,OAAO,EAAE,oBAAoB,GAAG,KAAK,MAAA;AAAM,QAAKJ,GAAYjJ,CAAK;AAAA,SAAG,GAG1FqJ;AAAA,IACT;AAEA,aAASC,EAAYH,GAAoC;AACvD,aAAO1J,EAAK,OAAO,OAAO,KAAK,CAACO,MAAUA,EAAM,OAAOmJ,EAAM,QAAQ,GAAG,YAAY;AAAA,IACtF;AAGA,aAAST,EAAKS,GAA6B;AACzC,YAAMI,IAAO,OAAOJ,EAAM,MAAM,QAAS,WAAWA,EAAM,KAAK,OAAO,MAChEK,IAAK,OAAOL,EAAM,MAAM,MAAO,WAAWA,EAAM,KAAK,KAAK;AAEhE,UAAIA,EAAM,SAAS,YAAYK,MAAO,MAAM;AAC1C,cAAMC,IAAQ,CAACC,OACbP,EAAM,aAAa,OAAO,EAAE,gBAAgBO,EAAM,EAAE,IAAI,EAAE,eAAeA,EAAM,EAAE;AAEnF,eAAOH,MAAS,OAAOE,EAAMD,CAAE,IAAI,GAAGC,EAAMF,CAAI,CAAC,MAAME,EAAMD,CAAE,CAAC;AAAA,MAClE;AAEA,aAAO,EAAE,cAAcL,EAAM,IAAI,EAAE;AAAA,IACrC;AAEA,UAAM3F,KAAUJ,EAAyB,MAAM;AAC7C,YAAMwB,IAAUnF,EAAK;AAErB,UAAI,CAACmF,KAAW,CAAC7B,UAAkB,CAAA;AAEnC,YAAMsG,IAAuB,CAAA;AAE7B,aAAIzE,EAAQ,WAAW,WACrByE,EAAK,KAAK;AAAA,QACR,KAAK;AAAA,QACL,OAAO,EAAE,aAAa;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,KAAK,MAAA;AAAM,UAAKV,EAAA;AAAA;AAAA,MAAM,CACvB,GAGEP,EAAO,UACViB,EAAK,KAAK;AAAA,QACR,KAAK;AAAA,QACL,OAAO,EAAE,YAAY;AAAA,QACrB,MAAM;AAAA,QACN,KAAK,MAAA;AAAM,UAAK9E,EAAO,KAAK,GAAG5D,EAAM,IAAI,IAAIiE,EAAQ,EAAE,OAAO;AAAA;AAAA,MAAA,CAC/D,GACDyE,EAAK,KAAK;AAAA,QACR,KAAK;AAAA,QACL,OAAO,EAAE,mBAAmB;AAAA,QAC5B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,KAAK,MAAA;AAAM,UAAKT,GAAA;AAAA;AAAA,MAAW,CAC5B,IAGIS;AAAA,IACT,CAAC;sBAICzB,EAAA,GAAAjB,EAyJM,OAzJN9C,IAyJM;AAAA,MAxJef,EAAA,UAAYrD,EAAA,cAA/BuC,EAAuDC,EAAA2E,EAAA,GAAA;AAAA;QAAlB,OAAA;AAAA,QAAO,MAAM;AAAA,MAAA,MAE7BnH,EAAA,cAArBkH,EAqJWE,GAAA,EAAA,KAAA,KAAA;AAAA,QApJTzE,EAUiBH,EAAA6E,EAAA,GAAA;AAAA,UATd,MAAMnG,EAAM;AAAA,UACZ,cAAYsB,EAAA,CAAA,EAAC,YAAA;AAAA,UACb,OAAOxC,EAAA,MAAK,SAASwC,EAAA,CAAA,EAAC,gBAAA;AAAA,UACtB,UAAUxC,EAAA,MAAK;AAAA,UACf,SAAS+D,GAAA;AAAA,QAAA;UAEC,iBACT,MAA0F;AAAA,YAA1FpB,EAA0FH,EAAAgC,CAAA,GAAA;AAAA,cAA/E,MAAMhC,EAAAiC,EAAA,EAAUzE,EAAA,MAAK,MAAM;AAAA,YAAA;yBAAG,MAAsC;AAAA,oBAAnCwC,EAAA,CAAA,EAAC,gBAAiBxC,EAAA,MAAK,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;QAI7E2C,EAqBUH,EAAA+E,EAAA,GAAA,MAAA;AAAA,qBApBR,MAmBM;AAAA,YAnBNzE,EAmBM,OAnBNoH,IAmBM;AAAA,cAlBJpH,EAOM,OAPNqH,IAOM;AAAA,gBANJxH,EAEWH,EAAAgC,CAAA,GAAA;AAAA,kBAFD,SAAQ;AAAA,kBAAW,MAAMhC,EAAAmC,EAAA,EAAc3E,EAAA,MAAK,QAAQ;AAAA,gBAAA;6BAC5D,MAA0C;AAAA,wBAAvCwC,EAAA,CAAA,EAAC,kBAAmBxC,EAAA,MAAK,QAAQ,EAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAEvBA,EAAA,MAAK,eAApBuC,EAEUC,EAAA6B,CAAA,GAAA;AAAA;kBAFkB,MAAK;AAAA,kBAAK,MAAK;AAAA,kBAAQ,MAAA;AAAA,gBAAA;6BACjD,MAAuB;AAAA,oBAApBC,EAAAC,EAAA/B,EAAA,CAAA,EAAC,cAAA,CAAA,IAAmB,OAAE+B,EAAGvE,EAAA,MAAK,MAAM,GAAA,CAAA;AAAA,kBAAA;;;;cAI3C8C,EAGU,WAHVsH,IAGU;AAAA,gBAFRzH,EAAkEH,EAAA6B,CAAA,GAAA;AAAA,kBAAzD,IAAG;AAAA,kBAAK,QAAO;AAAA,gBAAA;6BAAW,MAAqB;AAAA,wBAAlB7B,EAAA,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACvCG,EAAkE0H,GAAA;AAAA,kBAAjD,QAAQrK,EAAA,MAAK;AAAA,kBAAO,OAAOwC,EAAA,CAAA,EAAC,eAAA;AAAA,gBAAA;;cAGhCxC,EAAA,MAAK,cAApBmI,KAAAjB,EAGU,WAHVoD,IAGU;AAAA,gBAFR3H,EAAwEH,EAAA6B,CAAA,GAAA;AAAA,kBAA/D,IAAG;AAAA,kBAAK,QAAO;AAAA,gBAAA;6BAAW,MAA2B;AAAA,wBAAxB7B,EAAA,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBACvCG,EAA4C0H,GAAA;AAAA,kBAA3B,QAAQrK,EAAA,MAAK;AAAA,gBAAA;;;;;;QAKpC2C,EAoEUH,EAAA+E,EAAA,GAAA;AAAA,UApEA,OAAO/E,EAAA,CAAA,EAAC,cAAA;AAAA,QAAA;qBAChB,MAkEe;AAAA,YAlEfG,EAkEeH,EAAA+H,EAAA,GAAA;AAAA,0BAlEQnJ,EAAA;AAAA,4DAAAA,EAAI,QAAAsB;AAAA,cAAE,UAAA;AAAA,YAAA;yBAEzB,MAA4B;AAAA,iBAD9ByF,EAAA,EAAA,GAAAjB,EAgEoBE,GAAA,MAAAI,GA/DFxH,EAAA,MAAK,SAAdO,YADTgC,EAgEoBC,EAAAgI,EAAA,GAAA;AAAA,kBA9DjB,KAAKjK,EAAM;AAAA,kBACX,OAAO,OAAOA,EAAM,EAAE;AAAA,kBACtB,UAAUA,EAAM,QAAQ,KAAKA,EAAM,KAAK;AAAA,kBACxC;oBAA2CA,EAAM;AAAA,oBAA0BA,EAAM,UAAO,IAAOiC,KAAC,iBAAA,EAAA,SAA6BjC,EAAM,QAAA,CAAO,IAAA;AAAA,oBAA4BA,EAAM,gBAAW,UAAeiC,EAAA,CAAA,EAAC,iBAAA,IAAA;AAAA,kBAAA,EAA6D,OAAO,OAAO,EAAmB,KAAI,KAAA;AAAA,gBAAA;kBAU/R,SACT,MAEW;AAAA,oBAFXG,EAEWH,EAAAgC,CAAA,GAAA;AAAA,sBAFD,MAAK;AAAA,sBAAM,MAAMhC,EAAAkC,EAAA,EAAWnE,EAAM,MAAM;AAAA,oBAAA;iCAChD,MAAsC;AAAA,4BAAnCiC,EAAA,CAAA,EAAC,eAAgBjC,EAAM,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;;6BAIpC,MA0CM;AAAA,oBA1CNuC,EA0CM,OA1CN2H,IA0CM;AAAA,sBAxCIlK,EAAM,WAAM,aAAkB+I,GAAS/I,CAAK,UADpDgC,EAMWC,EAAA8E,EAAA,GAAA;AAAA;wBAJT,MAAK;AAAA,wBACJ,OAAO9E,EAAA,CAAA,EAAC,gBAAA;AAAA,sBAAA;mCAET,MAAkD;AAAA,0BAAlDG,EAAkD0H,GAAA;AAAA,4BAAjC,QAAQf,GAAS/I,CAAK,GAAG;AAAA,0BAAA;;;;sBAG5CuC,EAGU,WAHV4H,IAGU;AAAA,wBAFR/H,EAA6EH,EAAA6B,CAAA,GAAA;AAAA,0BAApE,IAAG;AAAA,0BAAK,MAAK;AAAA,0BAAK,QAAO;AAAA,wBAAA;qCAAW,MAAsB;AAAA,gCAAnB7B,EAAA,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,0BAAA;;;wBACjDG,EAAkD0H,GAAA;AAAA,0BAAjC,QAAQ9J,EAAM;AAAA,0BAAO,OAAM;AAAA,wBAAA;;sBAG/BA,EAAM,cAArB4H,EAAA,GAAAjB,EAKU,WALVyD,IAKU;AAAA,wBAJRhI,EAEUH,EAAA6B,CAAA,GAAA;AAAA,0BAFD,IAAG;AAAA,0BAAK,MAAK;AAAA,0BAAK,QAAO;AAAA,wBAAA;qCAChC,MAAiC;AAAA,gCAA9B7B,EAAA,CAAA,EAAC,wBAAA,CAAA,GAAA,CAAA;AAAA,0BAAA;;;wBAENG,EAA6C0H,GAAA;AAAA,0BAA5B,QAAQ9J,EAAM;AAAA,wBAAA;;sBAGjCuC,EAMU,WANV8H,IAMU;AAAA,wBALRjI,EAA8EH,EAAA6B,CAAA,GAAA;AAAA,0BAArE,IAAG;AAAA,0BAAK,MAAK;AAAA,0BAAK,QAAO;AAAA,wBAAA;qCAAW,MAAuB;AAAA,gCAApB7B,EAAA,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,0BAAA;;;wBACjDG,EAAuE0H,GAAA;AAAA,0BAAtD,QAAQ9J,EAAM;AAAA,0BAAS,OAAOiC,EAAA,CAAA,EAAC,iBAAA;AAAA,wBAAA;wBACjCjC,EAAM,mBAArBgC,EAEUC,EAAA6B,CAAA,GAAA;AAAA;0BAFuB,MAAK;AAAA,0BAAK,MAAA;AAAA,0BAAK,OAAM;AAAA,wBAAA;qCACpD,MAAuB;AAAA,4BAApBC,EAAAC,EAAA/B,EAAA,CAAA,EAAC,cAAA,CAAA,IAAmB,OAAE+B,EAAGhE,EAAM,UAAU,GAAA,CAAA;AAAA,0BAAA;;;;sBAIrCoJ,EAAMpJ,CAAK,EAAE,SAAM,KAA9B4H,KAAAjB,EAYM,OAZN2D,IAYM;AAAA,yBAXJ1C,EAAA,EAAA,GAAAjB,EAUYE,GAAA,MAAAI,GATKmC,EAAMpJ,CAAK,IAAnBuK,YADTvI,EAUYC,EAAAK,CAAA,GAAA;AAAA,0BART,KAAKiI,EAAK;AAAA,0BACX,MAAK;AAAA,0BACJ,MAAMA,EAAK,UAAO,YAAA;AAAA,0BAClB,SAASA,EAAK,UAAU,SAAS;AAAA,0BACjC,UAAU1C,EAAA;AAAA,0BACV,SAAO0C,EAAK;AAAA,wBAAA;qCAEb,MAAgB;AAAA,4BAAbxG,EAAAC,EAAAuG,EAAK,KAAK,GAAA,CAAA;AAAA,0BAAA;;;;;;;;;;;;;;QAQzBnI,EA0CUH,EAAA+E,EAAA,GAAA;AAAA,UA1CA,OAAO/E,EAAA,CAAA,EAAC,eAAA;AAAA,QAAA;qBAChB,MAUM;AAAA,YAVKA,EAAAgG,CAAA,MAAeG,EAAA,SAA1BR,KAAAjB,EAUM,OAVN6D,IAUM;AAAA,cATJpI,EAKEH,EAAAU,EAAA,GAAA;AAAA,4BAJSmF,EAAA;AAAA,8DAAAA,EAAO,QAAA3F;AAAA,gBACf,MAAM;AAAA,gBACN,aAAaF,EAAA,CAAA,EAAC,2BAAA;AAAA,gBACd,cAAYA,EAAA,CAAA,EAAC,eAAA;AAAA,cAAA;cAEhBG,EAEYH,EAAAK,CAAA,GAAA;AAAA,gBAFD,MAAK;AAAA,gBAAM,UAAUuF,EAAA,SAAQC,EAAA,MAAQ,WAAI;AAAA,gBAAY,SAAOoB;AAAA,cAAA;2BACrE,MAAwB;AAAA,sBAArBjH,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;YAIOxC,EAAA,MAAK,QAAQ,WAAM,UAAlCuC,EAEYC,EAAA6B,CAAA,GAAA;AAAA;cAF8B,MAAK;AAAA,YAAA;yBAAQ,MAErD;AAAA,oBADA7B,EAAA,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;wBAGHD,EAwBcC,EAAAwI,EAAA,GAAA;AAAA;cAxBM,MAAK;AAAA,YAAA;yBAErB,MAA4C;AAAA,iBAD9C7C,EAAA,EAAA,GAAAjB,EAsBmBE,gBArBGpH,EAAA,MAAK,OAAO,EAAE,QAAA,IAA3B0J,YADTnH,EAsBmBC,EAAAyI,EAAA,GAAA;AAAA,kBApBhB,KAAKvB,EAAM;AAAA,kBACX,MAAMA,EAAM,qCAAqC;AAAA,kBACjD,QAAQA,EAAM,eAAU;AAAA,gBAAA;6BAEzB,MAeM;AAAA,oBAfN5G,EAeM,OAfNoI,IAeM;AAAA,sBAdJpI,EAWM,OAXNqI,IAWM;AAAA,wBAVJxI,EAEUH,EAAA6B,CAAA,GAAA;AAAA,0BAFD,MAAK;AAAA,0BAAK,QAAO;AAAA,wBAAA;qCACxB,MAA0E;AAAA,4BAAvEC,EAAAC,EAAAmF,EAAM,eAAU,WAAgBlH,KAAC,cAAA,IAAmBkH,EAAM,UAAU,GAAA,CAAA;AAAA,0BAAA;;;wBAEzE/G,EAKUH,EAAA6B,CAAA,GAAA;AAAA,0BALD,MAAK;AAAA,0BAAK,MAAK;AAAA,wBAAA;qCACtB,MAAiB;AAAA,gCAAd4E,EAAKS,CAAK,CAAA,IAAI,KACjB,CAAA;AAAA,4BAAgBG,EAAYH,CAAK,MAAA,aAAjCxC,EAECE,GAAA,EAAA,KAAA,KAAA;AAAA,gCADE,QAAG7C,EAAGsF,EAAYH,CAAK,CAAA,GAAA,CAAA;AAAA,4BAAA;;;;wBAG5B/G,EAAoEH,EAAA4I,EAAA,GAAA;AAAA,0BAA1D,OAAO1B,EAAM;AAAA,0BAAY,SAAA;AAAA,0BAAQ,MAAK;AAAA,0BAAK,MAAK;AAAA,wBAAA;;sBAGtCA,EAAM,QAAQA,EAAM,SAAI,iBAA9CnH,EAAoF8H,GAAA;AAAA;wBAAtB,QAAQX,EAAM;AAAA,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;AC7a1F,UAAMxI,IAAQC,GAERK,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO,GAC5BoD,IAAQC,GAAA,GACRC,IAASC,GAAA;AACf,IAAAhE,GAAA;AAEA,UAAMW,IAAIC,GAAa,YAAY,GAE7BC,IAAUC,GAAA,GAEVwJ,IAAOpJ,EAAsB,IAAI,GACjCmB,IAAWnB,EAAe,EAAE,GAC5BoB,IAAUpB,EAAI,EAAI,GAElBqB,IAAY9B,EAAQ,IAAI,cAAc,GAEtC8J,IAAoB,CAAC,OAAO,WAAW,UAAU,SAAS,QAAQ,GAElErE,IAAQtD;AAAA,MACZ,MACEnC,EAAQ,MAAM,UAAU,QAAQ,KAAK,CAAC+J,MAAWA,EAAO,OAAO,OAAO,GAAG,SACzE7J,EAAE,cAAc;AAAA,IAAA,GAGd8J,IAAO7H,EAAmB;AAAA,MAC9B,KAAK,MACH,OAAOiB,EAAM,MAAM,QAAS,YAAY0G,EAAM,SAAS1G,EAAM,MAAM,IAAgB,IAC/EA,EAAM,MAAM,OACZ;AAAA,MACN,KAAK,CAAC6G,MAAU;AACd,QAAK3G,EAAO,QAAQ;AAAA,UAClB,OAAO,EAAE,GAAGF,EAAM,OAAO,MAAM6G,MAAU,QAAQ,SAAY,OAAOA,CAAK,GAAG,MAAM,OAAA;AAAA,QAAU,CAC7F;AAAA,MACH;AAAA,IAAA,CACD,GAEK3H,IAAUH,EAA6B;AAAA,MAC3C,KAAK,MAAO,OAAOiB,EAAM,MAAM,WAAY,WAAW,OAAOA,EAAM,MAAM,OAAO,IAAI;AAAA,MACpF,KAAK,CAAC6G,MAAU;AACd,QAAK3G,EAAO,QAAQ;AAAA,UAClB,OAAO;AAAA,YACL,GAAGF,EAAM;AAAA,YACT,SAAS6G,MAAU,QAAQA,MAAU,KAAK,SAAY,OAAOA,CAAK;AAAA,YAClE,MAAM;AAAA,UAAA;AAAA,QACR,CACD;AAAA,MACH;AAAA,IAAA,CACD,GAEKC,IAAQ/H;AAAA,MAAoB,MAChC2H,EAAM,IAAI,CAACG,OAAW;AAAA,QACpB,OAAAA;AAAA,QACA,OAAO/J,EAAE,cAAc+J,CAAK,EAAE;AAAA,QAC9B,OAAOJ,EAAK,OAAO,OAAOI,CAAK,KAAK;AAAA,MAAA,EACpC;AAAA,IAAA,GAGEE,IAAiBhI;AAAA,MAAS,MAC9BP,EAAS,MAAM,IAAI,CAACwI,OAAS,EAAE,OAAOA,EAAI,OAAO,OAAOA,EAAI,KAAK;AAAA,IAAA,GAG7D9F,IAAOnC,EAAS,MAAM0H,EAAK,OAAO,QAAQ,EAAE,GAM5C3H,IAAUC,EAAiC,MAAM;AAAA,MACrD,EAAE,KAAK,SAAS,OAAOjC,EAAE,mBAAmB,GAAG,UAAU,IAAA;AAAA,MACzD,EAAE,KAAK,UAAU,OAAOA,EAAE,qBAAqB,GAAG,OAAO,IAAA;AAAA,MACzD,EAAE,KAAK,iBAAiB,OAAOA,EAAE,oBAAoB,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,MAClF,EAAE,KAAK,YAAY,OAAOA,EAAE,uBAAuB,GAAG,OAAO,KAAK,WAAW,IAAA;AAAA,MAC7E,EAAE,KAAK,cAAc,OAAOA,EAAE,sBAAsB,GAAG,OAAO,KAAK,WAAW,IAAA;AAAA,IAAI,CACnF;AAED,mBAAekC,EAAKyB,GAAmC;AACrD,MAAAhC,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAgI,EAAK,QAAQ,MAAM5J,EAAI,MAAM;AAAA,UAC3B,MAAM+J,EAAK;AAAA,UACX,SAAS,OAAO1H,EAAQ,SAAU,WAAWA,EAAQ,QAAQ;AAAA,UAC7D,GAAGuB,GAAO,WAAW,OAAOT,EAAM,MAAM,KAAM,WAAWA,EAAM,MAAM,IAAI;AAAA,UACzE,MAAMS,GAAO,SAAS,OAAOT,EAAM,MAAM,QAAQ,CAAC,KAAK;AAAA,UACvD,UAAUS,GAAO;AAAA,QAAA,CAClB;AAAA,MACH,SAAS/C,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAe,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,aAASwI,EAAQxG,GAAyB;AACxC,MAAKP,EAAO,QAAQ;AAAA,QAClB,OAAO;AAAA,UACL,GAAGF,EAAM;AAAA,UACT,GAAGS,EAAM,WAAW,KAAK,SAAYA,EAAM;AAAA,UAC3C,MAAMA,EAAM,SAAS,IAAI,SAAY,OAAOA,EAAM,IAAI;AAAA,QAAA;AAAA,MACxD,CACD,GACIzB,EAAKyB,CAAK;AAAA,IACjB;AAEA,mBAAeyG,IAA8B;AAC3C,UAAI;AACF,QAAA1I,EAAS,QAAQ,MAAM3B,EAAI,SAAA;AAAA,MAC7B,SAASa,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,IAAAwG,GAAM,CAAC0C,GAAM1H,CAAO,GAAG,MAAA;AAAM,MAAKF;KAAM,GAEnCA,EAAA,GACAkI,EAAA;AAEL,aAAS1K,GAAK+C,GAAoB;AAChC,MAAKW,EAAO,KAAK,GAAG5D,EAAM,IAAI,IAAIiD,EAAI,EAAE,EAAE;AAAA,IAC5C;AAEA,UAAMJ,KAAUJ,EAAyB,MAAM;AAAA,MAC7C;AAAA,QACE,KAAK;AAAA,QACL,OAAOjC,EAAE,gBAAgB;AAAA,QACzB,MAAM;AAAA,QACN,KAAK,MAAA;AAAM,UAAKoD,EAAO,KAAK,GAAG5D,EAAM,IAAI,WAAW;AAAA;AAAA,MAAA;AAAA,MAEtD,GAAIoC,IACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,OAAO5B,EAAE,gBAAgB;AAAA,UACzB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK,MAAA;AAAM,YAAKoD,EAAO,KAAK,GAAG5D,EAAM,IAAI,WAAW;AAAA;AAAA,QAAA;AAAA,QAEtD;AAAA,UACE,KAAK;AAAA,UACL,OAAOQ,EAAE,WAAW;AAAA,UACpB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,KAAK,MAAA;AAAM,YAAKoD,EAAO,KAAK,GAAG5D,EAAM,IAAI,MAAM;AAAA;AAAA,QAAA;AAAA,MACjD,IAEF,CAAA;AAAA,IAAC,CACN;sBAICiH,EAAA,GAAAjB,EAkEM,OAlEN9C,IAkEM;AAAA,MAjEJzB,EAgEiBH,EAAAwB,EAAA,GAAA;AAAA,QAhEO,MAAMwH,EAAA;AAAA,gDAAAA,EAAI,QAAA9I;AAAA,QAAG,OAAOuE,EAAA;AAAA,QAAQ,OAAOyE,EAAA;AAAA,QAAQ,SAAS3H,GAAA;AAAA,MAAA;QAC/D,WACT,MASE;AAAA,UARMX,EAAA,MAAS,SAAM,UADvBb,EASEC,EAAAuJ,EAAA,GAAA;AAAA;wBAPSjI,EAAA;AAAA,0DAAAA,EAAO,QAAApB;AAAA,YAChB,OAAM;AAAA,YACL,SAASiJ,EAAA;AAAA,YACT,aAAanJ,EAAAd,CAAA,EAAC,oBAAA;AAAA,YACd,cAAYc,EAAAd,CAAA,EAAC,oBAAA;AAAA,YACd,WAAA;AAAA,YACA,MAAK;AAAA,UAAA;;mBAIT,MAiDW;AAAA,UAjDXiB,EAiDWH,EAAAyB,EAAA,GAAA;AAAA,YAhDR,MAAMoH,EAAA;AAAA,YACN,SAAS3H,EAAA;AAAA,YACV,WAAQ;AAAA,YACR,YAAA;AAAA,YACA,OAAA;AAAA,YACA,OAAA;AAAA,YACA,QAAO;AAAA,YACN,SAASL,EAAA;AAAA,YACT,eAAa;AAAA,YACb,sBAAoBb,EAAAd,CAAA,EAAC,cAAA;AAAA,YACrB,cAAYoE,QAAK,iBAAiBzC,EAAA,QAAUb,EAAAd,CAAA,EAAC,aAAA,IAAkB;AAAA,YAC/D,cAAYuF,EAAA;AAAA,YACZ,eAAc4E;AAAA,YACd,YAAWzK;AAAA,UAAA;YAED,cAAU8C,EACnB,CAGM,EAJiB,KAAAC,QAAG;AAAA,cAC1BrB,EAGM,OAHNoH,IAGM;AAAA,gBAFJvH,EAA4DH,EAAA6B,CAAA,GAAA;AAAA,kBAAnD,MAAK;AAAA,kBAAK,MAAK;AAAA,kBAAQ,MAAA;AAAA,gBAAA;6BAAK,MAAa;AAAA,oBAAVC,EAAAC,EAAAJ,EAAI,GAAG,GAAA,CAAA;AAAA,kBAAA;;;gBAC/CxB,EAA2DH,EAAA6B,CAAA,GAAA;AAAA,kBAAlD,UAAA;AAAA,kBAAS,QAAO;AAAA,gBAAA;6BAAS,MAAe;AAAA,oBAAZC,EAAAC,EAAAJ,EAAI,KAAK,GAAA,CAAA;AAAA,kBAAA;;;;;YAIvC,eAAWD,EACpB,CAAwF,EADhE,KAAAC,QAAG;AAAA,cAC3BxB,EAAwFH,EAAAgC,CAAA,GAAA;AAAA,gBAA7E,MAAMhC,EAAAiC,EAAA,EAAUN,EAAI,MAAM;AAAA,cAAA;2BAAG,MAAqC;AAAA,sBAAlC3B,EAAAd,CAAA,EAAC,gBAAiByC,EAAI,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;YAG9D,sBAAkBD,EAC3B,CAQM,EATyB,KAAAC,QAAG;AAAA,cACvBA,EAAI,iBAAfgE,EAAA,GAAAjB,EAQM,OARNiD,IAQM;AAAA,gBAPJxH,EAGUH,EAAA6B,CAAA,GAAA;AAAA,kBAHD,MAAK;AAAA,kBAAK,UAAA;AAAA,gBAAA;6BACjB,MAAsF;AAAA,oBAAnFC,EAAAC,EAAA/B,EAAAd,CAAA,gCAAgCyC,EAAI,cAAc,UAAQ,OAASA,EAAI,aAAY,QACpFI,EAAGJ,EAAI,cAAc,KAAK,GAAA,CAAA;AAAA,kBAAA;;;gBAE9BxB,EAEWH,EAAAgC,CAAA,GAAA;AAAA,kBAFD,MAAK;AAAA,kBAAM,MAAMhC,EAAAkC,EAAA,EAAWP,EAAI,cAAc,MAAM;AAAA,gBAAA;6BAC5D,MAAkD;AAAA,oBAA/CG,EAAAC,EAAA/B,EAAAd,CAAA,EAAC,eAAgByC,EAAI,cAAc,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;0BAGhD5B,EAAkDC,EAAA6B,CAAA,GAAA;AAAA;gBAAlC,MAAK;AAAA,gBAAK,MAAK;AAAA,cAAA;2BAAQ,MAAC,CAAA,GAAApB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,oBAAD,KAAC,EAAA;AAAA,gBAAA;;;;YAG/B,iBAAaiB,EACtB,CAEW,EAHe,KAAAC,QAAG;AAAA,cAC7BxB,EAEWH,EAAAgC,CAAA,GAAA;AAAA,gBAFD,SAAQ;AAAA,gBAAW,MAAMhC,EAAAmC,EAAA,EAAcR,EAAI,QAAQ;AAAA,cAAA;2BAC3D,MAAyC;AAAA,sBAAtC3B,EAAAd,CAAA,EAAC,kBAAmByC,EAAI,QAAQ,EAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;YAI5B,mBAAeD,EACxB,CAAkE,EADtC,KAAAC,QAAG;AAAA,cAC/BxB,EAAkEH,EAAA4I,EAAA,GAAA;AAAA,gBAAxD,OAAOjH,EAAI;AAAA,gBAAY,SAAA;AAAA,gBAAQ,MAAK;AAAA,gBAAK,MAAK;AAAA,cAAA;;;;;;;;;yGC5N5D6H,KAAQ;;;;;;;AATd,UAAM9K,IAAQC,GAERK,IAAUP,GAAA,GACVQ,IAAM9B,GAAe6B,CAAO;AAClC,IAAAT,GAAA;AAEA,UAAMW,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAIVlB,IAASsB,EAAiB,EAAE,GAC5B+C,IAAW/C,EAAI,EAAE,GACjBgK,IAAWhK,EAAI,EAAK,GACpBoB,IAAUpB,EAAI,EAAI,GAClBD,IAASC,EAAI,EAAK,GAClBiK,IAAUjK,EAAI,EAAK,GACnBC,IAASD,EAA8B,EAAE,GAEzCqB,IAAY9B,EAAQ,IAAI,cAAc,GAEtC4D,IAAQzB;AAAA,MACZ,MAAMqB,EAAS,UAAU,MAAM,KAAK,UAAUrE,EAAO,KAAK,MAAMqE,EAAS;AAAA,IAAA,GAGrEK,IAAQ1B;AAAA,MAAyC,MACrD3B,EAAO,QAAQ,WAAWoD,EAAM,QAAQ,YAAY;AAAA,IAAA,GAIhDE,IAAQ3B,EAAgB,MAAM;AAAA,MAClC,EAAE,IAAI,OAAO,QAAQ,SAAS,OAAO,EAAE,aAAasI,EAAS,QAAQ,aAAa,GAAA,EAAG;AAAA,IAAE,CACxF;AAED,aAASvG,EAAKyG,GAAyE;AACrF,MAAAxL,EAAO,QAAQ,EAAE,GAAGwL,EAAS,QAAQ,CAACH,EAAK,GAAG,GAAA,GAC9ChH,EAAS,QAAQ,KAAK,UAAUrE,EAAO,KAAK,GAC5CsL,EAAS,QAAQE,EAAS;AAAA,IAC5B;AAEA,IAAAtF,GAAU,YAAY;AACpB,UAAI;AACF,QAAAnB,EAAK,MAAMjE,EAAI,UAAU;AAAA,MAC3B,SAASa,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAe,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAED,mBAAekD,EAAK6F,IAAS,IAAsB;AACjD,UAAI,CAAApK,EAAO,OAEX;AAAA,QAAAA,EAAO,QAAQ,IACfE,EAAO,QAAQ,CAAA;AAEf,YAAI;AACF,UAAAwD,EAAK,MAAMjE,EAAI,aAAad,EAAO,OAAOyL,CAAM,CAAC,GACjD/J,EAAM,QAAiBX,EAAT0K,IAAW,0BAA6B,sBAAN,CAA6B;AAAA,QAC/E,SAAS9J,GAAO;AACd,gBAAMvC,IAAQuC,EAA2D;AAEzE,UAAIvC,GAAM,SAAQmC,EAAO,QAAQnC,EAAK,SACjCsC,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,QAClC,UAAA;AACE,UAAAN,EAAO,QAAQ;AAAA,QACjB;AAAA;AAAA,IACF;AAEA,mBAAeqK,IAAsB;AACnC,MAAAH,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAA7J,EAAM,QAAQ,MAAMZ,EAAI,WAAA,CAAY;AAAA,MACtC,SAASa,GAAO;AACd,QAAAD,EAAM,OAAOT,EAAQU,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAA4J,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;sBAIE/D,EAAA,GAAAjB,EAkCM,OAlCN9C,IAkCM;AAAA,MAjCJzB,EAAgGH,EAAA6E,EAAA,GAAA;AAAA,QAA/E,MAAMnG,EAAM;AAAA,QAAO,cAAYsB,EAAAd,CAAA,EAAC,YAAA;AAAA,QAAiB,OAAOc,EAAAd,CAAA,EAAC,gBAAA;AAAA,MAAA;MAEvD2B,EAAA,cAAnBd,EAA8CC,EAAA2E,EAAA,GAAA;AAAA;QAAlB,OAAA;AAAA,QAAO,MAAM;AAAA,MAAA,YAEzCD,EA4BWE,GAAA,EAAA,KAAA,KAAA;AAAA,QA3BTzE,EAEWH,EAAA8E,EAAA,GAAA;AAAA,UAFA,MAAM2E,EAAA,QAAQ,YAAA;AAAA,QAAA;qBACvB,MAAgE;AAAA,gBAA7DA,EAAA,QAAWzJ,EAAAd,CAAA,EAAC,iBAAA,IAAsBc,EAAAd,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QAGxCiB,EAMEH,EAAAiF,EAAA,GAAA;AAAA,sBALS9G,EAAA;AAAA,wDAAAA,EAAM,QAAA+B;AAAA,UACf,MAAK;AAAA,UACJ,OAAO4C,EAAA;AAAA,UACP,QAAQpD,EAAA;AAAA,UACR,UAAQ,CAAGM,EAAAc,CAAA,KAAatB,EAAA;AAAA,QAAA;QAGNQ,EAAAc,CAAA,UAArBf,EAcgBC,EAAAkF,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,UAbH,SACT,MAAgC;AAAA,YAAhC/E,EAAgCH,EAAAmF,EAAA,GAAA,EAAhB,OAAOtC,EAAA,SAAK,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UAAA;qBAG9B,MAEY;AAAA,YAFK4G,EAAA,cAAjB1J,EAEYC,EAAAK,CAAA,GAAA;AAAA;cAFe,SAAQ;AAAA,cAAW,UAAUb,EAAA;AAAA,cAAS,gCAAOuE,EAAI,EAAA;AAAA,YAAA;yBAC1E,MAA6B;AAAA,oBAA1B/D,EAAAd,CAAA,EAAC,oBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAENiB,EAEYH,EAAAK,CAAA,GAAA;AAAA,cAFD,SAAQ;AAAA,cAAW,SAASqJ,EAAA;AAAA,cAAU,UAAU9G,EAAA;AAAA,cAAQ,SAAOiH;AAAA,YAAA;yBACxE,MAA0B;AAAA,oBAAvB7J,EAAAd,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAENiB,EAEYH,EAAAK,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAW,SAASb,EAAA;AAAA,cAAS,WAAWoD,EAAA;AAAA,cAAQ,gCAAOmB,EAAA;AAAA,YAAI;yBACzE,MAAqB;AAAA,oBAAlB/D,EAAAd,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;;;;;ACvHP,SAAS4K,GAAMC,IAAwB,IAAiB;AAC7D,QAAMtM,IAAOsM,EAAQ,QAAQ,UACvB1M,IAAO,EAAE,MAAMI,EAAA,GACfE,IAAK,CAACsL,MAA6B,OAAO,MAAM,QAAQA,CAAK,IAAIA,EAAM,CAAC,IAAIA,CAAK;AAEvF,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAAxL;AAAA,IACA,QAAQ;AAAA,MACN,EAAE,MAAAA,GAAM,MAAM,cAAc,WAAWuM,IAAW,OAAO3M,EAAA;AAAA,MACzD;AAAA,QACE,MAAM,GAAGI,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAWwM;AAAA,QACX,OAAO5M;AAAA,MAAA;AAAA,MAET;AAAA,QACE,MAAM,GAAGI,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAWyM;AAAA,QACX,OAAO7M;AAAA,MAAA;AAAA,MAET;AAAA,QACE,MAAM,GAAGI,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAW0M;AAAA,QACX,OAAO,EAAE,GAAG9M,GAAM,IAAI,KAAA;AAAA,MAAK;AAAA,MAE7B;AAAA,QACE,MAAM,GAAGI,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAW2M;AAAA,QACX,OAAO,CAAChI,OAAW,EAAE,GAAG/E,GAAM,IAAIM,EAAGyE,EAAM,OAAO,EAAY,EAAA;AAAA,MAAE;AAAA,MAElE;AAAA,QACE,MAAM,GAAG3E,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAW0M;AAAA,QACX,OAAO,CAAC/H,OAAW,EAAE,GAAG/E,GAAM,IAAIM,EAAGyE,EAAM,OAAO,EAAY,EAAA;AAAA,MAAE;AAAA,IAClE;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../src/api.ts","../src/messages.ts","../src/i18n.ts","../src/ProjectDialog.vue","../src/ProjectsPage.vue","../src/tones.ts","../src/TaskFormPage.vue","../src/TasksMarkdown.vue","../src/TasksTextDialog.vue","../src/TaskPage.vue","../src/TasksPage.vue","../src/TasksSettingsPage.vue","../src/module.ts"],"sourcesContent":["import type { AdminContext } from '@webx-ui/module-admin'\nimport type {\n NotificationSettings,\n Project,\n ProjectInput,\n TaskDetail,\n TaskInput,\n TaskQuery,\n TasksPage,\n} from './types'\n\nexport interface TasksApi {\n projects(): Promise<Project[]>\n createProject(input: ProjectInput): Promise<Project>\n saveProject(id: number, input: ProjectInput): Promise<Project>\n /** A page of tasks under a view, with the count of every view. */\n tasks(query?: TaskQuery): Promise<TasksPage>\n task(id: number): Promise<TaskDetail>\n /** A draft with its stages. */\n create(input: TaskInput): Promise<TaskDetail>\n /** Within the rules of §3: refused with 422 and the reason when the task has started. */\n save(id: number, input: TaskInput): Promise<TaskDetail>\n ready(id: number): Promise<TaskDetail>\n cancel(id: number, reason?: string): Promise<TaskDetail>\n comment(id: number, body: string, stageId?: number | null): Promise<TaskDetail>\n accept(stage: number, note?: string): Promise<TaskDetail>\n rework(stage: number, remarks: string): Promise<TaskDetail>\n unblock(stage: number, answer: string): Promise<TaskDetail>\n release(stage: number, reason?: string): Promise<TaskDetail>\n cancelStage(stage: number, reason?: string): Promise<TaskDetail>\n /** The notification settings; the bot token only as whether one is set. */\n settings(): Promise<NotificationSettings>\n saveSettings(\n values: Record<string, unknown>,\n forgetToken?: boolean,\n ): Promise<NotificationSettings>\n /** Sends one message now; refused with 422 and Telegram's own words when it does not get through. */\n testNotice(): Promise<string>\n}\n\n/** The queue's endpoints under the panel's API path; every change answers the whole task. */\nexport function createTasksApi(admin: AdminContext): TasksApi {\n const base = `${admin.apiPath}/tasks`\n const data = <T>(body: { data: T }): T => body.data\n\n const task = (path: string, body: Record<string, unknown> = {}) =>\n admin.http.post<{ data: TaskDetail }>(`${base}/${path}`, body).then(data)\n\n return {\n projects: () => admin.http.get<{ data: Project[] }>(`${base}/projects`).then(data),\n\n createProject: (input) =>\n admin.http.post<{ data: Project }>(`${base}/projects`, input).then(data),\n\n saveProject: (id, input) =>\n admin.http.put<{ data: Project }>(`${base}/projects/${id}`, input).then(data),\n\n /* `undefined` drops a parameter; `null` and `''` would be sent as words. */\n tasks: (query = {}) =>\n admin.http.get<TasksPage>(`${base}/tasks`, {\n query: {\n view: query.view && query.view !== 'all' ? query.view : undefined,\n project: query.project ?? undefined,\n q: query.q || undefined,\n page: query.page,\n per_page: query.per_page,\n },\n }),\n\n task: (id) => admin.http.get<{ data: TaskDetail }>(`${base}/tasks/${id}`).then(data),\n\n create: (input) => admin.http.post<{ data: TaskDetail }>(`${base}/tasks`, input).then(data),\n\n save: (id, input) =>\n admin.http.put<{ data: TaskDetail }>(`${base}/tasks/${id}`, input).then(data),\n\n ready: (id) => task(`tasks/${id}/ready`),\n cancel: (id, reason) => task(`tasks/${id}/cancel`, { reason }),\n comment: (id, body, stageId) => task(`tasks/${id}/comments`, { body, stage_id: stageId }),\n accept: (stage, note) => task(`stages/${stage}/accept`, { note }),\n rework: (stage, remarks) => task(`stages/${stage}/rework`, { remarks }),\n unblock: (stage, answer) => task(`stages/${stage}/unblock`, { answer }),\n release: (stage, reason) => task(`stages/${stage}/release`, { reason }),\n cancelStage: (stage, reason) => task(`stages/${stage}/cancel`, { reason }),\n\n settings: () => admin.http.get<{ data: NotificationSettings }>(`${base}/settings`).then(data),\n\n saveSettings: (values, forgetToken = false) =>\n admin.http\n .put<{ data: NotificationSettings }>(`${base}/settings`, {\n values,\n forget_token: forgetToken || undefined,\n })\n .then(data),\n\n testNotice: () =>\n admin.http\n .post<{ message: string }>(`${base}/settings/test`, {})\n .then((body) => body.message),\n }\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * What this package says, in English — the same keys `webx-ui/module-tasks` ships as\n * `lang/en/*.php`, so a key never reaches the screen while the dictionary is on its way. The\n * server's dictionary wins; the labels of the form (`screen`) arrive translated with the screen\n * and are not repeated here.\n */\nexport const tasksMessages: Record<string, Messages> = {\n module: {\n title: 'Tasks',\n },\n\n panel: {\n new: 'New task',\n projects: 'Projects',\n 'view-all': 'All',\n 'view-waiting': 'Waiting for me',\n 'view-active': 'In work',\n 'view-draft': 'Drafts',\n 'view-closed': 'Closed',\n 'all-projects': 'All projects',\n search: 'Search tasks',\n empty: 'No tasks here.',\n 'column-task': 'Task',\n 'column-status': 'Status',\n 'column-stage': 'Stage',\n 'column-priority': 'Priority',\n 'column-updated': 'Updated',\n 'stage-of': 'Stage :position/:count',\n 'status-draft': 'Draft',\n 'status-ready': 'Ready',\n 'status-in_progress': 'In progress',\n 'status-review': 'In review',\n 'status-done': 'Done',\n 'status-cancelled': 'Cancelled',\n 'stage-pending': 'Waiting',\n 'stage-ready': 'Ready',\n 'stage-in_progress': 'In progress',\n 'stage-review': 'In review',\n 'stage-rework': 'Sent back',\n 'stage-blocked': 'Asked a question',\n 'stage-done': 'Done',\n 'stage-cancelled': 'The stage is cancelled.',\n 'priority-low': 'Low',\n 'priority-normal': 'Normal',\n 'priority-high': 'High',\n spec: 'Specification',\n acceptance: 'Acceptance criteria',\n 'no-spec': 'No specification.',\n branch: 'Branch',\n stages: 'Stages',\n journal: 'Journal',\n brief: 'Assignment',\n 'stage-acceptance': 'Criteria',\n report: 'Report',\n result: 'Result',\n 'no-report': 'Not reported yet.',\n agent: 'Agent',\n attempt: 'Attempt :attempt',\n 'by-person': 'Checked by a person',\n 'by-agent': 'Checked by an agent',\n question: 'Question',\n start: 'Put to work',\n started: 'The task is in work: the first stage can be taken.',\n edit: 'Edit',\n 'cancel-task': 'Cancel the task',\n 'cancel-task-title': 'Cancel «:title»?',\n 'cancel-task-text':\n 'Every stage that is not done is cancelled, and nothing of the task is handed out again.',\n cancelled: 'The task is cancelled.',\n accept: 'Accept',\n 'accept-title': 'Accept «:stage»?',\n 'accept-text': 'The next stage can be taken right after.',\n accepted: 'The stage is accepted.',\n rework: 'Send back',\n 'rework-title': 'Send «:stage» back',\n 'rework-label': 'What has to change',\n reworked: 'The stage is sent back.',\n answer: 'Answer',\n 'answer-title': 'Answer the question',\n 'answer-label': 'Your answer',\n answered: 'The answer is sent; the stage is back in the queue.',\n release: 'Release',\n 'release-title': 'Release «:stage»?',\n 'release-text': 'The stage goes back to the queue, and the agent that held it loses it.',\n released: 'The stage is released.',\n 'cancel-stage': 'Cancel the stage',\n 'cancel-stage-title': 'Cancel «:stage»?',\n 'cancel-stage-text': 'The stage is skipped and the next one can start.',\n note: 'Note',\n send: 'Send',\n keep: 'Keep',\n comment: 'Comment',\n 'comment-placeholder': 'Add a comment for people and agents',\n commented: 'The comment is added.',\n 'kind-status': 'changed the status',\n 'kind-report': 'reported',\n 'kind-rework': 'sent back',\n 'kind-question': 'asked',\n 'kind-answer': 'answered',\n 'kind-edit': 'edited the task',\n 'kind-comment': 'commented',\n system: 'System',\n 'journal-empty': 'Nothing has happened yet.',\n 'locked-stages': 'Started stages',\n 'locked-help':\n 'Stages already taken stay as they are. The others can be changed and reordered, and new ones go at the end.',\n 'locked-fields': 'Work has started: of the task itself, only the priority can change.',\n save: 'Save',\n saved: 'Saved.',\n created: 'The task is written. It stays a draft until you put it to work.',\n 'save-failed': 'The task is not saved: check the marked fields.',\n 'leave-title': 'Leave without saving?',\n 'leave-text': 'The changes made here will be lost.',\n leave: 'Leave',\n back: 'Back to tasks',\n untitled: 'Untitled task',\n 'need-project': 'Add a project first: every task belongs to one.',\n 'project-new': 'New project',\n 'project-edit': 'Edit the project',\n 'project-title': 'Name',\n 'project-slug': 'Slug',\n 'project-slug-help': 'Lowercase letters, digits and dashes. Tasks are named by it: shop#12.',\n 'project-workdir': 'Working folder',\n 'project-workdir-help': 'The folder an agent is started in.',\n 'project-repo': 'Repository',\n 'project-branch': 'Default branch',\n 'project-rules': 'Rules for agents',\n 'project-rules-help':\n 'Handed to every stage of the project: the gate to run, what never to touch.',\n 'project-archived': 'Archived',\n 'project-archived-help': 'An archived project takes no new tasks and hands nothing out.',\n 'project-tasks': 'Tasks',\n 'project-saved': 'The project is saved.',\n 'projects-empty': 'No projects yet. A task belongs to a project — add one first.',\n settings: 'Settings',\n 'settings-saved': 'The settings are saved.',\n 'send-test': 'Send a test message',\n 'test-sent': 'The test message is sent.',\n 'token-set': 'A bot token is set.',\n 'token-not-set': 'No bot token yet: nothing is sent.',\n 'forget-token': 'Forget the token',\n 'token-forgotten': 'The token is forgotten.',\n },\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { tasksMessages } from './messages'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useTasksMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults('webx-tasks', tasksMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { reactive, ref, useId } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n useModal,\n WxButton,\n WxDialog,\n WxFormItem,\n WxInput,\n WxSpace,\n WxSwitch,\n WxTextarea,\n} from '@webx-ui/core'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport type { Project, ProjectInput } from './types'\n\n/**\n * A project, new or changed: where agents work on it and the rules they are handed. Answers the\n * project as the server saved it; a refused field stays open with the reason under it.\n */\ndefineOptions({ name: 'WxTasksProjectDialog' })\n\nconst props = withDefaults(defineProps<{ project?: Project | null }>(), { project: null })\n\nconst { open, resolve, dismiss } = useModal<Project>()\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst formId = useId()\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst values = reactive({\n slug: props.project?.slug ?? '',\n title: props.project?.title ?? '',\n workdir: props.project?.workdir ?? '',\n repo_url: props.project?.repo_url ?? '',\n default_branch: props.project?.default_branch ?? 'main',\n rules: props.project?.rules ?? '',\n archived: props.project?.archived ?? false,\n})\n\nasync function submit(): Promise<void> {\n if (saving.value) return\n\n saving.value = true\n errors.value = {}\n\n const input: ProjectInput = {\n ...values,\n workdir: values.workdir || null,\n repo_url: values.repo_url || null,\n default_branch: values.default_branch || null,\n rules: values.rules || null,\n }\n\n try {\n resolve(\n props.project\n ? await api.saveProject(props.project.id, input)\n : await api.createProject(input),\n )\n toast.success(t('panel.project-saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n else toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"props.project ? t('panel.project-edit') : t('panel.project-new')\"\n :width=\"560\"\n >\n <form :id=\"formId\" class=\"wx-tasks-project\" @submit.prevent=\"submit\">\n <wx-form-item :label=\"t('panel.project-title')\" :error=\"errors.title\" required>\n <wx-input v-model=\"values.title\" :maxlength=\"255\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-slug')\"\n :help=\"t('panel.project-slug-help')\"\n :error=\"errors.slug\"\n required\n >\n <wx-input v-model=\"values.slug\" :maxlength=\"64\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-workdir')\"\n :help=\"t('panel.project-workdir-help')\"\n :error=\"errors.workdir\"\n >\n <wx-input v-model=\"values.workdir\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('panel.project-repo')\" :error=\"errors.repo_url\">\n <wx-input v-model=\"values.repo_url\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('panel.project-branch')\" :error=\"errors.default_branch\">\n <wx-input v-model=\"values.default_branch\" />\n </wx-form-item>\n\n <wx-form-item\n :label=\"t('panel.project-rules')\"\n :help=\"t('panel.project-rules-help')\"\n :error=\"errors.rules\"\n >\n <wx-textarea v-model=\"values.rules\" :rows=\"5\" />\n </wx-form-item>\n\n <wx-form-item v-if=\"props.project\" :help=\"t('panel.project-archived-help')\">\n <wx-switch v-model=\"values.archived\" :label=\"t('panel.project-archived')\" />\n </wx-form-item>\n </form>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ t('panel.keep') }}</wx-button>\n <wx-button type=\"primary\" native-type=\"submit\" :form=\"formId\" :loading=\"saving\">\n {{ t('panel.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-tasks-project {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxListScreen,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n createModal,\n toast,\n WxBadge,\n WxButton,\n WxTable,\n WxText,\n type TableColumn,\n} from '@webx-ui/core'\nimport ProjectDialog from './ProjectDialog.vue'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport type { Project } from './types'\n\n/**\n * The projects (§6, «Projects»): where work happens. A short list — a handful of rows, archived\n * ones last — and a dialog to write one; nothing here pages or filters.\n */\ndefineOptions({ name: 'WxTasksProjectsPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst projects = ref<Project[]>([])\nconst loading = ref(true)\n\nconst canManage = context.can('tasks.manage')\n\nconst edit = createModal<Project, { project?: Project | null }>(ProjectDialog)\n\nconst columns = computed<TableColumn<Project>[]>(() => [\n { key: 'title', label: t('panel.project-title'), minWidth: 200 },\n { key: 'workdir', label: t('panel.project-workdir'), minWidth: 200, hideBelow: 640 },\n { key: 'tasks_count', label: t('panel.project-tasks'), width: 100, align: 'right' },\n { key: 'actions', label: '', width: 120, align: 'right' },\n])\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n projects.value = await api.projects()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function write(project: Project | null): Promise<void> {\n if (await edit({ project })) await load()\n}\n\nconst actions = computed<ScreenAction[]>(() =>\n canManage\n ? [\n {\n key: 'new',\n label: t('panel.project-new'),\n icon: 'plus',\n primary: true,\n run: () => void write(null),\n },\n ]\n : [],\n)\n</script>\n\n<template>\n <wx-list-screen\n :title=\"t('panel.projects')\"\n :back=\"props.base\"\n :back-label=\"t('panel.back')\"\n :actions=\"actions\"\n >\n <wx-table\n :data=\"projects\"\n :columns=\"columns\"\n row-key=\"id\"\n flush\n layout=\"fixed\"\n :loading=\"loading\"\n :cards-below=\"0\"\n :empty-text=\"projects.length === 0 && !loading ? t('panel.projects-empty') : undefined\"\n :aria-label=\"t('panel.projects')\"\n >\n <template #cell-title=\"{ row }\">\n <div class=\"wx-tasks-projects__title\">\n <wx-text truncate weight=\"medium\">{{ row.title }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" mono>{{ row.slug }}</wx-text>\n <wx-badge v-if=\"row.archived\" size=\"sm\">{{ t('panel.project-archived') }}</wx-badge>\n </div>\n </template>\n\n <template #cell-workdir=\"{ row }\">\n <wx-text size=\"sm\" tone=\"muted\" mono truncate>{{ row.workdir ?? '—' }}</wx-text>\n </template>\n\n <template #cell-actions=\"{ row }\">\n <wx-button v-if=\"canManage\" size=\"sm\" variant=\"outline\" @click=\"write(row)\">\n {{ t('panel.edit') }}\n </wx-button>\n </template>\n </wx-table>\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-tasks-projects__title {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-2);\n align-items: flex-start;\n min-width: 0;\n}\n</style>\n","import type { BadgeType } from '@webx-ui/core'\nimport type { Priority, StageStatus, TaskStatus } from './types'\n\n/**\n * The colour each status is said in. One table for the list and the task, so a stage that waits\n * for a person is the same colour in both: warning is \"somebody has to act\", primary is \"work is\n * going\", success and quiet are over.\n */\nexport const taskTones: Record<TaskStatus, BadgeType> = {\n draft: 'default',\n ready: 'info',\n in_progress: 'primary',\n review: 'warning',\n done: 'success',\n cancelled: 'default',\n}\n\nexport const stageTones: Record<StageStatus, BadgeType> = {\n pending: 'default',\n ready: 'info',\n in_progress: 'primary',\n review: 'warning',\n rework: 'danger',\n blocked: 'warning',\n done: 'success',\n cancelled: 'default',\n}\n\nexport const priorityTones: Record<Priority, BadgeType> = {\n low: 'default',\n normal: 'info',\n high: 'danger',\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useBodyKeys,\n useErrorText,\n useTranslate,\n WxSaveState,\n WxScreen,\n WxScreenHead,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n toast,\n WxActionBar,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxSkeleton,\n WxText,\n} from '@webx-ui/core'\nimport type { Patch, ScreenModel } from '@webx-ui/schema'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { stageTones } from './tones'\nimport type { Project, Stage, StageInput, TaskDetail, TaskInput } from './types'\n\n/**\n * The form of a task (§6.3): the described screen `tasks.form` — so a project can move or relabel\n * a field with a patch — with the rules of §3 laid over it by the page.\n *\n * A draft is the author's: every field, and the stages as one list to add to, reorder and remove\n * from. Once the task is in work the agents have read it, and what they read must stay what it\n * was: the task's own fields are shown but locked, except the priority — that is the order of the\n * queue, not the content of the work. Stages somebody already took are listed above the editor and\n * cannot be touched; the repeater holds only the ones nobody has started, and new ones go after\n * them. On save the list is put back together around the started stages, which keep their places.\n */\ndefineOptions({ name: 'WxTaskFormPage' })\n\nconst props = withDefaults(defineProps<{ id?: number | null; base?: string }>(), {\n id: null,\n base: '/tasks',\n})\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst task = ref<TaskDetail | null>(null)\nconst projects = ref<Project[]>([])\nconst values = ref<ScreenModel>({})\nconst snapshot = ref('')\nconst loading = ref(true)\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst canManage = context.can('tasks.manage')\n\nconst draft = computed(() => task.value === null || task.value.status === 'draft')\n\n/** Taken, reported, done or cancelled — the stages the rules keep as they are. */\nconst locked = computed<Stage[]>(() =>\n draft.value\n ? []\n : (task.value?.stages ?? []).filter(\n (stage) => stage.status !== 'pending' && stage.status !== 'ready',\n ),\n)\n\nconst current = computed(() => JSON.stringify(values.value))\nconst dirty = computed(() => snapshot.value !== '' && current.value !== snapshot.value)\n\nconst state = computed<'saving' | 'unsaved' | 'saved'>(() => {\n if (saving.value) return 'saving'\n\n return dirty.value || props.id === null ? 'unsaved' : 'saved'\n})\n\n/** What only the page knows: the projects to choose from, and what the rules lock. */\nconst patch = computed<Patch>(() => {\n const ops: Patch = [\n {\n op: 'set',\n target: 'project',\n props: {\n options: projects.value\n .filter((project) => !project.archived || project.id === values.value.project_id)\n .map((project) => ({ label: project.title, value: project.id })),\n // A task never moves between projects: its number is counted inside one.\n disabled: props.id !== null,\n },\n },\n ]\n\n if (!draft.value) {\n for (const target of ['title', 'branch', 'spec', 'acceptance']) {\n ops.push({ op: 'set', target, props: { disabled: true } })\n }\n }\n\n return ops\n})\n\nfunction editable(stage: Stage): StageInput {\n return {\n id: stage.id,\n title: stage.title,\n brief: stage.brief ?? '',\n acceptance: stage.acceptance ?? '',\n review_mode: stage.review_mode,\n }\n}\n\nfunction take(detail: TaskDetail | null): void {\n task.value = detail\n\n const model: ScreenModel = detail\n ? {\n project_id: projects.value.find((project) => project.slug === detail.project)?.id ?? null,\n title: detail.title,\n priority: detail.priority,\n branch: detail.branch ?? '',\n spec: detail.spec ?? '',\n acceptance: detail.acceptance ?? '',\n stages: detail.stages\n .filter(\n (stage) => detail.status === 'draft' || ['pending', 'ready'].includes(stage.status),\n )\n .map(editable),\n }\n : {\n project_id:\n Number(route.query.project) ||\n projects.value.find((project) => !project.archived)?.id ||\n null,\n title: '',\n priority: 'normal',\n branch: '',\n spec: '',\n acceptance: '',\n stages: [{ title: '', brief: '', acceptance: '', review_mode: 'auto' }],\n }\n\n values.value = model\n snapshot.value = JSON.stringify(model)\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n projects.value = await api.projects()\n take(props.id === null ? null : await api.task(props.id))\n } catch (error) {\n toast.danger(message(error))\n void router.push(props.base)\n } finally {\n loading.value = false\n }\n}\n\n/**\n * The stages as the server wants them (§3): in a draft, the list as it stands. In work, every\n * stage by id — the started ones in the places they had, the rest in the order of the editor —\n * and the new ones last.\n */\nfunction stagesToSend(): StageInput[] {\n const rows = (Array.isArray(values.value.stages) ? values.value.stages : []) as StageInput[]\n const clean = (row: StageInput): StageInput => ({\n ...(row.id ? { id: row.id } : {}),\n title: row.title ?? '',\n brief: row.brief || null,\n acceptance: row.acceptance || null,\n review_mode: row.review_mode ?? 'auto',\n })\n\n if (draft.value) return rows.map(clean)\n\n const existing = rows.filter((row) => row.id)\n const fresh = rows.filter((row) => !row.id)\n const slots: (StageInput | undefined)[] = []\n\n for (const stage of locked.value) slots[stage.position - 1] = { id: stage.id }\n\n let next = 0\n const total = locked.value.length + existing.length\n\n for (let index = 0; index < total; index += 1) {\n if (slots[index] === undefined) slots[index] = clean(existing[next++]!)\n }\n\n return [...(slots as StageInput[]), ...fresh.map(clean)]\n}\n\nfunction input(): TaskInput {\n const v = values.value\n\n if (!draft.value) {\n return { priority: v.priority as TaskInput['priority'], stages: stagesToSend() }\n }\n\n return {\n project_id: typeof v.project_id === 'number' ? v.project_id : undefined,\n title: String(v.title ?? ''),\n priority: v.priority as TaskInput['priority'],\n branch: v.branch ? String(v.branch) : null,\n spec: v.spec ? String(v.spec) : null,\n acceptance: v.acceptance ? String(v.acceptance) : null,\n stages: stagesToSend(),\n }\n}\n\nasync function save(): Promise<void> {\n if (saving.value || !canManage) return\n\n saving.value = true\n errors.value = {}\n\n try {\n const made = props.id === null\n const detail = made ? await api.create(input()) : await api.save(props.id as number, input())\n\n // Nothing left to protect: the page is about to be left for the task.\n snapshot.value = current.value\n toast.success(made ? t('panel.created') : t('panel.saved'))\n await router.push(`${props.base}/${detail.id}`)\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) {\n errors.value = body.errors\n toast.danger(t('panel.save-failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n\nfunction leaveGuard(event: BeforeUnloadEvent): void {\n if (dirty.value) event.preventDefault()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 's') {\n event.preventDefault()\n void save()\n }\n}\n\nuseBodyKeys(onKeydown)\n\nonMounted(() => {\n void load()\n window.addEventListener('beforeunload', leaveGuard)\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('beforeunload', leaveGuard)\n})\n\nonBeforeRouteLeave(async () => {\n if (!dirty.value || !canManage) return true\n\n return await confirm({\n title: t('panel.leave-title'),\n message: t('panel.leave-text'),\n confirmText: t('panel.leave'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n})\n\nconst title = computed(() =>\n props.id === null ? t('panel.new') : task.value?.title || t('panel.untitled'),\n)\n</script>\n\n<template>\n <div class=\"wx-task-form\" @keydown=\"onKeydown\">\n <wx-skeleton v-if=\"loading\" title :rows=\"8\" />\n\n <template v-else>\n <wx-screen-head\n :back=\"props.id === null ? props.base : `${props.base}/${props.id}`\"\n :back-label=\"t('panel.back')\"\n :title=\"title\"\n :subtitle=\"task?.ref\"\n />\n\n <wx-alert v-if=\"props.id === null && projects.length === 0\" type=\"info\">\n {{ t('panel.need-project') }}\n </wx-alert>\n\n <wx-alert v-if=\"!draft\" type=\"info\">{{ t('panel.locked-fields') }}</wx-alert>\n\n <wx-card v-if=\"locked.length > 0\" :title=\"t('panel.locked-stages')\">\n <wx-text size=\"sm\" tone=\"muted\">{{ t('panel.locked-help') }}</wx-text>\n <ol class=\"wx-task-form__locked\">\n <li v-for=\"stage in locked\" :key=\"stage.id\">\n <wx-text truncate>{{ stage.position }}. {{ stage.title }}</wx-text>\n <wx-badge size=\"sm\" :type=\"stageTones[stage.status]\">\n {{ t(`panel.stage-${stage.status}`) }}\n </wx-badge>\n </li>\n </ol>\n </wx-card>\n\n <wx-screen\n v-model=\"values\"\n name=\"tasks.form\"\n :patch=\"patch\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <wx-action-bar v-if=\"canManage\">\n <template #state>\n <wx-save-state :state=\"state\" />\n </template>\n\n <wx-button\n type=\"primary\"\n :loading=\"saving\"\n :disabled=\"(!dirty && props.id !== null) || projects.length === 0\"\n @click=\"save\"\n >\n {{ t('panel.save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-task-form {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n\n.wx-task-form__locked {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: var(--wx-space-12) 0 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-task-form__locked li {\n display: flex;\n gap: var(--wx-space-8);\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { renderMarkdown } from '@webx-ui/module-admin'\nimport { WxProse } from '@webx-ui/core'\n\n/**\n * A specification, a brief or a report as it was written: markdown, rendered with the panel's own\n * renderer. `WxProse` injects what it is given as it is, and that is safe here because the\n * renderer escapes every character before it builds a tag — what arrives holds only the tags it\n * made, whoever wrote the text, an agent included.\n */\ndefineOptions({ name: 'WxTasksMarkdown' })\n\nconst props = defineProps<{ source: string | null | undefined; empty?: string }>()\n\nconst html = computed(() => (props.source ? renderMarkdown(props.source) : ''))\n</script>\n\n<template>\n <wx-prose v-if=\"html\" class=\"wx-tasks-markdown\" :html=\"html\" size=\"sm\" />\n <p v-else-if=\"empty\" class=\"wx-tasks-markdown is-empty\">{{ empty }}</p>\n</template>\n\n<style scoped>\n.wx-tasks-markdown {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/*\n * A report is written in sections (`## Done`, `## How to check`), and at the size of a page's\n * headings they outshout the stage they belong to. Here a heading is a label of the text under it.\n */\n.wx-tasks-markdown :deep(:is(h1, h2, h3, h4)) {\n margin-block: var(--wx-space-12) var(--wx-space-4);\n font-size: var(--wx-font-size-md);\n}\n\n.wx-tasks-markdown :deep(:is(h1, h2, h3, h4):first-child) {\n margin-block-start: 0;\n}\n\n.wx-tasks-markdown.is-empty {\n margin: 0;\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { nextTick, onMounted, ref, useId, useTemplateRef } from 'vue'\nimport { useModal, WxButton, WxDialog, WxFormItem, WxSpace, WxTextarea } from '@webx-ui/core'\n\n/**\n * One text and a button: the remarks a stage is sent back with, the answer to an agent's\n * question, the reason a task is cancelled. Answers the text, or nothing when closed.\n *\n * `required` is for the two the rules insist on (§3): sending back without saying what is wrong,\n * or answering with nothing, would hand the next session a decision nobody made.\n */\ndefineOptions({ name: 'WxTasksTextDialog' })\n\nconst props = withDefaults(\n defineProps<{\n title: string\n label: string\n confirmText: string\n cancelText: string\n message?: string\n required?: boolean\n danger?: boolean\n }>(),\n { message: undefined, required: false, danger: false },\n)\n\nconst { open, resolve, dismiss } = useModal<string>()\n\nconst formId = useId()\nconst text = ref('')\nconst form = useTemplateRef<HTMLFormElement>('form')\n\nonMounted(async () => {\n await nextTick()\n form.value?.querySelector('textarea')?.focus()\n})\n\nfunction submit(): void {\n if (props.required && text.value.trim() === '') return\n\n resolve(text.value.trim())\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"props.title\" :width=\"520\">\n <p v-if=\"props.message\" class=\"wx-tasks-text-dialog__message\">{{ props.message }}</p>\n\n <form :id=\"formId\" ref=\"form\" @submit.prevent=\"submit\">\n <wx-form-item :label=\"props.label\" :required=\"props.required\">\n <wx-textarea v-model=\"text\" :rows=\"5\" :aria-label=\"props.label\" />\n </wx-form-item>\n </form>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ props.cancelText }}</wx-button>\n <wx-button\n :type=\"props.danger ? 'danger' : 'primary'\"\n native-type=\"submit\"\n :form=\"formId\"\n :disabled=\"props.required && text.trim() === ''\"\n >\n {{ props.confirmText }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-tasks-text-dialog__message {\n margin: 0 0 var(--wx-space-12);\n color: var(--wx-text-muted);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxScreenHead,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n createModal,\n toast,\n WxAccordion,\n WxAccordionItem,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxSkeleton,\n WxText,\n WxTextarea,\n WxTimeline,\n WxTimelineItem,\n type AccordionModelValue,\n} from '@webx-ui/core'\nimport TasksMarkdown from './TasksMarkdown.vue'\nimport TasksTextDialog from './TasksTextDialog.vue'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { priorityTones, stageTones, taskTones } from './tones'\nimport type { JournalEntry, Stage, TaskDetail } from './types'\n\n/**\n * One task (§6.2): what it is for, its stages in order, and everything that happened to it.\n *\n * The buttons are the moves §3 allows at the status the task or stage is in, offered only to\n * whoever may make them — accepting and sending back to a reviewer, answering an agent's question\n * and cancelling to whoever plans, releasing a hung stage to whoever plans or works. A move the\n * server still refuses (somebody got there first) comes back as its reason, and the task is read\n * again, because the screen is then out of date.\n *\n * The stage that waits for somebody is opened on arrival: on a task with six stages it is the one\n * the person came for.\n */\ndefineOptions({ name: 'WxTaskPage' })\n\nconst props = withDefaults(defineProps<{ id: number; base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst task = ref<TaskDetail | null>(null)\nconst loading = ref(true)\nconst busy = ref(false)\nconst open = ref<AccordionModelValue>([])\nconst comment = ref('')\n\nconst canManage = context.can('tasks.manage')\nconst canReview = context.can('tasks.review')\nconst canWork = context.can('tasks.work')\nconst canComment = canManage || canReview || canWork\n\nconst ask = createModal<string, InstanceType<typeof TasksTextDialog>['$props']>(TasksTextDialog)\n\nconst closed = computed(() => task.value?.status === 'done' || task.value?.status === 'cancelled')\n\n/** The stages a person may be waiting on, first — what is opened on arrival. */\nfunction waiting(detail: TaskDetail): Stage | undefined {\n return (\n detail.stages.find((stage) => stage.status === 'review' || stage.status === 'blocked') ??\n detail.stages.find((stage) => !['done', 'cancelled', 'pending'].includes(stage.status))\n )\n}\n\nfunction take(detail: TaskDetail): void {\n task.value = detail\n\n if ((open.value as string[]).length === 0) {\n const first = waiting(detail)\n open.value = first ? [String(first.id)] : []\n }\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n take(await api.task(props.id))\n } catch (error) {\n toast.danger(message(error))\n void router.push(props.base)\n } finally {\n loading.value = false\n }\n}\n\nwatch(() => props.id, load, { immediate: true })\n\n/**\n * A move, its toast, and the task as the server has it afterwards. A refusal reloads too: the\n * screen was showing a task that is not there any more.\n */\nasync function act(work: () => Promise<TaskDetail>, said: string): Promise<void> {\n if (busy.value) return\n\n busy.value = true\n\n try {\n take(await work())\n toast.success(said)\n // The badge in the menu counts what waits for a person; this may have changed it.\n void context.refreshManifest()\n } catch (error) {\n toast.danger(message(error))\n await load()\n } finally {\n busy.value = false\n }\n}\n\nasync function start(): Promise<void> {\n const current = task.value\n if (current) await act(() => api.ready(current.id), t('panel.started'))\n}\n\nasync function cancelTask(): Promise<void> {\n const current = task.value\n if (!current) return\n\n const reason = await ask({\n title: t('panel.cancel-task-title', { title: current.title }),\n message: t('panel.cancel-task-text'),\n label: t('panel.note'),\n confirmText: t('panel.cancel-task'),\n cancelText: t('panel.keep'),\n danger: true,\n })\n\n if (reason !== null && reason !== undefined) {\n await act(() => api.cancel(current.id, reason), t('panel.cancelled'))\n }\n}\n\nasync function accept(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.accept-title', { stage: stage.title }),\n message: t('panel.accept-text'),\n confirmText: t('panel.accept'),\n cancelText: t('panel.keep'),\n })\n\n if (agreed) await act(() => api.accept(stage.id), t('panel.accepted'))\n}\n\nasync function rework(stage: Stage): Promise<void> {\n const remarks = await ask({\n title: t('panel.rework-title', { stage: stage.title }),\n label: t('panel.rework-label'),\n confirmText: t('panel.rework'),\n cancelText: t('panel.keep'),\n required: true,\n })\n\n if (remarks) await act(() => api.rework(stage.id, remarks), t('panel.reworked'))\n}\n\nasync function answer(stage: Stage): Promise<void> {\n const text = await ask({\n title: t('panel.answer-title'),\n message: question(stage)?.body ?? undefined,\n label: t('panel.answer-label'),\n confirmText: t('panel.send'),\n cancelText: t('panel.keep'),\n required: true,\n })\n\n if (text) await act(() => api.unblock(stage.id, text), t('panel.answered'))\n}\n\nasync function release(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.release-title', { stage: stage.title }),\n message: t('panel.release-text'),\n confirmText: t('panel.release'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n\n if (agreed) await act(() => api.release(stage.id), t('panel.released'))\n}\n\nasync function cancelStage(stage: Stage): Promise<void> {\n const agreed = await confirm({\n title: t('panel.cancel-stage-title', { stage: stage.title }),\n message: t('panel.cancel-stage-text'),\n confirmText: t('panel.cancel-stage'),\n cancelText: t('panel.keep'),\n tone: 'danger',\n })\n\n if (agreed) await act(() => api.cancelStage(stage.id), t('panel.stage-cancelled'))\n}\n\nasync function send(): Promise<void> {\n const current = task.value\n const body = comment.value.trim()\n\n if (!current || body === '') return\n\n await act(() => api.comment(current.id, body), t('panel.commented'))\n comment.value = ''\n}\n\n/** The last question asked on a stage, when it is waiting for its answer. */\nfunction question(stage: Stage): JournalEntry | undefined {\n return [...(task.value?.journal ?? [])]\n .reverse()\n .find((entry) => entry.stage_id === stage.id && entry.kind === 'question')\n}\n\n/** Who may do what to this stage now (§3, §5). */\nfunction moves(stage: Stage): { key: string; label: string; primary?: boolean; run: () => void }[] {\n if (closed.value) return []\n\n const list: { key: string; label: string; primary?: boolean; run: () => void }[] = []\n\n if (stage.status === 'review' && canReview) {\n list.push({\n key: 'accept',\n label: t('panel.accept'),\n primary: true,\n run: () => void accept(stage),\n })\n list.push({ key: 'rework', label: t('panel.rework'), run: () => void rework(stage) })\n }\n\n if (stage.status === 'blocked' && canManage) {\n list.push({\n key: 'answer',\n label: t('panel.answer'),\n primary: true,\n run: () => void answer(stage),\n })\n }\n\n if (stage.status === 'in_progress' && (canManage || canWork)) {\n list.push({ key: 'release', label: t('panel.release'), run: () => void release(stage) })\n }\n\n if (canManage && !['done', 'cancelled'].includes(stage.status)) {\n list.push({ key: 'cancel', label: t('panel.cancel-stage'), run: () => void cancelStage(stage) })\n }\n\n return list\n}\n\nfunction stageNumber(entry: JournalEntry): number | null {\n return task.value?.stages.find((stage) => stage.id === entry.stage_id)?.position ?? null\n}\n\n/** What a line of the journal says happened, in the reader's words. */\nfunction said(entry: JournalEntry): string {\n const from = typeof entry.meta?.from === 'string' ? entry.meta.from : null\n const to = typeof entry.meta?.to === 'string' ? entry.meta.to : null\n\n if (entry.kind === 'status' && to !== null) {\n const words = (status: string) =>\n entry.stage_id === null ? t(`panel.status-${status}`) : t(`panel.stage-${status}`)\n\n return from === null ? words(to) : `${words(from)} → ${words(to)}`\n }\n\n return t(`panel.kind-${entry.kind}`)\n}\n\nconst actions = computed<ScreenAction[]>(() => {\n const current = task.value\n\n if (!current || !canManage) return []\n\n const list: ScreenAction[] = []\n\n if (current.status === 'draft') {\n list.push({\n key: 'start',\n label: t('panel.start'),\n icon: 'play',\n primary: true,\n run: () => void start(),\n })\n }\n\n if (!closed.value) {\n list.push({\n key: 'edit',\n label: t('panel.edit'),\n icon: 'edit',\n run: () => void router.push(`${props.base}/${current.id}/edit`),\n })\n list.push({\n key: 'cancel',\n label: t('panel.cancel-task'),\n icon: 'close',\n danger: true,\n menu: true,\n run: () => void cancelTask(),\n })\n }\n\n return list\n})\n</script>\n\n<template>\n <div class=\"wx-task\">\n <wx-skeleton v-if=\"loading && !task\" title :rows=\"8\" />\n\n <template v-else-if=\"task\">\n <wx-screen-head\n :back=\"props.base\"\n :back-label=\"t('panel.back')\"\n :title=\"task.title || t('panel.untitled')\"\n :subtitle=\"task.ref\"\n :actions=\"actions\"\n >\n <template #title-after>\n <wx-badge :type=\"taskTones[task.status]\">{{ t(`panel.status-${task.status}`) }}</wx-badge>\n </template>\n </wx-screen-head>\n\n <wx-card>\n <div class=\"wx-task__about\">\n <div class=\"wx-task__facts\">\n <wx-badge variant=\"outline\" :type=\"priorityTones[task.priority]\">\n {{ t(`panel.priority-${task.priority}`) }}\n </wx-badge>\n <wx-text v-if=\"task.branch\" size=\"sm\" tone=\"muted\" mono>\n {{ t('panel.branch') }}: {{ task.branch }}\n </wx-text>\n </div>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h3\" weight=\"semibold\">{{ t('panel.spec') }}</wx-text>\n <tasks-markdown :source=\"task.spec\" :empty=\"t('panel.no-spec')\" />\n </section>\n\n <section v-if=\"task.acceptance\" class=\"wx-task__section\">\n <wx-text as=\"h3\" weight=\"semibold\">{{ t('panel.acceptance') }}</wx-text>\n <tasks-markdown :source=\"task.acceptance\" />\n </section>\n </div>\n </wx-card>\n\n <wx-card :title=\"t('panel.stages')\">\n <wx-accordion v-model=\"open\" multiple>\n <wx-accordion-item\n v-for=\"stage in task.stages\"\n :key=\"stage.id\"\n :value=\"String(stage.id)\"\n :title=\"`${stage.position}. ${stage.title}`\"\n :subtitle=\"\n [\n stage.assignee,\n stage.attempt > 1 ? t('panel.attempt', { attempt: stage.attempt }) : null,\n stage.review_mode === 'human' ? t('panel.by-person') : null,\n ]\n .filter(Boolean)\n .join(' · ')\n \"\n >\n <template #extra>\n <wx-badge size=\"sm\" :type=\"stageTones[stage.status]\">\n {{ t(`panel.stage-${stage.status}`) }}\n </wx-badge>\n </template>\n\n <div class=\"wx-task__stage\">\n <wx-alert\n v-if=\"stage.status === 'blocked' && question(stage)\"\n type=\"warning\"\n :title=\"t('panel.question')\"\n >\n <tasks-markdown :source=\"question(stage)?.body\" />\n </wx-alert>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">{{ t('panel.brief') }}</wx-text>\n <tasks-markdown :source=\"stage.brief\" empty=\"—\" />\n </section>\n\n <section v-if=\"stage.acceptance\" class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">\n {{ t('panel.stage-acceptance') }}\n </wx-text>\n <tasks-markdown :source=\"stage.acceptance\" />\n </section>\n\n <section class=\"wx-task__section\">\n <wx-text as=\"h4\" size=\"sm\" weight=\"semibold\">{{ t('panel.report') }}</wx-text>\n <tasks-markdown :source=\"stage.report\" :empty=\"t('panel.no-report')\" />\n <wx-text v-if=\"stage.result_ref\" size=\"sm\" mono class=\"wx-task__result\">\n {{ t('panel.result') }}: {{ stage.result_ref }}\n </wx-text>\n </section>\n\n <div v-if=\"moves(stage).length > 0\" class=\"wx-task__moves\">\n <wx-button\n v-for=\"move in moves(stage)\"\n :key=\"move.key\"\n size=\"sm\"\n :type=\"move.primary ? 'primary' : 'default'\"\n :variant=\"move.primary ? undefined : 'outline'\"\n :disabled=\"busy\"\n @click=\"move.run\"\n >\n {{ move.label }}\n </wx-button>\n </div>\n </div>\n </wx-accordion-item>\n </wx-accordion>\n </wx-card>\n\n <wx-card :title=\"t('panel.journal')\">\n <div v-if=\"canComment && !closed\" class=\"wx-task__comment\">\n <wx-textarea\n v-model=\"comment\"\n :rows=\"2\"\n :placeholder=\"t('panel.comment-placeholder')\"\n :aria-label=\"t('panel.comment')\"\n />\n <wx-button size=\"sm\" :disabled=\"busy || comment.trim() === ''\" @click=\"send\">\n {{ t('panel.comment') }}\n </wx-button>\n </div>\n\n <wx-text v-if=\"task.journal.length === 0\" tone=\"muted\">{{\n t('panel.journal-empty')\n }}</wx-text>\n\n <wx-timeline v-else size=\"sm\">\n <wx-timeline-item\n v-for=\"entry in [...task.journal].reverse()\"\n :key=\"entry.id\"\n :type=\"entry.actor_type === 'agent' ? 'primary' : undefined\"\n :hollow=\"entry.actor_type === 'system'\"\n >\n <div class=\"wx-task__entry\">\n <div class=\"wx-task__entry-head\">\n <wx-text size=\"sm\" weight=\"medium\">\n {{ entry.actor_type === 'system' ? t('panel.system') : entry.actor_name }}\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\">\n {{ said(entry) }}\n <template v-if=\"stageNumber(entry) !== null\"\n >· #{{ stageNumber(entry) }}</template\n >\n </wx-text>\n <wx-date :value=\"entry.created_at\" compact size=\"sm\" tone=\"muted\" />\n </div>\n <!-- A report is read on its stage; here it would be the same pages twice. -->\n <tasks-markdown v-if=\"entry.body && entry.kind !== 'report'\" :source=\"entry.body\" />\n </div>\n </wx-timeline-item>\n </wx-timeline>\n </wx-card>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-task {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n\n.wx-task__about,\n.wx-task__stage {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-task__facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-12);\n align-items: center;\n}\n\n.wx-task__section {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-task__section > :first-child {\n margin: 0;\n}\n\n.wx-task__result {\n overflow-wrap: anywhere;\n}\n\n.wx-task__moves {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n}\n\n.wx-task__comment {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n align-items: flex-end;\n margin-block-end: var(--wx-space-16);\n}\n\n.wx-task__entry {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-task__entry-head {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n align-items: baseline;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxListScreen,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type SelectValue,\n type TabItem,\n type TableColumn,\n type TableState,\n type TabValue,\n} from '@webx-ui/core'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\nimport { priorityTones, stageTones, taskTones } from './tones'\nimport type { Project, TaskRow, TasksPage, TaskView } from './types'\n\n/**\n * The tasks (§6.1): a table, not a board. One row per task — its reference, what it is called,\n * where it is and which stage it is on — highest priority first, then the most recently changed.\n *\n * The views are the questions somebody opens this screen with: what waits for me, what is\n * being worked on, what I have not put to work yet, what is over. «Waiting for me» is the one\n * the badge in the menu counts — a stage a person has to check, or an agent's question.\n *\n * Everything the list is looking at lives in the address, so a link to it is a link.\n */\ndefineOptions({ name: 'WxTasksPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst page = ref<TasksPage | null>(null)\nconst projects = ref<Project[]>([])\nconst loading = ref(true)\n\nconst canManage = context.can('tasks.manage')\n\nconst VIEWS: TaskView[] = ['all', 'waiting', 'active', 'draft', 'closed']\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'tasks')?.title ??\n t('module.title'),\n)\n\nconst view = computed<TabValue>({\n get: () =>\n typeof route.query.view === 'string' && VIEWS.includes(route.query.view as TaskView)\n ? route.query.view\n : 'all',\n set: (value) => {\n void router.replace({\n query: { ...route.query, view: value === 'all' ? undefined : String(value), page: undefined },\n })\n },\n})\n\nconst project = computed<SelectValue | null>({\n get: () => (typeof route.query.project === 'string' ? Number(route.query.project) : null),\n set: (value) => {\n void router.replace({\n query: {\n ...route.query,\n project: value === null || value === '' ? undefined : String(value),\n page: undefined,\n },\n })\n },\n})\n\nconst views = computed<TabItem[]>(() =>\n VIEWS.map((value) => ({\n value,\n label: t(`panel.view-${value}`),\n badge: page.value?.counts[value] ?? undefined,\n })),\n)\n\nconst projectOptions = computed(() =>\n projects.value.map((one) => ({ label: one.title, value: one.id })),\n)\n\nconst rows = computed(() => page.value?.data ?? [])\n\n/*\n * The task and its stage stay at every width; the project goes first — it is in the reference\n * already — then the date and the priority.\n */\nconst columns = computed<TableColumn<TaskRow>[]>(() => [\n { key: 'title', label: t('panel.column-task'), minWidth: 220 },\n { key: 'status', label: t('panel.column-status'), width: 140 },\n { key: 'current_stage', label: t('panel.column-stage'), minWidth: 180, hideBelow: 640 },\n { key: 'priority', label: t('panel.column-priority'), width: 120, hideBelow: 760 },\n { key: 'updated_at', label: t('panel.column-updated'), width: 120, hideBelow: 900 },\n])\n\nasync function load(state?: TableState): Promise<void> {\n loading.value = true\n\n try {\n page.value = await api.tasks({\n view: view.value as TaskView,\n project: typeof project.value === 'number' ? project.value : null,\n q: state?.search ?? (typeof route.query.q === 'string' ? route.query.q : ''),\n page: state?.page ?? (Number(route.query.page ?? 1) || 1),\n per_page: state?.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction onState(state: TableState): void {\n void router.replace({\n query: {\n ...route.query,\n q: state.search === '' ? undefined : state.search,\n page: state.page === 1 ? undefined : String(state.page),\n },\n })\n void load(state)\n}\n\nasync function loadProjects(): Promise<void> {\n try {\n projects.value = await api.projects()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nwatch([view, project], () => void load())\n\nvoid load()\nvoid loadProjects()\n\nfunction open(row: TaskRow): void {\n void router.push(`${props.base}/${row.id}`)\n}\n\nconst actions = computed<ScreenAction[]>(() => [\n {\n key: 'projects',\n label: t('panel.projects'),\n icon: 'folder',\n run: () => void router.push(`${props.base}/projects`),\n },\n ...(canManage\n ? [\n {\n key: 'settings',\n label: t('panel.settings'),\n icon: 'settings' as const,\n menu: true,\n run: () => void router.push(`${props.base}/settings`),\n },\n {\n key: 'new',\n label: t('panel.new'),\n icon: 'plus' as const,\n primary: true,\n run: () => void router.push(`${props.base}/new`),\n },\n ]\n : []),\n])\n</script>\n\n<template>\n <div class=\"wx-tasks-list\">\n <wx-list-screen v-model:view=\"view\" :title=\"title\" :views=\"views\" :actions=\"actions\">\n <template #actions>\n <wx-select\n v-if=\"projects.length > 1\"\n v-model=\"project\"\n class=\"wx-tasks-list__project\"\n :options=\"projectOptions\"\n :placeholder=\"t('panel.all-projects')\"\n :aria-label=\"t('panel.all-projects')\"\n clearable\n size=\"sm\"\n />\n </template>\n\n <wx-table\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n hover\n flush\n layout=\"fixed\"\n :loading=\"loading\"\n :cards-below=\"0\"\n :search-placeholder=\"t('panel.search')\"\n :empty-text=\"rows.length === 0 && !loading ? t('panel.empty') : undefined\"\n :aria-label=\"title\"\n @state-change=\"onState\"\n @row-click=\"open\"\n >\n <template #cell-title=\"{ row }\">\n <div class=\"wx-tasks-list__task\">\n <wx-text size=\"sm\" tone=\"muted\" mono>{{ row.ref }}</wx-text>\n <wx-text truncate weight=\"medium\">{{ row.title }}</wx-text>\n </div>\n </template>\n\n <template #cell-status=\"{ row }\">\n <wx-badge :type=\"taskTones[row.status]\">{{ t(`panel.status-${row.status}`) }}</wx-badge>\n </template>\n\n <template #cell-current_stage=\"{ row }\">\n <div v-if=\"row.current_stage\" class=\"wx-tasks-list__stage\">\n <wx-text size=\"sm\" truncate>\n {{ t('panel.stage-of', { position: row.current_stage.position, count: row.stages }) }}\n · {{ row.current_stage.title }}\n </wx-text>\n <wx-badge size=\"sm\" :type=\"stageTones[row.current_stage.status]\">\n {{ t(`panel.stage-${row.current_stage.status}`) }}\n </wx-badge>\n </div>\n <wx-text v-else size=\"sm\" tone=\"muted\">—</wx-text>\n </template>\n\n <template #cell-priority=\"{ row }\">\n <wx-badge variant=\"outline\" :type=\"priorityTones[row.priority]\">\n {{ t(`panel.priority-${row.priority}`) }}\n </wx-badge>\n </template>\n\n <template #cell-updated_at=\"{ row }\">\n <wx-date :value=\"row.updated_at\" compact size=\"sm\" tone=\"muted\" />\n </template>\n </wx-table>\n </wx-list-screen>\n </div>\n</template>\n\n<style scoped>\n.wx-tasks-list {\n min-width: 0;\n}\n\n.wx-tasks-list__project {\n width: 200px;\n max-width: 100%;\n}\n\n.wx-tasks-list__task,\n.wx-tasks-list__stage {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-2);\n align-items: flex-start;\n min-width: 0;\n}\n\n/* Held to the cell, or a long title runs under the next column instead of ending in an ellipsis. */\n.wx-tasks-list__task > *,\n.wx-tasks-list__stage > * {\n max-width: 100%;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxSaveState,\n WxScreen,\n WxScreenHead,\n} from '@webx-ui/module-admin'\nimport { toast, WxActionBar, WxAlert, WxButton, WxSkeleton } from '@webx-ui/core'\nimport type { Patch, ScreenModel } from '@webx-ui/schema'\nimport { createTasksApi } from './api'\nimport { useTasksMessages } from './i18n'\n\n/**\n * Where a person decides what they are told about (§6a): the bot, the chats, the events.\n *\n * The described screen `tasks.settings`, a save, and a test message — the one way to know the\n * token and the chats are right before the first real notice goes nowhere. The token is typed in\n * and never shown again: the screen says whether one is set, an empty field keeps it, and\n * forgetting it is a button of its own.\n */\ndefineOptions({ name: 'WxTasksSettingsPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/tasks' })\n\nconst context = useAdmin()\nconst api = createTasksApi(context)\nuseTasksMessages()\n\nconst t = useTranslate('webx-tasks')\nconst message = useErrorText()\n\nconst TOKEN = 'tasks.telegram.token'\n\nconst values = ref<ScreenModel>({})\nconst snapshot = ref('')\nconst tokenSet = ref(false)\nconst loading = ref(true)\nconst saving = ref(false)\nconst testing = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst canManage = context.can('tasks.manage')\n\nconst dirty = computed(\n () => snapshot.value !== '' && JSON.stringify(values.value) !== snapshot.value,\n)\n\nconst state = computed<'saving' | 'unsaved' | 'saved'>(() =>\n saving.value ? 'saving' : dirty.value ? 'unsaved' : 'saved',\n)\n\n/* The field says whether a token is there without ever holding it. */\nconst patch = computed<Patch>(() => [\n { op: 'set', target: 'token', props: { placeholder: tokenSet.value ? '••••••••' : '' } },\n])\n\nfunction take(settings: { values: Record<string, unknown>; token_set: boolean }): void {\n values.value = { ...settings.values, [TOKEN]: '' }\n snapshot.value = JSON.stringify(values.value)\n tokenSet.value = settings.token_set\n}\n\nonMounted(async () => {\n try {\n take(await api.settings())\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n})\n\nasync function save(forget = false): Promise<void> {\n if (saving.value) return\n\n saving.value = true\n errors.value = {}\n\n try {\n take(await api.saveSettings(values.value, forget))\n toast.success(forget ? t('panel.token-forgotten') : t('panel.settings-saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n else toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nasync function test(): Promise<void> {\n testing.value = true\n\n try {\n toast.success(await api.testNotice())\n } catch (error) {\n toast.danger(message(error))\n } finally {\n testing.value = false\n }\n}\n</script>\n\n<template>\n <div class=\"wx-tasks-settings\">\n <wx-screen-head :back=\"props.base\" :back-label=\"t('panel.back')\" :title=\"t('panel.settings')\" />\n\n <wx-skeleton v-if=\"loading\" title :rows=\"6\" />\n\n <template v-else>\n <wx-alert :type=\"tokenSet ? 'success' : 'info'\">\n {{ tokenSet ? t('panel.token-set') : t('panel.token-not-set') }}\n </wx-alert>\n\n <wx-screen\n v-model=\"values\"\n name=\"tasks.settings\"\n :patch=\"patch\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <wx-action-bar v-if=\"canManage\">\n <template #state>\n <wx-save-state :state=\"state\" />\n </template>\n\n <wx-button v-if=\"tokenSet\" variant=\"outline\" :disabled=\"saving\" @click=\"save(true)\">\n {{ t('panel.forget-token') }}\n </wx-button>\n <wx-button variant=\"outline\" :loading=\"testing\" :disabled=\"dirty\" @click=\"test\">\n {{ t('panel.send-test') }}\n </wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"!dirty\" @click=\"save()\">\n {{ t('panel.save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-tasks-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n container-type: inline-size;\n}\n</style>\n","import type { AdminModule } from '@webx-ui/module-admin'\nimport ProjectsPage from './ProjectsPage.vue'\nimport TaskFormPage from './TaskFormPage.vue'\nimport TaskPage from './TaskPage.vue'\nimport TasksPage from './TasksPage.vue'\nimport TasksSettingsPage from './TasksSettingsPage.vue'\n\nexport interface TasksOptions {\n /** Where the section lives inside the panel. */\n path?: string\n}\n\n/**\n * «Tasks» as a section of the panel (§6): the list, one task, its form, the projects, and the\n * notification settings (§6a).\n *\n * The id matches the module the server reports, which is what makes the entry appear in the\n * navigation — with the count of what waits for a person beside it.\n */\nexport function tasks(options: TasksOptions = {}): AdminModule {\n const path = options.path ?? '/tasks'\n const base = { base: path }\n const id = (value: string | string[]) => Number(Array.isArray(value) ? value[0] : value)\n\n return {\n id: 'tasks',\n path,\n routes: [\n { path, name: 'webx.tasks', component: TasksPage, props: base },\n {\n path: `${path}/projects`,\n name: 'webx.tasks.projects',\n component: ProjectsPage,\n props: base,\n },\n {\n path: `${path}/settings`,\n name: 'webx.tasks.settings',\n component: TasksSettingsPage,\n props: base,\n },\n {\n path: `${path}/new`,\n name: 'webx.tasks.new',\n component: TaskFormPage,\n props: { ...base, id: null },\n },\n {\n path: `${path}/:id(\\\\d+)`,\n name: 'webx.tasks.task',\n component: TaskPage,\n props: (route) => ({ ...base, id: id(route.params.id as string) }),\n },\n {\n path: `${path}/:id(\\\\d+)/edit`,\n name: 'webx.tasks.edit',\n component: TaskFormPage,\n props: (route) => ({ ...base, id: id(route.params.id as string) }),\n },\n ],\n }\n}\n"],"names":["createTasksApi","admin","base","data","body","task","path","input","id","query","reason","stageId","stage","note","remarks","answer","values","forgetToken","tasksMessages","seeded","useTasksMessages","i18n","useAdmin","props","__props","open","resolve","dismiss","useModal","context","api","t","useTranslate","message","useErrorText","formId","useId","saving","ref","errors","reactive","submit","toast","error","_createBlock","_unref","WxDialog","$event","_createVNode","WxSpace","WxButton","_createElementVNode","WxFormItem","WxInput","_cache","WxTextarea","WxSwitch","projects","loading","canManage","edit","createModal","ProjectDialog","columns","computed","load","write","project","actions","WxListScreen","WxTable","_withCtx","row","_hoisted_1","WxText","_createTextVNode","_toDisplayString","WxBadge","taskTones","stageTones","priorityTones","route","useRoute","router","useRouter","snapshot","draft","locked","current","dirty","state","patch","ops","target","editable","take","detail","model","stagesToSend","rows","clean","existing","fresh","slots","next","total","index","v","save","made","leaveGuard","event","onKeydown","useBodyKeys","onMounted","onBeforeUnmount","onBeforeRouteLeave","confirm","title","_createElementBlock","WxSkeleton","_Fragment","WxScreenHead","WxAlert","WxCard","_renderList","WxScreen","WxActionBar","WxSaveState","html","renderMarkdown","WxProse","text","form","useTemplateRef","nextTick","_openBlock","busy","comment","canReview","canWork","canComment","ask","TasksTextDialog","closed","waiting","first","watch","act","work","said","start","cancelTask","accept","rework","question","release","cancelStage","send","entry","moves","list","stageNumber","from","to","words","status","_hoisted_2","_hoisted_3","_hoisted_4","TasksMarkdown","_hoisted_5","WxAccordion","WxAccordionItem","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","move","_hoisted_11","WxTimeline","WxTimelineItem","_hoisted_12","_hoisted_13","WxDate","page","VIEWS","module","view","value","views","projectOptions","one","onState","loadProjects","WxSelect","TOKEN","tokenSet","testing","settings","forget","test","tasks","options","TasksPage","ProjectsPage","TasksSettingsPage","TaskFormPage","TaskPage"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webx-ui/module-tasks",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A queue of work between people and AI agents for the WebX UI admin panel: tasks, ordered stages, reports, review and the journal.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@webx-ui/core": "^0.41.0",
47
- "@webx-ui/module-admin": "^0.27.0",
47
+ "@webx-ui/module-admin": "^0.28.0",
48
48
  "@webx-ui/schema": "^0.9.1"
49
49
  },
50
50
  "devDependencies": {