@fayz-ai/plugin-tasks 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,13 +3,13 @@ import { type ResolvedTasksConfig } from '../context';
3
3
  import type { TasksDataProvider } from '../data/types';
4
4
  import type { TasksUIState } from '../store';
5
5
  import { type StoreApi } from 'zustand';
6
- interface TasksTopbarWidgetProps {
6
+ interface TasksLauncherProps {
7
7
  config: {
8
8
  tasksConfig: ResolvedTasksConfig;
9
9
  tasksProvider: TasksDataProvider;
10
10
  tasksStore: StoreApi<TasksUIState>;
11
11
  };
12
12
  }
13
- export declare function TasksTopbarButton({ config }: TasksTopbarWidgetProps): React.JSX.Element;
13
+ export declare function TasksLauncher({ config }: TasksLauncherProps): React.JSX.Element;
14
14
  export {};
15
- //# sourceMappingURL=TasksTopbarButton.d.ts.map
15
+ //# sourceMappingURL=TasksLauncher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TasksLauncher.d.ts","sourceRoot":"","sources":["../../src/components/TasksLauncher.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAKxC,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEjD,UAAU,kBAAkB;IAC1B,MAAM,EAAE;QACN,WAAW,EAAE,mBAAmB,CAAA;QAChC,aAAa,EAAE,iBAAiB,CAAA;QAChC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;KACnC,CAAA;CACF;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBA4C3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAkD,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAgB3C,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACnC,mBAAmB;IACnB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,kBAAkB;IAClB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,yDAAyD;IACzD,eAAe,CAAC,EAAE,YAAY,CAAA;CAC/B;AA2BD,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAoI9E;AAMD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACvE,YAAY,EACV,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EACvD,eAAe,EAAE,eAAe,EAAE,SAAS,GAC5C,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAkD,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAgB3C,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACnC,mBAAmB;IACnB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,kBAAkB;IAClB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,yDAAyD;IACzD,eAAe,CAAC,EAAE,YAAY,CAAA;CAC/B;AA2BD,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAsI9E;AAMD,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACvE,YAAY,EACV,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EACvD,eAAe,EAAE,eAAe,EAAE,SAAS,GAC5C,MAAM,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import React4, { useEffect, useState, useCallback } from 'react';
2
- import { createPluginContext, registerNotesTasksAdapter, NOTE_LABEL_PREFIX, dedup, useRightRailStore, useRightRailPanel, useTenantPluginSettings, useDelegateToAssistant } from '@fayz-ai/admin';
2
+ import { createPluginContext, registerNotesTasksAdapter, NOTE_LABEL_PREFIX, dedup, useRightRailStore, useRightRailPanel, useTenantPluginSettings, useWidgetSurface, useDelegateToAssistant } from '@fayz-ai/admin';
3
3
  import { registerTranslations, createSafeDataProvider, useTranslation, getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core';
4
4
  import { createStore } from 'zustand/vanilla';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
  import { CheckSquare, ClipboardList, Plus, ArrowLeft, Trash2, ChevronDown, Calendar, Sparkles, ListChecks, ChevronRight, AlertTriangle, ArrowUp, Minus, ArrowDown } from 'lucide-react';
7
- import { Button, cn, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetBody, Checkbox } from '@fayz-ai/ui';
7
+ import { useLayoutStore, useRailRow, cn, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetBody, Checkbox } from '@fayz-ai/ui';
8
8
  import { useStore } from 'zustand';
9
9
 
10
10
  // src/index.ts
@@ -977,7 +977,7 @@ function TasksDrawer() {
977
977
  /* @__PURE__ */ jsx(SheetBody, { className: "flex flex-col px-0 py-0", children: /* @__PURE__ */ jsx(TasksPanel, {}) })
978
978
  ] }) });
979
979
  }
980
- function TasksTopbarButton({ config }) {
980
+ function TasksLauncher({ config }) {
981
981
  const { tasksConfig, tasksProvider, tasksStore } = config;
982
982
  const t = useTranslation();
983
983
  const railMounted = useRightRailStore((s) => s.mounted);
@@ -1002,14 +1002,15 @@ function TasksTopbarButton({ config }) {
1002
1002
  )
1003
1003
  );
1004
1004
  return /* @__PURE__ */ jsxs(TasksContextProvider, { config: tasksConfig, provider: tasksProvider, store: tasksStore, children: [
1005
- /* @__PURE__ */ jsx(TasksTopbarButtonInner, { store: tasksStore, railMounted }),
1005
+ /* @__PURE__ */ jsx(TasksLauncherRow, { store: tasksStore, railMounted }),
1006
1006
  !railMounted && /* @__PURE__ */ jsx(TasksDrawer, {})
1007
1007
  ] });
1008
1008
  }
1009
- function TasksTopbarButtonInner({
1009
+ function TasksLauncherRow({
1010
1010
  store,
1011
1011
  railMounted
1012
1012
  }) {
1013
+ const t = useTranslation();
1013
1014
  const toggleDrawer = useStore(store, (s) => s.toggleDrawer);
1014
1015
  const fetchSummary = useStore(store, (s) => s.fetchSummary);
1015
1016
  const summary = useStore(store, (s) => s.summary);
@@ -1018,22 +1019,50 @@ function TasksTopbarButtonInner({
1018
1019
  fetchSummary();
1019
1020
  }, [fetchSummary]);
1020
1021
  const pendingCount = summary ? summary.todo + summary.inProgress : 0;
1022
+ const collapsed = useLayoutStore((s) => s.sidebarCollapsed);
1023
+ const surface = useWidgetSurface();
1024
+ const compact = collapsed || surface === "topbar";
1025
+ const label = t("tasks.drawer.title") || "Tasks";
1026
+ const open = () => railMounted ? togglePanel("tasks") : toggleDrawer();
1027
+ const railRow = useRailRow(
1028
+ surface === "rail" ? { key: "tasks", label, badge: pendingCount > 0 ? pendingCount : void 0 } : null
1029
+ );
1030
+ if (compact) {
1031
+ return /* @__PURE__ */ jsxs(
1032
+ "button",
1033
+ {
1034
+ ...railRow,
1035
+ onClick: open,
1036
+ "aria-label": label,
1037
+ title: surface === "topbar" ? label : void 0,
1038
+ className: cn(
1039
+ "fz-tap relative flex shrink-0 items-center justify-center rounded-button p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-foreground",
1040
+ // Na trilha ele é uma linha (ocupa a coluna); na barra, um ícone
1041
+ // entre outros, e esticar tomaria a barra inteira.
1042
+ surface === "rail" && "w-full"
1043
+ ),
1044
+ children: [
1045
+ /* @__PURE__ */ jsx(CheckSquare, { className: "h-4 w-4" }),
1046
+ pendingCount > 0 && /* @__PURE__ */ jsx("span", { className: "absolute right-1 top-1 h-2 w-2 rounded-full bg-destructive" })
1047
+ ]
1048
+ }
1049
+ );
1050
+ }
1021
1051
  return /* @__PURE__ */ jsxs(
1022
- Button,
1052
+ "button",
1023
1053
  {
1024
- variant: "ghost",
1025
- size: "icon",
1026
- className: cn("relative text-sidebar-foreground/70 hover:bg-sidebar/30 hover:text-sidebar-foreground"),
1027
- onClick: () => railMounted ? togglePanel("tasks") : toggleDrawer(),
1028
- "aria-label": "Tasks",
1054
+ onClick: open,
1055
+ "aria-label": label,
1056
+ className: "fz-tap flex w-full items-center gap-2 rounded-button px-2.5 py-1.5 text-sm text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-foreground",
1029
1057
  children: [
1030
- /* @__PURE__ */ jsx(CheckSquare, { className: "h-5 w-5" }),
1058
+ /* @__PURE__ */ jsx(CheckSquare, { className: "h-4 w-4 shrink-0" }),
1059
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate text-left", children: label }),
1031
1060
  pendingCount > 0 && /* @__PURE__ */ jsx(
1032
1061
  "span",
1033
1062
  {
1034
1063
  className: cn(
1035
- "absolute -right-0.5 -top-0.5 flex items-center justify-center rounded-full bg-destructive text-destructive-foreground",
1036
- pendingCount > 9 ? "h-5 min-w-5 px-1 text-[10px]" : "h-4 w-4 text-[10px]"
1064
+ "flex shrink-0 items-center justify-center rounded-full bg-destructive text-[10px] text-destructive-foreground",
1065
+ pendingCount > 9 ? "h-5 min-w-5 px-1" : "h-4 w-4"
1037
1066
  ),
1038
1067
  children: pendingCount > 99 ? "99+" : pendingCount
1039
1068
  }
@@ -1180,9 +1209,11 @@ function createTasksPlugin(options) {
1180
1209
  routes: [],
1181
1210
  widgets: [
1182
1211
  {
1183
- id: "tasks-topbar-button",
1184
- zone: "shell.topbar.end",
1185
- component: TasksTopbarButton,
1212
+ // No pé da trilha, não no topo: tarefas são do workspace, não da
1213
+ // tela aberta — e no topo elas dividiam o canto com as ações da página.
1214
+ id: "tasks-launcher",
1215
+ zone: "shell.sidebar.footer",
1216
+ component: TasksLauncher,
1186
1217
  order: 10,
1187
1218
  props: {
1188
1219
  tasksConfig: config,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context.tsx","../src/data/mock.ts","../src/data/tables.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/registries.ts","../src/components/TasksGeneralSettings.tsx","../src/components/TasksFilterBar.tsx","../src/components/TaskQuickAdd.tsx","../src/components/TaskPriorityBadge.tsx","../src/components/TaskLabelBadge.tsx","../src/components/TaskCard.tsx","../src/components/TaskStatusGroup.tsx","../src/types.ts","../src/components/TaskDetail.tsx","../src/components/TasksPanel.tsx","../src/components/TasksDrawer.tsx","../src/components/TasksTopbarButton.tsx","../src/migrations/index.ts","../src/index.ts"],"names":["today","useTranslation","jsx","jsxs","useState","useCallback","ChevronDown","Calendar","React","useEffect"],"mappings":";;;;;;;;;;AAkBA,IAAM,GAAA,GAAM,oBAA0E,sBAAsB,CAAA;AAErG,IAAM,uBAAuB,GAAA,CAAI,eAAA;AACV,GAAA,CAAI;AACF,GAAA,CAAI;AAC7B,IAAM,gBAAgB,GAAA,CAAI,QAAA;;;ACjBjC,SAAS,GAAA,GAAc;AAAE,EAAA,OAAO,OAAO,UAAA,IAAa,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAE;AAC5E,SAAS,GAAA,GAAc;AAAE,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAE;AACzD,SAAS,KAAA,GAAgB;AAAE,EAAA,OAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAAE;AAExE,IAAM,WAAA,GAA2B;AAAA,EAC/B,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAI,EAAE;AAAA,EACnG,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAI,EAAE;AAAA,EAC3G,EAAE,EAAA,EAAI,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAI,EAAE;AAAA,EACzG,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAI;AAC7G,CAAA;AAEA,SAAS,aAAA,GAAwB;AAC/B,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,WAAA,EAAa,IAAA;AAAA,IACb,YAAA,EAAc,IAAA;AAAA,IACd,cAAA,EAAgB,IAAA;AAAA,IAChB,QAAA,EAAU,IAAA;AAAA,IACV,QAAQ,EAAC;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,aAAA,EAAe,IAAA;AAAA,IACf,WAAW,GAAA,EAAI;AAAA,IACf,WAAW,GAAA;AAAI,GACjB;AACA,EAAA,OAAO;AAAA,IACL,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,GAAA,IAAO,KAAA,EAAO,uBAAA,EAAyB,MAAA,EAAQ,MAAA,EAAiB,UAAU,MAAA,EAAiB,OAAA,EAAS,KAAA,EAAM,EAAG,UAAU,CAAA,EAAE;AAAA,IACxI,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,KAAI,EAAG,KAAA,EAAO,oBAAA,EAAsB,MAAA,EAAQ,QAAiB,QAAA,EAAU,QAAA,EAAmB,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,IACpI,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,KAAI,EAAG,KAAA,EAAO,uBAAA,EAAyB,MAAA,EAAQ,eAAwB,QAAA,EAAU,QAAA,EAAmB,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA,EAAE;AAAA,IAC9I,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,KAAI,EAAG,KAAA,EAAO,iBAAiB,MAAA,EAAQ,aAAA,EAAwB,UAAU,QAAA,EAAmB,OAAA,EAAS,OAAM,EAAG,QAAA,EAAU,GAAG,MAAA,EAAQ,CAAC,SAAS,CAAA,EAAE;AAAA,IAC9J,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,KAAI,EAAG,KAAA,EAAO,sBAAA,EAAwB,MAAA,EAAQ,QAAiB,QAAA,EAAU,KAAA,EAAgB,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAAE,GACrI;AACF;AAEA,SAAS,YAAA,CAAa,MAAY,KAAA,EAA2B;AAC3D,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,OAAO,KAAA;AAAA,EAC9C;AACA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,KAAA,CAAM,QAAQ,CAAA;AACnF,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,IAAA,CAAK,QAAQ,GAAG,OAAO,KAAA;AAAA,EAClD;AACA,EAAA,IAAI,MAAM,YAAA,IAAgB,IAAA,CAAK,YAAA,KAAiB,KAAA,CAAM,cAAc,OAAO,KAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,IAAI,MAAM,QAAA,KAAa,IAAA,IAAQ,IAAA,CAAK,QAAA,KAAa,MAAM,OAAO,KAAA;AAC9D,IAAA,IAAI,MAAM,QAAA,KAAa,IAAA,IAAQ,KAAK,QAAA,KAAa,KAAA,CAAM,UAAU,OAAO,KAAA;AAAA,EAC1E;AACA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AACnC,IAAA,IAAI,CAAC,KAAK,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,CAAC,GAAG,OAAO,KAAA;AAAA,EACpD;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,OAAA,EAAS;AACjC,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,KAAA,EAAM,EAAG,OAAO,KAAA;AAAA,EACtC;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,uBAAA,GAA6C;AAC3D,EAAA,IAAI,QAAQ,aAAA,EAAc;AAC1B,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,WAAW,CAAA;AAE9B,EAAA,OAAO;AAAA,IACL,MAAM,SAAS,KAAA,EAAO;AACpB,MAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,YAAA,CAAa,GAAG,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAAA,IAC3F,CAAA;AAAA,IAEA,MAAM,YAAY,EAAA,EAAI;AACpB,MAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAAA,IAC3C,CAAA;AAAA,IAEA,MAAM,YAAY,QAAA,EAAU;AAC1B,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAA,KAAa,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAAA,IAC5F,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAwB;AACvC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,MAAY,KAAA,CAAM,MAAA,IAAU,MAAA,CAAA,IAAW,CAAA,CAAE,QAAA,MAAc,KAAA,CAAM,YAAY,IAAA,CAAK,CAAA;AACxH,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,EAAG,EAAE,CAAA;AAC3E,MAAA,MAAM,IAAA,GAAa;AAAA,QACjB,IAAI,GAAA,EAAI;AAAA,QACR,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,MAAA,EAAQ,MAAM,MAAA,IAAU,MAAA;AAAA,QACxB,QAAA,EAAU,MAAM,QAAA,IAAY,QAAA;AAAA,QAC5B,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,QAC1B,YAAA,EAAc,MAAM,YAAA,IAAgB,IAAA;AAAA,QACpC,cAAA,EAAgB,IAAA;AAAA,QAChB,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,QAC5B,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,QACzB,UAAU,MAAA,GAAS,CAAA;AAAA,QACnB,WAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAe,IAAA;AAAA,QACf,QAAA,EAAU,MAAA;AAAA,QACV,WAAW,GAAA,EAAI;AAAA,QACf,WAAW,GAAA;AAAI,OACjB;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,EAAA,EAAI,KAAA,EAAwB;AAC3C,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,GAAA,KAAQ,EAAA,EAAI,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAChD,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,EAAE,GAAG,KAAA,CAAM,GAAG,CAAA,EAAG,GAAG,KAAA,EAAO,SAAA,EAAW,GAAA,EAAI,EAAE;AACzD,MAAA,OAAO,MAAM,GAAG,CAAA;AAAA,IAClB,CAAA;AAAA,IAEA,MAAM,WAAW,EAAA,EAAI;AACnB,MAAA,KAAA,GAAQ,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,EAAA,IAAM,CAAA,CAAE,QAAA,KAAa,EAAE,CAAA;AAAA,IAC9D,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,EAAA,EAAI,WAAA,EAAa,MAAA,EAAQ;AACzC,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,QAAA,GAAW,WAAA;AAChB,MAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,SAAA,GAAY;AAChB,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAAA,IACxC,CAAA;AAAA,IAEA,MAAM,UAAA,GAAa;AACjB,MAAA,MAAM,WAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,IAAI,CAAA;AACxD,MAAA,MAAM,IAAI,KAAA,EAAM;AAChB,MAAA,OAAO;AAAA,QACL,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB,IAAA,EAAM,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAAA,QAClD,UAAA,EAAY,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,QAC/D,IAAA,EAAM,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAAA,QAClD,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAA,IAAW,IAAA,IAAQ,CAAA,CAAE,OAAA,GAAU,KAAK,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QACvH,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QACrG,cAAc,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAA,CAAO,EAAE,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,QAAA,KAAa,aAAa,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE;AAAA,OAC9I;AAAA,IACF;AAAA,GACF;AACF;;;AC5IO,IAAM,CAAA,GAAI;AAAA,EACf,KAAA,EAAO,iBAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;;;ACCA,SAAS,WAAA,GAAkC;AAEzC,EAAA,OAA6B,iBAAA,EAAkB;AACjD;AAEA,SAAS,SAAA,GAAY;AACnB,EAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,0BAA0B,CAAA;AACzD,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAAuD;AAC3E,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,GAAI,KAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,OAAO,GAAA,EAAoC;AAClD,EAAA,MAAM,CAAA,GAAI,aAAa,GAAG,CAAA;AAE1B,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,SAAS,EAAC;AAC1C,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,2BAAA,GAAiD;AAC/D,EAAA,OAAO;AAAA,IACL,MAAM,SAAS,KAAA,EAAO;AACpB,MAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,MAAA,IAAI,CAAA,GAAI,SAAA,EAAU,CACf,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CACZ,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA;AAE3B,MAAA,IAAI,KAAA,CAAM,aAAa,IAAA,EAAM;AAC3B,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,WAAA,EAAa,IAAI,CAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,MAAM,QAAA,EAAU;AACzB,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,WAAA,EAAa,KAAA,CAAM,QAAQ,CAAA;AAAA,MACtC;AAEA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,IAAI,KAAA,CAAM,MAAA,GAAS,CAAC,KAAA,CAAM,MAAM,CAAA;AAC3E,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,IAAI,KAAA,CAAM,QAAA,GAAW,CAAC,KAAA,CAAM,QAAQ,CAAA;AACnF,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,UAAA,EAAY,UAAU,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,MAAM,YAAA,EAAc;AACtB,QAAA,CAAA,GAAI,CAAA,CAAE,EAAA,CAAG,gBAAA,EAAkB,KAAA,CAAM,YAAY,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,CAAA,GAAI,EAAE,KAAA,CAAM,OAAA,EAAS,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MAC1C;AACA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,CAAA,GAAI,EAAE,EAAA,CAAG,UAAA,EAAA,iBAAY,IAAI,IAAA,IAAO,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CACvD,GAAA,CAAI,QAAA,EAAU,MAAM,sBAAsB,CAAA;AAAA,MAC/C;AAEA,MAAA,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,OAAO,CAAA;AAErF,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,CAAA;AACvB,MAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,MAAM,YAAY,EAAA,EAAI;AACpB,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,SAAA,GACpB,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CACZ,OAAO,GAAG,CAAA,CACV,GAAG,IAAA,EAAM,EAAE,EACX,WAAA,EAAY;AACf,MAAA,OAAO,IAAA,GAAO,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAM,YAAY,QAAA,EAAU;AAC1B,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,WAAU,CAC9B,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CACZ,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,aAAa,QAAQ,CAAA,CACxB,MAAM,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxC,MAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAO;AACtB,MAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAGjD,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,WAAU,CACvC,IAAA,CAAK,CAAA,CAAE,KAAK,EACZ,MAAA,CAAO,UAAU,EACjB,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,QAAA,EAAU,KAAA,CAAM,UAAU,MAAM,CAAA,CACnC,EAAA,CAAG,WAAA,EAAa,MAAM,QAAA,IAAY,IAAI,CAAA,CACtC,KAAA,CAAM,YAAY,EAAE,SAAA,EAAW,OAAO,CAAA,CACtC,MAAM,CAAC,CAAA;AACV,MAAA,MAAM,MAAA,GAAS,OAAA,GAAU,CAAC,CAAA,EAAG,QAAA,IAAY,EAAA;AAEzC,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,SAAA,EAAU,CACrC,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CACZ,MAAA,CAAO;AAAA,QACN,SAAA,EAAW,QAAA;AAAA,QACX,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,WAAA,EAAa,MAAM,WAAA,IAAe,IAAA;AAAA,QAClC,MAAA,EAAQ,MAAM,MAAA,IAAU,MAAA;AAAA,QACxB,QAAA,EAAU,MAAM,QAAA,IAAY,QAAA;AAAA,QAC5B,QAAA,EAAU,MAAM,OAAA,IAAW,IAAA;AAAA,QAC3B,cAAA,EAAgB,MAAM,YAAA,IAAgB,IAAA;AAAA,QACtC,SAAA,EAAW,MAAM,QAAA,IAAY,IAAA;AAAA,QAC7B,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,QACzB,UAAU,MAAA,GAAS;AAAA,OACpB,CAAA,CACA,MAAA,CAAO,GAAG,EACV,MAAA,EAAO;AACV,MAAA,IAAI,OAAO,MAAM,KAAA;AACjB,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,EAAA,EAAI,KAAA,EAAO;AAC1B,MAAA,MAAM,UAAmC,EAAE,UAAA,EAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,EAAE;AAChF,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,KAAA,CAAM,KAAA;AACrD,MAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,OAAA,CAAQ,cAAc,KAAA,CAAM,WAAA;AACjE,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,MAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,OAAA;AAC1D,MAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAW,OAAA,CAAQ,iBAAiB,KAAA,CAAM,YAAA;AACrE,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAE3D,MAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,SAAA,EAAU,CACrC,KAAK,CAAA,CAAE,KAAK,EACZ,MAAA,CAAO,OAAO,EACd,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA,CACX,MAAA,CAAO,GAAG,CAAA,CACV,MAAA,EAAO;AACV,MAAA,IAAI,OAAO,MAAM,KAAA;AACjB,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,MAAM,WAAW,EAAA,EAAI;AACnB,MAAA,MAAM,SAAA,EAAU,CAAE,IAAA,CAAK,CAAA,CAAE,KAAK,EAAE,MAAA,EAAO,CAAE,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA;AAAA,IACtD,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,EAAA,EAAI,WAAA,EAAa,MAAA,EAAQ;AACzC,MAAA,MAAM,SAAA,GACH,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CACZ,MAAA,CAAO,EAAE,QAAA,EAAU,WAAA,EAAa,QAAQ,UAAA,EAAA,iBAAY,IAAI,MAAK,EAAE,WAAA,IAAe,CAAA,CAC9E,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA;AAAA,IAChB,CAAA;AAAA,IAEA,MAAM,SAAA,GAAY;AAChB,MAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,WAAU,CAC9B,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,CACb,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,aAAa,QAAQ,CAAA,CACxB,GAAG,WAAA,EAAa,IAAI,CAAA,CACpB,KAAA,CAAM,MAAM,CAAA;AACf,MAAA,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,YAAA,CAAa,CAAC,CAAyB,CAAA;AAAA,IAC7E,CAAA;AAAA,IAEA,MAAM,UAAA,GAAa;AACjB,MAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,KAAA,EAAO,GAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,MAAM,CAAA,EAAG,OAAA,EAAS,GAAG,QAAA,EAAU,CAAA,EAAG,cAAc,CAAA,EAAE;AAE5G,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,SAAA,EAAU,CAC9B,KAAK,CAAA,CAAE,KAAK,EACZ,MAAA,CAAO,4BAA4B,EACnC,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA,CACxB,EAAA,CAAG,aAAa,IAAI,CAAA;AAEvB,MAAA,MAAM,KAAA,GAAQ,QAAQ,EAAC;AACvB,MAAA,MAAMA,MAAAA,GAAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAClD,MAAA,OAAO;AAAA,QACL,OAAO,KAAA,CAAM,MAAA;AAAA,QACb,IAAA,EAAM,MAAM,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAAA,QACpD,UAAA,EAAY,MAAM,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAAA,QACjE,IAAA,EAAM,MAAM,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA,CAAE,MAAA;AAAA,QACpD,SAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAW,EAAE,QAAA,IAAY,CAAA,CAAE,QAAA,GAAWA,MAAAA,IAAS,EAAE,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QACvH,QAAA,EAAU,KAAA,CAAM,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,QAAA,KAAaA,MAAAA,IAAS,CAAA,CAAE,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAAA,QAC5G,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAA,CAAY,EAAE,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,QAAA,KAAa,aAAa,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE;AAAA,OAChJ;AAAA,IACF;AAAA,GACF;AACF;AC3JO,SAAS,iBAAiB,QAAA,EAAqD;AACpF,EAAA,OAAO,WAAA,CAA0B,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,IAC9C,OAAO,EAAC;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,cAAA,EAAgB,KAAA;AAAA,IAEhB,UAAA,EAAY,KAAA;AAAA,IACZ,cAAA,EAAgB,IAAA;AAAA,IAChB,YAAA,EAAc,KAAA;AAAA;AAAA,IAId,MAAM,WAAW,KAAA,EAAmB;AAClC,MAAA,OAAO,KAAA,CAAM,cAAc,YAAY;AACrC,QAAA,GAAA,CAAI,EAAE,YAAA,EAAc,IAAA,EAAM,CAAA;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,KAAI,CAAE,YAAA;AACrB,UAAA,MAAM,CAAA,GAAe;AAAA,YACnB,QAAA,EAAU,IAAA;AAAA,YACV,GAAG,KAAA;AAAA,YACH,GAAI,MAAA,KAAW,KAAA,GAAQ,EAAE,MAAA,EAAQ,MAAA,KAAW;AAAC,WAC/C;AACA,UAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA;AACvC,UAAA,GAAA,CAAI,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,QACpC,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,CAAI,EAAE,YAAA,EAAc,KAAA,EAAO,CAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,WAAA,GAAc;AAClB,MAAA,OAAO,KAAA,CAAM,gBAAgB,YAAY;AACvC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,SAAA,EAAU;AACxC,UAAA,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,QAChB,CAAA,CAAA,MAAQ;AAAA,QAAe;AAAA,MACzB,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,YAAA,GAAe;AACnB,MAAA,OAAO,KAAA,CAAM,iBAAiB,YAAY;AACxC,QAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAW;AAC1C,UAAA,GAAA,CAAI,EAAE,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAO,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AACN,UAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,KAAA,EAAO,CAAA;AAAA,QAC/B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAO;AACtB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAE5C,MAAA,MAAM,GAAA,GAAM,UAAA,EAAW;AACvB,MAAA,MAAM,GAAA,GAAM,YAAA,EAAa;AACzB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,EAAA,EAAI,KAAA,EAAO;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,KAAK,CAAA;AAEhD,MAAA,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,EAAA,GAAK,IAAA,GAAO,CAAE,GAAE,CAAE,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,YAAA,EAAa;AACzB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,WAAW,EAAA,EAAI;AACnB,MAAA,MAAM,QAAA,CAAS,WAAW,EAAE,CAAA;AAC5B,MAAA,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,EAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,EAAE,CAAA,EAAG,cAAA,EAAgB,MAAK,CAAE,CAAA;AAChF,MAAA,MAAM,GAAA,GAAM,YAAA,EAAa;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,EAAA,EAAI,WAAA,EAAa,MAAA,EAAQ;AACzC,MAAA,MAAM,QAAA,CAAS,WAAA,CAAY,EAAA,EAAI,WAAA,EAAa,MAAM,CAAA;AAClD,MAAA,MAAM,GAAA,GAAM,UAAA,EAAW;AAAA,IACzB,CAAA;AAAA;AAAA,IAIA,UAAA,GAAa;AACX,MAAA,GAAA,CAAI,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAExB,MAAA,GAAA,GAAM,UAAA,EAAW;AACjB,MAAA,GAAA,GAAM,WAAA,EAAY;AAClB,MAAA,GAAA,GAAM,YAAA,EAAa;AAAA,IACrB,CAAA;AAAA,IAEA,WAAA,GAAc;AACZ,MAAA,GAAA,CAAI,EAAE,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,MAAM,CAAA;AAAA,IACjD,CAAA;AAAA,IAEA,YAAA,GAAe;AACb,MAAA,MAAM,EAAE,UAAA,EAAW,GAAI,GAAA,EAAI;AAC3B,MAAA,IAAI,UAAA,EAAY,GAAA,EAAI,CAAE,WAAA,EAAY;AAAA,WAC7B,GAAA,GAAM,UAAA,EAAW;AAAA,IACxB,CAAA;AAAA,IAEA,WAAW,EAAA,EAAI;AACb,MAAA,GAAA,CAAI,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IAEA,UAAU,MAAA,EAAQ;AAChB,MAAA,GAAA,CAAI,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAA;AAC5B,MAAA,GAAA,GAAM,UAAA,EAAW;AAAA,IACnB;AAAA,GACF,CAAE,CAAA;AACJ;;;ACnJO,IAAM,EAAA,GAA6B;AAAA,EACxC,aAAA,EAAe,OAAA;AAAA,EACf,oBAAA,EAAsB,OAAA;AAAA,EACtB,uBAAA,EAAyB,wBAAA;AAAA,EACzB,4BAAA,EAA8B,eAAA;AAAA,EAC9B,kBAAA,EAAoB,KAAA;AAAA,EACpB,mBAAA,EAAqB,OAAA;AAAA,EACrB,yBAAA,EAA2B,aAAA;AAAA,EAC3B,mBAAA,EAAqB,MAAA;AAAA,EACrB,mBAAA,EAAqB,OAAA;AAAA,EACrB,0BAAA,EAA4B,aAAA;AAAA,EAC5B,mBAAA,EAAqB,MAAA;AAAA,EACrB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,oBAAA,EAAsB,KAAA;AAAA,EACtB,uBAAA,EAAyB,QAAA;AAAA,EACzB,qBAAA,EAAuB,MAAA;AAAA,EACvB,uBAAA,EAAyB,QAAA;AAAA,EACzB,0BAAA,EAA4B,aAAA;AAAA,EAC5B,qCAAA,EAAuC,sBAAA;AAAA,EACvC,qBAAA,EAAuB,QAAA;AAAA,EACvB,uBAAA,EAAyB,UAAA;AAAA,EACzB,sBAAA,EAAwB,UAAA;AAAA,EACxB,uBAAA,EAAyB,aAAA;AAAA,EACzB,qBAAA,EAAuB,QAAA;AAAA,EACvB,uBAAA,EAAyB,UAAA;AAAA,EACzB,qBAAA,EAAuB,aAAA;AAAA,EACvB,4BAAA,EAA8B,4CAAA;AAAA,EAC9B,sBAAA,EAAwB,SAAA;AAAA,EACxB,yBAAA,EAA2B,cAAA;AAAA,EAC3B,gCAAA,EAAkC,+EAAA;AAAA,EAClC,sBAAA,EAAwB,SAAA;AAAA,EACxB,yBAAA,EAA2B,gBAAA;AAAA,EAC3B,mBAAA,EAAqB,cAAA;AAAA,EACrB,uBAAA,EAAyB,SAAA;AAAA,EACzB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,aAAA,EAAe,cAAA;AAAA,EACf,yBAAA,EAA2B,2CAAA;AAAA,EAC3B,sBAAA,EAAwB,OAAA;AAAA,EACxB,wBAAA,EAA0B,SAAA;AAAA,EAC1B,gCAAA,EAAkC,kBAAA;AAAA,EAClC,2BAAA,EAA6B;AAC/B,CAAA;;;ACzCO,IAAM,IAAA,GAA+B;AAAA,EAC1C,aAAA,EAAe,SAAA;AAAA,EACf,oBAAA,EAAsB,SAAA;AAAA,EACtB,uBAAA,EAAyB,+BAAA;AAAA,EACzB,4BAAA,EAA8B,qBAAA;AAAA,EAC9B,kBAAA,EAAoB,OAAA;AAAA,EACpB,mBAAA,EAAqB,SAAA;AAAA,EACrB,yBAAA,EAA2B,cAAA;AAAA,EAC3B,mBAAA,EAAqB,eAAA;AAAA,EACrB,mBAAA,EAAqB,SAAA;AAAA,EACrB,0BAAA,EAA4B,cAAA;AAAA,EAC5B,mBAAA,EAAqB,cAAA;AAAA,EACrB,wBAAA,EAA0B,WAAA;AAAA,EAC1B,oBAAA,EAAsB,OAAA;AAAA,EACtB,uBAAA,EAAyB,UAAA;AAAA,EACzB,qBAAA,EAAuB,MAAA;AAAA,EACvB,uBAAA,EAAyB,SAAA;AAAA,EACzB,0BAAA,EAA4B,iBAAA;AAAA,EAC5B,qCAAA,EAAuC,8BAAA;AAAA,EACvC,qBAAA,EAAuB,QAAA;AAAA,EACvB,uBAAA,EAAyB,YAAA;AAAA,EACzB,sBAAA,EAAwB,oBAAA;AAAA,EACxB,uBAAA,EAAyB,gBAAA;AAAA,EACzB,qBAAA,EAAuB,WAAA;AAAA,EACvB,uBAAA,EAAyB,YAAA;AAAA,EACzB,qBAAA,EAAuB,gBAAA;AAAA,EACvB,4BAAA,EAA8B,6CAAA;AAAA,EAC9B,sBAAA,EAAwB,WAAA;AAAA,EACxB,yBAAA,EAA2B,kBAAA;AAAA,EAC3B,gCAAA,EAAkC,0FAAA;AAAA,EAClC,sBAAA,EAAwB,eAAA;AAAA,EACxB,yBAAA,EAA2B,wBAAA;AAAA,EAC3B,mBAAA,EAAqB,mBAAA;AAAA,EACrB,uBAAA,EAAyB,WAAA;AAAA,EACzB,wBAAA,EAA0B,aAAA;AAAA,EAC1B,aAAA,EAAe,sBAAA;AAAA,EACf,yBAAA,EAA2B,mDAAA;AAAA,EAC3B,sBAAA,EAAwB,SAAA;AAAA,EACxB,wBAAA,EAA0B,OAAA;AAAA,EAC1B,gCAAA,EAAkC,sBAAA;AAAA,EAClC,2BAAA,EAA6B;AAC/B,CAAA;;;ACtCO,IAAM,YAAA,GAAuD;AAAA,EAClE,EAAA;AAAA,EACA,OAAA,EAAS;AACX,CAAA;;;ACFA,IAAM,eAAA,GAA6B;AAAA,EACjC,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY,aAAA;AAAA,EACZ,IAAA,EAAM,KAAA;AAAA,EACN,YAAA,EAAc,MAAA;AAAA,EACd,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC9E,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,SAAA,EAAU;AAAA,IACzF,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA;AAAK,GAC7F;AAAA,EACA,MAAM,EAAE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,cAAc,IAAA;AACzC,CAAA;AAEO,IAAM,eAAA,GAAuC;AAAA,EAClD;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,+BAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU;AAAA,MACR,EAAE,IAAI,SAAA,EAAW,IAAA,EAAM,OAAO,KAAA,EAAO,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,MAC/D,EAAE,IAAI,aAAA,EAAe,IAAA,EAAM,WAAW,KAAA,EAAO,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,MACvE,EAAE,IAAI,YAAA,EAAc,IAAA,EAAM,UAAU,KAAA,EAAO,SAAA,EAAW,UAAU,IAAA,EAAK;AAAA,MACrE,EAAE,IAAI,cAAA,EAAgB,IAAA,EAAM,YAAY,KAAA,EAAO,SAAA,EAAW,UAAU,IAAA;AAAK;AAC3E;AAEJ,CAAA;AC1BA,IAAM,cAAA,GAAiB;AAAA,EACrB,eAAA,EAAiB;AACnB,CAAA;AAEO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,IAAI,cAAA,EAAe;AACzB,EAAA,MAAM,CAAA,GAAI,uBAAA,CAAwB,OAAA,EAAS,cAAc,CAAA;AAEzD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAAE,CAAA;AAAA,0BACvE,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAC5B;AAAA,KAAA,EACF,CAAA;AAAA,wBAEC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE,CAAA;AAAA,sBAC5E,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sHAAA;AAAA,UACV,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,iBAAiB,CAAA;AAAA,UAC9B,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,iBAAA,EAAmB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAExD,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,KAAA,EAAO,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,gCAC5C,QAAA,EAAA,EAAO,KAAA,EAAM,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE,CAAA;AAAA,gCAClD,QAAA,EAAA,EAAO,KAAA,EAAM,MAAA,EAAQ,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,gCAC9C,QAAA,EAAA,EAAO,KAAA,EAAM,QAAA,EAAU,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAAA,EAAE;AAAA;AAAA;AAAA;AACrD,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACnCA,IAAM,OAAA,GAAgE;AAAA,EACpE,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,kBAAA,EAAmB;AAAA,EAC3C,EAAE,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,mBAAA,EAAoB;AAAA,EAC7C,EAAE,GAAA,EAAK,aAAA,EAAe,QAAA,EAAU,yBAAA,EAA0B;AAAA,EAC1D,EAAE,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAU,mBAAA;AAC3B,CAAA;AAEO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,IAAIC,cAAAA,EAAe;AACzB,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAgD;AAChE,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,KAAA;AAAO,QAAA,OAAO,OAAA,CAAQ,KAAA;AAAA,MAC3B,KAAK,MAAA;AAAQ,QAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MAC5B,KAAK,aAAA;AAAe,QAAA,OAAO,OAAA,CAAQ,UAAA;AAAA,MACnC,KAAK,MAAA;AAAQ,QAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MAC5B;AAAS,QAAA,OAAO,MAAA;AAAA;AAClB,EACF,CAAA;AAEA,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,QAAA,EAAS,KAAM;AAClC,IAAA,MAAM,SAAS,YAAA,KAAiB,GAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,IAAA,uBACEC,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,SAAA,CAAU,GAAG,CAAA;AAAA,QAC5B,SAAA,EAAW,CAAA,gHAAA,EACT,MAAA,GACI,oCAAA,GACA,4DACN,CAAA,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,UACV,KAAA,IAAS,IAAA,oBACRD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,YAAA,EAAe,MAAA,GAAS,4BAAA,GAA+B,uBAAuB,CAAA,CAAA,EAC5F,QAAA,EAAA,KAAA,EACH;AAAA;AAAA,OAAA;AAAA,MAbG;AAAA,KAeP;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AClDO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAiC;AACvE,EAAA,MAAM,IAAID,cAAAA,EAAe;AACzB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAO,CAAA,KAAuB;AAC7D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACzB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,CAAW;AAAA,QACf,KAAA,EAAO,OAAA;AAAA,QACP,UAAU,QAAA,IAAY;AAAA,OACvB,CAAA;AACD,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzC,EAAA,uBACEE,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,4CAAA,EACtC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,oBACzDA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,aAAa,QAAA,GAAW,CAAA,CAAE,yBAAyB,CAAA,GAAI,EAAE,4BAA4B,CAAA;AAAA,QACrF,SAAA,EAAU,iFAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA;AAEJ;ACrCA,IAAM,eAAA,GAA0H;AAAA,EAC9H,KAAK,EAAE,KAAA,EAAO,yBAAyB,EAAA,EAAI,UAAA,EAAY,MAAM,SAAA,EAAU;AAAA,EACvE,QAAQ,EAAE,KAAA,EAAO,6BAA6B,EAAA,EAAI,cAAA,EAAgB,MAAM,KAAA,EAAM;AAAA,EAC9E,MAAM,EAAE,KAAA,EAAO,gCAAgC,EAAA,EAAI,iBAAA,EAAmB,MAAM,OAAA,EAAQ;AAAA,EACpF,QAAQ,EAAE,KAAA,EAAO,oCAAoC,EAAA,EAAI,qBAAA,EAAuB,MAAM,aAAA;AACxF,CAAA;AAEO,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAU,SAAA,EAAU,EAAoD;AAC1G,EAAA,MAAM,GAAA,GAAM,gBAAgB,QAAQ,CAAA;AACpC,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,yEAAA,EAA4E,IAAI,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,EAAE,CAAA,CAAA,EAC9G,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,IACzB,6BAAaA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAc,QAAA,EAAA,QAAA,EAAS;AAAA,GAAA,EACvD,CAAA;AAEJ;ACjBO,SAAS,cAAA,CAAe,EAAE,OAAA,EAAQ,EAAwB;AAC/D,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC5C,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,wFAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,eAAA,EAAiB,MAAM,KAAA,GAAQ,IAAA;AAAA,QAC/B,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,GACT;AAEJ;AAEO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,GAAA,GAAM,GAAE,EAAyC;AAC3F,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,GAAA;AAEnC,EAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAA,qBACZD,IAAC,cAAA,EAAA,EAAwB,OAAA,EAAS,EAAA,EAAA,EAAb,EAAiB,CACvC,CAAA;AAAA,IACA,WAAW,CAAA,oBACVC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAS;AAAA,GAAA,EAEnE,CAAA;AAEJ;AC5BA,SAAS,UAAU,OAAA,EAAiC;AAClD,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,OAAO,OAAA,GAAA,qBAAc,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACvD;AAEA,SAAS,QAAQ,OAAA,EAAiC;AAChD,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,OAAO,OAAA,KAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACzD;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,CAAA,mBAAI,IAAI,IAAA,CAAK,OAAA,GAAU,WAAW,CAAA;AACxC,EAAA,OAAO,CAAA,CAAE,mBAAmB,MAAA,EAAW,EAAE,OAAO,OAAA,EAAS,GAAA,EAAK,WAAW,CAAA;AAC3E;AAEO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,YAAA,EAAa,EAAmE;AAC/G,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,IAAU,SAAA,CAAU,KAAK,OAAO,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,IAAU,OAAA,CAAQ,KAAK,OAAO,CAAA;AAEhD,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,UAAA,CAAW,KAAK,EAAA,EAAI,EAAE,QAAQ,MAAA,GAAS,MAAA,GAAS,QAAQ,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,uBACEA,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,MACjC,SAAA,EAAU,sMAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,OAAA,EAAS,WAAA,EAC/B,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,MAAM;AAAA,QAAC,GAAG,CAAA,EACjD,CAAA;AAAA,wBAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA,CAAC,OAAE,SAAA,EAAW,CAAA,qBAAA,EAAwB,SAAS,oCAAA,GAAuC,EAAE,CAAA,CAAA,EACrF,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA;AAAA,0BAEAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,YAE3C,IAAA,CAAK,OAAA,oBACJC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,2CAAA,EACf,OAAA,GAAU,8BAAA,GAAiC,QAAA,GAAW,0BAAA,GAA6B,uBACrF,CAAA,CAAA,EACE,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC7B,aAAA,CAAc,KAAK,OAAO;AAAA,aAAA,EAC7B,CAAA;AAAA,YAGD,YAAA,IAAgB,aAAa,KAAA,GAAQ,CAAA,oBACpCC,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kEAAA,EACd,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cAC/B,YAAA,CAAa,IAAA;AAAA,cAAK,GAAA;AAAA,cAAE,YAAA,CAAa;AAAA,aAAA,EACpC,CAAA;AAAA,4BAGFA,GAAAA,CAAC,eAAA,EAAA,EAAgB,UAAU,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG;AAAA,WAAA,EAClD;AAAA,SAAA,EACF,CAAA;AAAA,QAEC,IAAA,CAAK,cAAA,oBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mHAAA,EAAoH,KAAA,EAAO,IAAA,CAAK,cAAA,EAC5I,QAAA,EAAA,IAAA,CAAK,cAAA,CAAe,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,aAAY,EACpF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AC1EA,IAAM,aAAA,GAA4C;AAAA,EAChD,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EAAa,SAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,SAAA,EAAW;AACb,CAAA;AAEO,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,KAAA,EAAM,EAA0C;AACxF,EAAA,MAAM,IAAID,cAAAA,EAAe;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,QAAAA,CAAS,WAAW,WAAW,CAAA;AAEjE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,YAAY,YAAA,GAAe,WAAA;AAE3C,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,QACtC,SAAA,EAAU,yJAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,wBAAwB,aAAA,CAAc,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,0BAClEA,GAAAA,CAAC,MAAA,EAAA,EAAM,YAAE,CAAA,aAAA,EAAgB,MAAM,EAAE,CAAA,EAAE,CAAA;AAAA,0BACnCC,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,KAAA,CAAM,MAAA;AAAA,YAAO;AAAA,WAAA,EAAC,CAAA;AAAA,0BAC1DD,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB;AAAA;AAAA;AAAA,KAC3C;AAAA,IAEC,CAAC,SAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EACE,gBAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,IAAC,QAAA,EAAA,EAAuB,IAAA,EAAA,EAAT,IAAA,CAAK,EAAgB,CACrC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;ACpCO,IAAM,aAAA,GAA8B,CAAC,MAAA,EAAQ,aAAA,EAAe,QAAQ,WAAW,CAAA;AAC/E,IAAM,eAAA,GAAkC,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,QAAQ,CAAA;ACIjF,IAAM,UAAA,GAAyC;AAAA,EAC7C,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EAAa,SAAA;AAAA,EACb,IAAA,EAAM,YAAA;AAAA,EACN,SAAA,EAAW;AACb,CAAA;AAGA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,EAAA,MAAM,UAAU,CAAA,CAAE,YAAA,wBAAmB,IAAI,IAAA,IAAO,YAAA,EAAa;AAC7D,EAAA,OAAO,OAAA,GACH,EAAE,kBAAA,CAAmB,MAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,IACtE,CAAA,CAAE,kBAAA,CAAmB,QAAW,EAAE,GAAA,EAAK,WAAW,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA;AAC3F;AAEO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAuB;AACzD,EAAA,MAAM,IAAID,cAAAA,EAAe;AACzB,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAEpD,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,MAAM,CAAA;AAChD,EAAA,MAAM,WAAW,sBAAA,EAAuB;AAExC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIG,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAiB,EAAE,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AACnB,MAAA,cAAA,CAAe,IAAA,CAAK,eAAe,EAAE,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,SAAA,CAAU,MAAM;AAAE,IAAA,WAAA,CAAY,EAAE,CAAA;AAAA,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE7C,EAAA,MAAM,eAAA,GAAkBC,YAAY,MAAM;AACxC,IAAA,IAAI,QAAQ,KAAA,CAAM,IAAA,EAAK,IAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AAChD,MAAA,UAAA,CAAW,KAAK,EAAA,EAAI,EAAE,OAAO,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,UAAU,CAAC,CAAA;AAE5B,EAAA,MAAM,qBAAA,GAAwBA,YAAY,MAAM;AAC9C,IAAA,IAAI,IAAA,IAAQ,WAAA,MAAiB,IAAA,CAAK,WAAA,IAAe,EAAA,CAAA,EAAK;AACpD,MAAA,UAAA,CAAW,KAAK,EAAA,EAAI,EAAE,WAAA,EAAa,WAAA,IAAe,MAAM,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,UAAU,CAAC,CAAA;AAElC,EAAA,MAAM,YAAA,GAAeA,YAAY,MAAM;AACrC,IAAA,IAAI,IAAA,IAAQ,OAAA,CAAQ,CAAA,CAAE,4BAA4B,CAAC,CAAA,EAAG;AACpD,MAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,UAAA,EAAY,CAAC,CAAC,CAAA;AAExB,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,sBACrCA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,SAAA,EAAU,2CAAA,EAC9D,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EACxB;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA;AAAA;AAAA;AAAA,oBAGEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,YAC9B,SAAA,EAAU,kJAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,cAClC,EAAE,oBAAoB;AAAA;AAAA;AAAA,SACzB;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACzBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,YAAA;AAAA,YACT,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,YACnC,KAAA,EAAO,EAAE,qBAAqB,CAAA;AAAA,YAC9B,SAAA,EAAU,0IAAA;AAAA,YAEV,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AAClC,OAAA,EACF,CAAA;AAAA,sBAEAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,MAAA,EAAQ,eAAA;AAAA,UACR,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,YAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,CAAA,CAAE,cAAc,IAAA,EAAK;AAAA,UAAE,CAAA;AAAA,UAClE,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAEb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAO,IAAA,CAAK,MAAA;AAAA,cACZ,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,EAAqB,CAAA;AAAA,cAC7E,SAAA,EAAU,+IAAA;AAAA,cAET,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,qBAClBA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAI,YAAE,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE,CAAA,EAAA,EAAnC,CAAqC,CACnD;AAAA;AAAA,WACH;AAAA,0BACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,iEAAiE,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,0BAC7GA,GAAAA,CAACI,WAAAA,EAAA,EAAY,WAAU,+FAAA,EAAgG;AAAA,SAAA,EACzH,CAAA;AAAA,wBAGAH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAO,IAAA,CAAK,QAAA;AAAA,cACZ,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,KAAA,EAAuB,CAAA;AAAA,cACjF,SAAA,EAAU,+IAAA;AAAA,cAET,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,qBACpBA,GAAAA,CAAC,QAAA,EAAA,EAAe,KAAA,EAAO,CAAA,EAAI,YAAE,CAAA,eAAA,EAAkB,CAAC,CAAA,CAAE,CAAA,EAAA,EAArC,CAAuC,CACrD;AAAA;AAAA,WACH;AAAA,0BACAA,GAAAA,CAACI,WAAAA,EAAA,EAAY,WAAU,+FAAA,EAAgG;AAAA,SAAA,EACzH,CAAA;AAAA,wBAGAH,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,KAAK,OAAA,IAAW,EAAA;AAAA,cACvB,QAAA,EAAU,CAAC,CAAA,KAAM,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,KAAA,IAAS,IAAA,EAAM,CAAA;AAAA,cACxE,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,GAAAA,CAACK,QAAAA,EAAA,EAAS,WAAU,4FAAA,EAA6F;AAAA,SAAA,EACnH,CAAA;AAAA,QAGC,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,oBAAKL,GAAAA,CAAC,eAAA,EAAA,EAAgB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG;AAAA,OAAA,EAC7E,CAAA;AAAA,sBAGAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,WAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC9C,MAAA,EAAQ,qBAAA;AAAA,UACR,WAAA,EAAa,EAAE,qCAAqC,CAAA;AAAA,UACpD,SAAA,EAAU;AAAA;AAAA,OACZ;AAAA,sBAGAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACb,QAAA,kBAAAC,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MACP,QAAA;AAAA,YACE,CAAA,EAAG,CAAA,CAAE,gCAAgC,CAAC;;AAAA,CAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,WAAA,GAAc;AAAA,EAAK,KAAK,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,KAAK,OAAA,GAAU;AAAA,CAAA,EAAM,EAAE,sBAAsB,CAAC,KAAK,IAAA,CAAK,OAAO,MAAM,EAAE,CAAA;AAAA,WACvL;AAAA,UAEF,SAAA,EAAU,+VAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,iEAAA,EAAkE,CAAA;AAAA,YACrF,EAAE,yBAAyB;AAAA;AAAA;AAAA,OAC9B,EACF,CAAA;AAAA,sBAGAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oFAAA,EACV,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,uBAAuB,CAAA;AAAA,UAAG,SAAS,MAAA,GAAS,CAAA,GAAI,CAAA,MAAA,EAAM,QAAA,CAAS,MAAM,CAAA,CAAA,GAAK;AAAA,SAAA,EAC/E,CAAA;AAAA,wBACAD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAU,IAAA,CAAK,EAAA,EAAI,CAAA,EACnC,CAAA;AAAA,QACC,QAAA,CAAS,SAAS,CAAA,oBACjBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACbA,IAAC,QAAA,EAAA,EAAqB,IAAA,EAAM,MAAb,EAAA,CAAG,EAAc,CACjC,CAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAGAC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4EAAA,EACV,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,sBAAsB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,QAAE,QAAA;AAAA,QAAI,EAAE,sBAAsB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,cAAA,CAAe,KAAK,SAAS;AAAA,OAAA,EAC3H;AAAA,KAAA,EACF;AAAA;AAEJ;ACrMA,IAAM,YAAA,GAA6B,CAAC,MAAA,EAAQ,aAAA,EAAe,QAAQ,WAAW,CAAA;AAIvE,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,IAAIF,cAAAA,EAAe;AACzB,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAKxD,EAAAO,MAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,KAAK,UAAA,EAAW;AAChB,IAAA,KAAK,WAAA,EAAY;AACjB,IAAA,KAAK,YAAA,EAAa;AAAA,EACpB,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,YAAY,CAAC,CAAA;AAE1C,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,OAAA,CAAQ,MAAM;AAClC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAA8B;AAC9C,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC3C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AACjC,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACEL,KAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAAC,cAAA,oBAAkBD,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,IACnC,CAAC,cAAA,oBAAkBA,GAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,oBAElCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCACZ,QAAA,EAAA,cAAA,mBACCA,GAAAA,CAAC,UAAA,EAAA,EAAW,QAAQ,cAAA,EAAgB,CAAA,GAClC,YAAA,IAAgB,KAAA,CAAM,WAAW,CAAA,mBACnCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gFAAA,EAAiF,CAAA,EAClG,CAAA,GACE,KAAA,CAAM,WAAW,CAAA,mBACnBC,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,sBACrDA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,qBAAA,EAAuB,QAAA,EAAA,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,sBACrDA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,cAAA,EAAgB,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAAE;AAAA,KAAA,EAC5D,CAAA,GACE,YAAA,KAAiB,KAAA,mBACnBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,GAAAA,CAAC,KAAA,EAAA,EAAkB,SAAA,EAAU,MAAA,EAC3B,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY,CAAA,EAAA,EADd,IAAA,CAAK,EAEf,CACD,CAAA,EACH,CAAA,mBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,WAAA,IAAA,CAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,IAAU,CAAA,IAAK,CAAC,EAAE,GAAA,CAAI,CAAC,MAAA,qBACvFA,GAAAA,CAAC,eAAA,EAAA,EAA6B,MAAA,EAAgB,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,EAAC,EAAA,EAAvD,MAA0D,CACjF,GACH,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,MAAM,IAAID,cAAAA,EAAe;AACzB,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAC9C,EAAA,OAAOO,MAAAA,CAAM,QAAQ,MAAM;AACzB,IAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,CAAQ,OAAA,GAAU,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,uBAAuB,CAAC,CAAA,CAAE,CAAA;AACtF,IAAA,IAAI,OAAA,CAAQ,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,wBAAwB,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAA,EAAS,CAAC,CAAC,CAAA;AACjB;ACpFO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,IAAIP,cAAAA,EAAe;AACzB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACtD,EAAA,MAAM,cAAc,mBAAA,EAAoB;AAExC,EAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAM,UAAA,EAAY,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,IAAA,IAAI,CAAC,GAAG,WAAA,EAAY;AAAA,EAAE,GACpE,QAAA,kBAAAC,IAAAA,CAAC,gBAAa,KAAA,EAAM,UAAA,EAAW,SAAQ,KAAA,EACrC,QAAA,EAAA;AAAA,oBAAAA,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE,CAAA;AAAA,sBACrCA,GAAAA,CAAC,gBAAA,EAAA,EACE,QAAA,EAAA,WAAA,IAAe,CAAA,CAAE,uBAAuB,CAAA,EAC3C;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,IAAC,SAAA,EAAA,EAAU,SAAA,EAAU,2BACnB,QAAA,kBAAAA,GAAAA,CAAC,cAAW,CAAA,EACd;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACVO,SAAS,iBAAA,CAAkB,EAAE,MAAA,EAAO,EAA2B;AACpE,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,UAAA,EAAW,GAAI,MAAA;AACnD,EAAA,MAAM,IAAID,cAAAA,EAAe;AAEzB,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAEtD,EAAA,MAAM,UAAU,QAAA,CAAS,UAAA,EAAY,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,OAAA,GAAU,OAAA,CAAQ,IAAA,GAAO,QAAQ,UAAA,GAAa,CAAA;AAIhE,EAAA,MAAM,KAAA,GAAQO,MAAAA,CAAM,OAAA,CAAQ,MAAM;AAChC,IAAA,MAAM,SAAA,GAAY,sBAChBN,GAAAA,CAAC,wBAAqB,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,aAAA,EAAe,KAAA,EAAO,UAAA,EACzE,QAAA,kBAAAA,GAAAA,CAAC,cAAW,CAAA,EACd,CAAA;AAEF,IAAA,SAAA,CAAU,WAAA,GAAc,gBAAA;AACxB,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,aAAA,EAAe,UAAU,CAAC,CAAA;AAE3C,EAAA,iBAAA;AAAA,IACEM,MAAAA,CAAM,OAAA;AAAA,MACJ,MACE,WAAA,GACI;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QACJ,KAAA,EAAO,CAAA,CAAE,oBAAoB,CAAA,IAAK,OAAA;AAAA,QAClC,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,aAAA,EAAuB;AAAA,QACxD,SAAA,EAAW;AAAA,OACb,GACA,IAAA;AAAA,MACN,CAAC,WAAA,EAAa,CAAA,EAAG,KAAA,EAAO,SAAS;AAAA;AACnC,GACF;AAEA,EAAA,uBACEL,KAAC,oBAAA,EAAA,EAAqB,MAAA,EAAQ,aAAa,QAAA,EAAU,aAAA,EAAe,OAAO,UAAA,EACzE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,sBAAA,EAAA,EAAuB,KAAA,EAAO,UAAA,EAAY,WAAA,EAA0B,CAAA;AAAA,IACpE,CAAC,WAAA,oBAAeA,GAAAA,CAAC,WAAA,EAAA,EAAY;AAAA,GAAA,EAChC,CAAA;AAEJ;AAEA,SAAS,sBAAA,CAAuB;AAAA,EAC9B,KAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,eAAe,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAC1D,EAAA,MAAM,eAAe,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAC1D,EAAA,MAAM,UAAU,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAE1D,EAAAO,UAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,YAAA,GAAe,OAAA,GAAU,OAAA,CAAQ,IAAA,GAAO,QAAQ,UAAA,GAAa,CAAA;AAEnE,EAAA,uBACEN,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,SAAA,EAAW,GAAG,uFAAuF,CAAA;AAAA,MACrG,SAAS,MAAO,WAAA,GAAc,WAAA,CAAY,OAAO,IAAI,YAAA,EAAa;AAAA,MAClE,YAAA,EAAW,OAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,QAChC,YAAA,GAAe,qBACdA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,EAAA;AAAA,cACT,uHAAA;AAAA,cACA,YAAA,GAAe,IACX,8BAAA,GACA;AAAA,aACN;AAAA,YAEC,QAAA,EAAA,YAAA,GAAe,KAAK,KAAA,GAAQ;AAAA;AAAA;AAC/B;AAAA;AAAA,GAEJ;AAEJ;;;ACxGO,IAAM,wBAAA,GAA2B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAcjC,IAAM,wBAAA,GAA2B,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACmBxC,IAAM,cAAA,GAAoC;AAAA,EACxC,WAAA,EAAa,OAAA;AAAA,EACb,aAAA,EAAe,OAAA;AAAA,EACf,mBAAA,EAAqB;AACvB,CAAA;AAMA,SAAS,cAAc,OAAA,EAAmD;AACxE,EAAA,OAAO;AAAA,IACL,QAAQ,EAAE,GAAG,cAAA,EAAgB,GAAG,SAAS,MAAA;AAAO,GAClD;AACF;AAOO,SAAS,kBAAkB,OAAA,EAA8C;AAC9E,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AAGpC,EAAA,oBAAA,CAAqB,YAAY,CAAA;AACjC,EAAA,MAAM,QAAA,GAAW,SAAS,YAAA,IAAgB,sBAAA;AAAA,IACxC,MAAM,2BAAA,EAA4B;AAAA,IAClC,MAAM,uBAAA;AAAwB,GAChC;AACA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,QAAQ,CAAA;AAKvC,EAAA,yBAAA,CAA0B;AAAA,IACxB,MAAM,UAAA,CAAW,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAU,EAAG;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,UAAA,CAAW;AAAA,QACrC,KAAA;AAAA,QACA,WAAA,EAAa,SAAA,GAAY,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,QAAQ,CAAC,CAAA,EAAG,iBAAiB,CAAA,EAAG,MAAM,CAAA,CAAE;AAAA,OACzC,CAAA;AACD,MAAA,KAAK,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,EAAa;AACnC,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,KAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,MAAA,KAAW,MAAA,EAAO;AAAA,IACxE,CAAA;AAAA,IACA,MAAM,UAAU,MAAA,EAAQ;AACtB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,iBAAiB,CAAA,EAAG,MAAM,CAAA,CAAA;AAC3C,MAAA,OAAO,MACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,CACtC,KAAK,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,GAAI,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA,GAAI,CAAA,CAAE,EAC5E,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,KAAW,QAAO,CAAE,CAAA;AAAA,IACzE,CAAA;AAAA,IACA,MAAM,UAAA,CAAW,EAAA,EAAY,IAAA,EAAe;AAC1C,MAAA,MAAM,QAAA,CAAS,WAAW,EAAA,EAAI,EAAE,QAAQ,IAAA,GAAO,MAAA,GAAS,QAAQ,CAAA;AAChE,MAAA,KAAK,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,EAAa;AAAA,IACrC,CAAA;AAAA,IACA,MAAM,WAAW,EAAA,EAAY;AAC3B,MAAA,MAAM,QAAA,CAAS,WAAW,EAAE,CAAA;AAC5B,MAAA,KAAK,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,EAAa;AAAA,IACrC;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,OAAO,MAAA,CAAO,WAAA;AAAA,IACpB,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,KAAA,EAAO,SAAS,KAAA,IAAS,WAAA;AAAA,IACzB,YAAY,OAAA,EAAS,UAAA;AAAA,IACrB,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,EAAC;AAAA,IAEf,YAAY,EAAC;AAAA,IAEb,QAAQ,EAAC;AAAA,IAET,OAAA,EAAS;AAAA,MACP;AAAA,QACE,EAAA,EAAI,qBAAA;AAAA,QACJ,IAAA,EAAM,kBAAA;AAAA,QACN,SAAA,EAAW,iBAAA;AAAA,QACX,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO;AAAA,UACL,WAAA,EAAa,MAAA;AAAA,UACb,aAAA,EAAe,QAAA;AAAA,UACf,UAAA,EAAY;AAAA;AACd;AACF,KACF;AAAA,IAEA,OAAA,EAAS;AAAA,MACP;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAa,wFAAA;AAAA,QACb,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa,uBAAA;AAAA,cACb,MAAM,CAAC,MAAA,EAAQ,aAAA,EAAe,MAAA,EAAQ,aAAa,KAAK;AAAA;AAC1D;AACF,SACF;AAAA,QACA,WAAA,EAAa;AAAA,UACX,EAAE,OAAO,yBAAA,EAA0B;AAAA,UACnC,EAAE,OAAO,6BAAA,EAA8B;AAAA,UACvC,EAAE,OAAO,mBAAA;AAAoB;AAC/B;AACF,KACF;AAAA,IAEA,UAAA,EAAY,eAAA;AAAA,IAEZ,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QACJ,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,QACrB,IAAA,EAAM,aAAA;AAAA,QACN,YAAY,MAAM;AAChB,UAAA,MAAM,GAAA,GAAgB,MACpBM,MAAAA,CAAM,aAAA;AAAA,YAAc,oBAAA;AAAA,YAAsB,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,YAClEA,MAAAA,CAAM,cAAc,oBAAoB;AAAA,WAC1C;AACF,UAAA,GAAA,CAAI,WAAA,GAAc,kBAAA;AAClB,UAAA,OAAO,GAAA;AAAA,QACT,CAAA,GAAG;AAAA,QACH,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IAEA,UAAA,EAAY;AAAA,MACV;AAAA,QACE,EAAA,EAAI,sBAAA;AAAA,QACJ,OAAA,EAAS,OAAA;AAAA,QACT,GAAA,EAAK,wBAAA;AAAA,QACL,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,EAAA,EAAI,uBAAA;AAAA,QACJ,OAAA,EAAS,OAAA;AAAA,QACT,GAAA,EAAK,wBAAA;AAAA,QACL,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IAEA,OAAA,EAAS;AAAA,GACX;AACF","file":"index.js","sourcesContent":["import { createPluginContext } from '@fayz-ai/admin'\nimport type { TasksDataProvider } from './data/types'\nimport type { TasksUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginLabels {\n drawerTitle: string\n settingsTitle: string\n quickAddPlaceholder: string\n}\n\nexport interface ResolvedTasksConfig {\n labels: TasksPluginLabels\n}\n\nconst ctx = createPluginContext<ResolvedTasksConfig, TasksDataProvider, TasksUIState>('TasksContextProvider')\n\nexport const TasksContextProvider = ctx.ContextProvider\nexport const useTasksConfig = ctx.useConfig\nexport const useTasksProvider = ctx.useProvider\nexport const useTasksStore = ctx.useStore\n","import type { TasksDataProvider } from './types'\nimport type {\n Task, TaskLabel, CreateTaskInput, UpdateTaskInput,\n TaskQuery, TasksSummary, TaskStatus,\n} from '../types'\n\nfunction uid(): string { return crypto.randomUUID?.() ?? String(Date.now()) }\nfunction now(): string { return new Date().toISOString() }\nfunction today(): string { return new Date().toISOString().slice(0, 10) }\n\nconst SEED_LABELS: TaskLabel[] = [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true, tenantId: 'mock', createdAt: now() },\n]\n\nfunction makeSeedTasks(): Task[] {\n const base = {\n tenantId: 'mock',\n description: null,\n assignedToId: null,\n assignedToName: null,\n parentId: null,\n labels: [],\n createdById: null,\n createdByName: null,\n createdAt: now(),\n updatedAt: now(),\n }\n return [\n { ...base, id: uid(), title: 'Setup payment gateway', status: 'todo' as const, priority: 'high' as const, dueDate: today(), position: 0 },\n { ...base, id: uid(), title: 'Update menu photos', status: 'todo' as const, priority: 'medium' as const, dueDate: null, position: 1 },\n { ...base, id: uid(), title: 'Review monthly report', status: 'in_progress' as const, priority: 'medium' as const, dueDate: null, position: 0 },\n { ...base, id: uid(), title: 'Fix login bug', status: 'in_progress' as const, priority: 'urgent' as const, dueDate: today(), position: 1, labels: ['lbl-bug'] },\n { ...base, id: uid(), title: 'Onboard new employee', status: 'done' as const, priority: 'low' as const, dueDate: null, position: 0 },\n ]\n}\n\nfunction matchesQuery(task: Task, query: TaskQuery): boolean {\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(task.status)) return false\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n if (!priorities.includes(task.priority)) return false\n }\n if (query.assignedToId && task.assignedToId !== query.assignedToId) return false\n if (query.parentId !== undefined) {\n if (query.parentId === null && task.parentId !== null) return false\n if (query.parentId !== null && task.parentId !== query.parentId) return false\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n if (!task.title.toLowerCase().includes(s)) return false\n }\n if (query.overdue && task.dueDate) {\n if (task.dueDate >= today()) return false\n }\n return true\n}\n\nexport function createMockTasksProvider(): TasksDataProvider {\n let tasks = makeSeedTasks()\n const labels = [...SEED_LABELS]\n\n return {\n async getTasks(query) {\n return tasks.filter((t) => matchesQuery(t, query)).sort((a, b) => a.position - b.position)\n },\n\n async getTaskById(id) {\n return tasks.find((t) => t.id === id) ?? null\n },\n\n async getSubtasks(parentId) {\n return tasks.filter((t) => t.parentId === parentId).sort((a, b) => a.position - b.position)\n },\n\n async createTask(input: CreateTaskInput) {\n const statusTasks = tasks.filter((t) => t.status === (input.status ?? 'todo') && t.parentId === (input.parentId ?? null))\n const maxPos = statusTasks.reduce((max, t) => Math.max(max, t.position), -1)\n const task: Task = {\n id: uid(),\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n dueDate: input.dueDate ?? null,\n assignedToId: input.assignedToId ?? null,\n assignedToName: null,\n parentId: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n createdById: null,\n createdByName: null,\n tenantId: 'mock',\n createdAt: now(),\n updatedAt: now(),\n }\n tasks.push(task)\n return task\n },\n\n async updateTask(id, input: UpdateTaskInput) {\n const idx = tasks.findIndex((t) => t.id === id)\n if (idx === -1) throw new Error('Task not found')\n tasks[idx] = { ...tasks[idx], ...input, updatedAt: now() } as Task\n return tasks[idx]\n },\n\n async deleteTask(id) {\n tasks = tasks.filter((t) => t.id !== id && t.parentId !== id)\n },\n\n async reorderTask(id, newPosition, status) {\n const task = tasks.find((t) => t.id === id)\n if (!task) return\n task.status = status\n task.position = newPosition\n task.updatedAt = now()\n },\n\n async getLabels() {\n return labels.filter((l) => l.isActive)\n },\n\n async getSummary() {\n const topLevel = tasks.filter((t) => t.parentId === null)\n const d = today()\n return {\n total: topLevel.length,\n todo: topLevel.filter((t) => t.status === 'todo').length,\n inProgress: topLevel.filter((t) => t.status === 'in_progress').length,\n done: topLevel.filter((t) => t.status === 'done').length,\n overdue: topLevel.filter((t) => t.dueDate != null && t.dueDate < d && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: topLevel.filter((t) => t.dueDate === d && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: topLevel.filter((t) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","// Physical table names for the tasks plugin (plg_tasks_* prefix). Import T and\n// reference T.<key> in the data provider so a rename lands in exactly one place.\nexport const T = {\n tasks: 'plg_tasks_tasks',\n labels: 'plg_tasks_labels',\n} as const\n","import type { TasksDataProvider } from './types'\nimport type { Task, TaskLabel, TasksSummary, TaskStatus } from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getTasksTenantId } from '../lib/tenant'\nimport { T } from './tables'\n\nfunction getTenantId(): string | undefined {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getTasksTenantId() ?? getActiveTenantId()\n}\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction toTask(row: Record<string, unknown>): Task {\n const t = snakeToCamel(row) as unknown as Task\n // Ensure labels is always an array\n if (!Array.isArray(t.labels)) t.labels = []\n return t\n}\n\nexport function createSupabaseTasksProvider(): TasksDataProvider {\n return {\n async getTasks(query) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n let q = getClient()\n .from(T.tasks)\n .select('*')\n .eq('tenant_id', tenantId)\n\n if (query.parentId === null) {\n q = q.is('parent_id', null)\n } else if (query.parentId) {\n q = q.eq('parent_id', query.parentId)\n }\n\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n q = q.in('status', statuses)\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n q = q.in('priority', priorities)\n }\n if (query.assignedToId) {\n q = q.eq('assigned_to_id', query.assignedToId)\n }\n if (query.search) {\n q = q.ilike('title', `%${query.search}%`)\n }\n if (query.overdue) {\n q = q.lt('due_date', new Date().toISOString().slice(0, 10))\n .not('status', 'in', '(\"done\",\"cancelled\")')\n }\n\n q = q.order('position', { ascending: true }).order('created_at', { ascending: false })\n\n const { data } = await q\n return (data ?? []).map(toTask)\n },\n\n async getTaskById(id) {\n const { data } = await getClient()\n .from(T.tasks)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toTask(data) : null\n },\n\n async getSubtasks(parentId) {\n const { data } = await getClient()\n .from(T.tasks)\n .select('*')\n .eq('parent_id', parentId)\n .order('position', { ascending: true })\n return (data ?? []).map(toTask)\n },\n\n async createTask(input) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n // Get max position for the status group\n const { data: maxData } = await getClient()\n .from(T.tasks)\n .select('position')\n .eq('tenant_id', tenantId)\n .eq('status', input.status ?? 'todo')\n .is('parent_id', input.parentId ?? null)\n .order('position', { ascending: false })\n .limit(1)\n const maxPos = maxData?.[0]?.position ?? -1\n\n const { data, error } = await getClient()\n .from(T.tasks)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n due_date: input.dueDate ?? null,\n assigned_to_id: input.assignedToId ?? null,\n parent_id: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n })\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async updateTask(id, input) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.title !== undefined) payload.title = input.title\n if (input.description !== undefined) payload.description = input.description\n if (input.status !== undefined) payload.status = input.status\n if (input.priority !== undefined) payload.priority = input.priority\n if (input.dueDate !== undefined) payload.due_date = input.dueDate\n if (input.assignedToId !== undefined) payload.assigned_to_id = input.assignedToId\n if (input.labels !== undefined) payload.labels = input.labels\n if (input.position !== undefined) payload.position = input.position\n\n const { data, error } = await getClient()\n .from(T.tasks)\n .update(payload)\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async deleteTask(id) {\n await getClient().from(T.tasks).delete().eq('id', id)\n },\n\n async reorderTask(id, newPosition, status) {\n await getClient()\n .from(T.tasks)\n .update({ position: newPosition, status, updated_at: new Date().toISOString() })\n .eq('id', id)\n },\n\n async getLabels() {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.labels)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('name')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as TaskLabel)\n },\n\n async getSummary() {\n const tenantId = getTenantId()\n if (!tenantId) return { total: 0, todo: 0, inProgress: 0, done: 0, overdue: 0, dueToday: 0, highPriority: 0 }\n\n const { data } = await getClient()\n .from(T.tasks)\n .select('status, priority, due_date')\n .eq('tenant_id', tenantId)\n .is('parent_id', null)\n\n const tasks = data ?? []\n const today = new Date().toISOString().slice(0, 10)\n return {\n total: tasks.length,\n todo: tasks.filter((t: any) => t.status === 'todo').length,\n inProgress: tasks.filter((t: any) => t.status === 'in_progress').length,\n done: tasks.filter((t: any) => t.status === 'done').length,\n overdue: tasks.filter((t: any) => t.due_date && t.due_date < today && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: tasks.filter((t: any) => t.due_date === today && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: tasks.filter((t: any) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport type { TasksDataProvider } from './data/types'\nimport type {\n Task, TaskLabel, TasksSummary, TaskQuery,\n CreateTaskInput, UpdateTaskInput, TaskStatus,\n} from './types'\n\nexport interface TasksUIState {\n // Data\n tasks: Task[]\n tasksLoading: boolean\n labels: TaskLabel[]\n summary: TasksSummary | null\n summaryLoading: boolean\n\n // Drawer UI\n drawerOpen: boolean\n selectedTaskId: string | null\n activeFilter: TaskStatus | 'all'\n\n // Actions — data\n fetchTasks(query?: TaskQuery): Promise<void>\n fetchLabels(): Promise<void>\n fetchSummary(): Promise<void>\n createTask(input: CreateTaskInput): Promise<Task>\n updateTask(id: string, input: UpdateTaskInput): Promise<Task>\n deleteTask(id: string): Promise<void>\n reorderTask(id: string, newPosition: number, status: TaskStatus): Promise<void>\n\n // Actions — UI\n openDrawer(): void\n closeDrawer(): void\n toggleDrawer(): void\n selectTask(id: string | null): void\n setFilter(filter: TaskStatus | 'all'): void\n}\n\nexport function createTasksStore(provider: TasksDataProvider): StoreApi<TasksUIState> {\n return createStore<TasksUIState>((set, get) => ({\n tasks: [],\n tasksLoading: false,\n labels: [],\n summary: null,\n summaryLoading: false,\n\n drawerOpen: false,\n selectedTaskId: null,\n activeFilter: 'all',\n\n // ----- Data actions -----\n\n async fetchTasks(query?: TaskQuery) {\n return dedup('tasks:list', async () => {\n set({ tasksLoading: true })\n try {\n const filter = get().activeFilter\n const q: TaskQuery = {\n parentId: null,\n ...query,\n ...(filter !== 'all' ? { status: filter } : {}),\n }\n const tasks = await provider.getTasks(q)\n set({ tasks, tasksLoading: false })\n } catch {\n set({ tasksLoading: false })\n }\n })\n },\n\n async fetchLabels() {\n return dedup('tasks:labels', async () => {\n try {\n const labels = await provider.getLabels()\n set({ labels })\n } catch { /* silent */ }\n })\n },\n\n async fetchSummary() {\n return dedup('tasks:summary', async () => {\n set({ summaryLoading: true })\n try {\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n } catch {\n set({ summaryLoading: false })\n }\n })\n },\n\n async createTask(input) {\n const task = await provider.createTask(input)\n // Re-fetch to get correct ordering\n await get().fetchTasks()\n await get().fetchSummary()\n return task\n },\n\n async updateTask(id, input) {\n const task = await provider.updateTask(id, input)\n // Update in-place for snappy UI, then re-fetch\n set((s) => ({ tasks: s.tasks.map((t) => (t.id === id ? task : t)) }))\n await get().fetchSummary()\n return task\n },\n\n async deleteTask(id) {\n await provider.deleteTask(id)\n set((s) => ({ tasks: s.tasks.filter((t) => t.id !== id), selectedTaskId: null }))\n await get().fetchSummary()\n },\n\n async reorderTask(id, newPosition, status) {\n await provider.reorderTask(id, newPosition, status)\n await get().fetchTasks()\n },\n\n // ----- UI actions -----\n\n openDrawer() {\n set({ drawerOpen: true })\n // Refresh data when opening\n get().fetchTasks()\n get().fetchLabels()\n get().fetchSummary()\n },\n\n closeDrawer() {\n set({ drawerOpen: false, selectedTaskId: null })\n },\n\n toggleDrawer() {\n const { drawerOpen } = get()\n if (drawerOpen) get().closeDrawer()\n else get().openDrawer()\n },\n\n selectTask(id) {\n set({ selectedTaskId: id })\n },\n\n setFilter(filter) {\n set({ activeFilter: filter })\n get().fetchTasks()\n },\n }))\n}\n","export const en: Record<string, string> = {\n 'tasks.title': 'Tasks',\n 'tasks.drawer.title': 'Tasks',\n 'tasks.drawer.subtitle': 'Manage your team tasks',\n 'tasks.quickAdd.placeholder': 'Add a task...',\n 'tasks.filter.all': 'All',\n 'tasks.filter.todo': 'To Do',\n 'tasks.filter.inProgress': 'In Progress',\n 'tasks.filter.done': 'Done',\n 'tasks.status.todo': 'To Do',\n 'tasks.status.in_progress': 'In Progress',\n 'tasks.status.done': 'Done',\n 'tasks.status.cancelled': 'Cancelled',\n 'tasks.priority.low': 'Low',\n 'tasks.priority.medium': 'Medium',\n 'tasks.priority.high': 'High',\n 'tasks.priority.urgent': 'Urgent',\n 'tasks.detail.description': 'Description',\n 'tasks.detail.descriptionPlaceholder': 'Add a description...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Priority',\n 'tasks.detail.dueDate': 'Due Date',\n 'tasks.detail.assignee': 'Assigned To',\n 'tasks.detail.labels': 'Labels',\n 'tasks.detail.subtasks': 'Subtasks',\n 'tasks.detail.delete': 'Delete Task',\n 'tasks.detail.deleteConfirm': 'Are you sure you want to delete this task?',\n 'tasks.detail.created': 'Created',\n 'tasks.detail.chatWithAi': 'Chat with AI',\n 'tasks.detail.chatWithAi.prompt': 'Take over this task and help me resolve it now, using your tools when needed:',\n 'tasks.detail.updated': 'Updated',\n 'tasks.detail.addSubtask': 'Add subtask...',\n 'tasks.detail.back': 'Back to list',\n 'tasks.summary.overdue': 'overdue',\n 'tasks.summary.dueToday': 'due today',\n 'tasks.empty': 'No tasks yet',\n 'tasks.empty.description': 'Add your first task using the input above',\n 'tasks.settings.title': 'Tasks',\n 'tasks.settings.general': 'General',\n 'tasks.settings.defaultPriority': 'Default Priority',\n 'tasks.settings.autoAssign': 'Auto-assign tasks to creator',\n}\n","export const ptBR: Record<string, string> = {\n 'tasks.title': 'Tarefas',\n 'tasks.drawer.title': 'Tarefas',\n 'tasks.drawer.subtitle': 'Gerencie as tarefas da equipe',\n 'tasks.quickAdd.placeholder': 'Adicionar tarefa...',\n 'tasks.filter.all': 'Todas',\n 'tasks.filter.todo': 'A Fazer',\n 'tasks.filter.inProgress': 'Em Andamento',\n 'tasks.filter.done': 'Concluídas',\n 'tasks.status.todo': 'A Fazer',\n 'tasks.status.in_progress': 'Em Andamento',\n 'tasks.status.done': 'Concluída',\n 'tasks.status.cancelled': 'Cancelada',\n 'tasks.priority.low': 'Baixa',\n 'tasks.priority.medium': 'Média',\n 'tasks.priority.high': 'Alta',\n 'tasks.priority.urgent': 'Urgente',\n 'tasks.detail.description': 'Descrição',\n 'tasks.detail.descriptionPlaceholder': 'Adicionar descrição...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Prioridade',\n 'tasks.detail.dueDate': 'Data de Vencimento',\n 'tasks.detail.assignee': 'Responsável',\n 'tasks.detail.labels': 'Etiquetas',\n 'tasks.detail.subtasks': 'Subtarefas',\n 'tasks.detail.delete': 'Excluir Tarefa',\n 'tasks.detail.deleteConfirm': 'Tem certeza que deseja excluir esta tarefa?',\n 'tasks.detail.created': 'Criada em',\n 'tasks.detail.chatWithAi': 'Conversar com IA',\n 'tasks.detail.chatWithAi.prompt': 'Assuma esta tarefa e me ajude a resolver agora, usando suas ferramentas quando precisar:',\n 'tasks.detail.updated': 'Atualizada em',\n 'tasks.detail.addSubtask': 'Adicionar subtarefa...',\n 'tasks.detail.back': 'Voltar à lista',\n 'tasks.summary.overdue': 'atrasadas',\n 'tasks.summary.dueToday': 'vencem hoje',\n 'tasks.empty': 'Nenhuma tarefa ainda',\n 'tasks.empty.description': 'Adicione sua primeira tarefa usando o campo acima',\n 'tasks.settings.title': 'Tarefas',\n 'tasks.settings.general': 'Geral',\n 'tasks.settings.defaultPriority': 'Prioridade Padrão',\n 'tasks.settings.autoAssign': 'Atribuir tarefas automaticamente ao criador',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const tasksLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { T } from './tables'\n\nconst taskLabelEntity: EntityDef = {\n name: 'Task Label',\n namePlural: 'Task Labels',\n icon: 'Tag',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'text', showInTable: true, defaultValue: '#6366f1' },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.labels, tenantScoped: true },\n}\n\nexport const tasksRegistries: PluginRegistryDef[] = [\n {\n id: 'task-labels',\n entity: taskLabelEntity,\n icon: 'Tag',\n description: 'Labels for categorizing tasks',\n display: 'table',\n seedData: [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true },\n ],\n },\n]\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useTenantPluginSettings } from '@fayz-ai/admin'\n\n// Per-tenant defaults = the value that used to be the hardcoded `selected` option.\n// Persisted + re-hydrated per tenant; behavioural consumption is a follow-up.\nconst TASKS_DEFAULTS = {\n defaultPriority: 'medium',\n}\n\nexport function TasksGeneralSettings() {\n const t = useTranslation()\n const s = useTenantPluginSettings('tasks', TASKS_DEFAULTS)\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3 className=\"text-sm font-semibold mb-1\">{t('tasks.settings.general')}</h3>\n <p className=\"text-xs text-muted-foreground mb-3\">\n {t('tasks.drawer.subtitle')}\n </p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('tasks.settings.defaultPriority')}</label>\n <select\n className=\"w-full max-w-xs rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm\"\n value={s.get('defaultPriority')}\n onChange={(e) => s.set('defaultPriority', e.target.value)}\n >\n <option value=\"low\">{t('tasks.priority.low')}</option>\n <option value=\"medium\">{t('tasks.priority.medium')}</option>\n <option value=\"high\">{t('tasks.priority.high')}</option>\n <option value=\"urgent\">{t('tasks.priority.urgent')}</option>\n </select>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskStatus } from '../types'\n\nconst FILTERS: Array<{ key: TaskStatus | 'all'; labelKey: string }> = [\n { key: 'all', labelKey: 'tasks.filter.all' },\n { key: 'todo', labelKey: 'tasks.filter.todo' },\n { key: 'in_progress', labelKey: 'tasks.filter.inProgress' },\n { key: 'done', labelKey: 'tasks.filter.done' },\n]\n\nexport function TasksFilterBar() {\n const t = useTranslation()\n const activeFilter = useTasksStore((s) => s.activeFilter)\n const setFilter = useTasksStore((s) => s.setFilter)\n const summary = useTasksStore((s) => s.summary)\n\n const getCount = (key: TaskStatus | 'all'): number | undefined => {\n if (!summary) return undefined\n switch (key) {\n case 'all': return summary.total\n case 'todo': return summary.todo\n case 'in_progress': return summary.inProgress\n case 'done': return summary.done\n default: return undefined\n }\n }\n\n return (\n <div className=\"flex items-center gap-1 px-3 py-2 border-b overflow-x-auto\">\n {FILTERS.map(({ key, labelKey }) => {\n const active = activeFilter === key\n const count = getCount(key)\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => setFilter(key)}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium transition-colors whitespace-nowrap ${\n active\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {t(labelKey)}\n {count != null && (\n <span className={`text-[10px] ${active ? 'text-primary-foreground/80' : 'text-muted-foreground'}`}>\n {count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { Plus } from 'lucide-react'\nimport { useTasksStore, useTasksConfig } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskPriority } from '../types'\n\nexport function TaskQuickAdd({ parentId }: { parentId?: string | null }) {\n const t = useTranslation()\n const createTask = useTasksStore((s) => s.createTask)\n const [title, setTitle] = useState('')\n const [loading, setLoading] = useState(false)\n\n const handleSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n const trimmed = title.trim()\n if (!trimmed || loading) return\n setLoading(true)\n try {\n await createTask({\n title: trimmed,\n parentId: parentId ?? null,\n })\n setTitle('')\n } finally {\n setLoading(false)\n }\n }, [title, loading, createTask, parentId])\n\n return (\n <form onSubmit={handleSubmit} className=\"flex items-center gap-2 px-3 py-2 border-b\">\n <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={parentId ? t('tasks.detail.addSubtask') : t('tasks.quickAdd.placeholder')}\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground/60\"\n disabled={loading}\n />\n </form>\n )\n}\n","import React from 'react'\nimport { AlertTriangle, ArrowUp, ArrowDown, Minus } from 'lucide-react'\nimport type { TaskPriority } from '../types'\n\nconst PRIORITY_CONFIG: Record<TaskPriority, { color: string; bg: string; icon: React.ComponentType<{ className?: string }> }> = {\n low: { color: 'text-muted-foreground', bg: 'bg-muted', icon: ArrowDown },\n medium: { color: 'text-info-soft-foreground', bg: 'bg-info-soft', icon: Minus },\n high: { color: 'text-warning-soft-foreground', bg: 'bg-warning-soft', icon: ArrowUp },\n urgent: { color: 'text-destructive-soft-foreground', bg: 'bg-destructive-soft', icon: AlertTriangle },\n}\n\nexport function TaskPriorityBadge({ priority, showLabel }: { priority: TaskPriority; showLabel?: boolean }) {\n const cfg = PRIORITY_CONFIG[priority]\n const Icon = cfg.icon\n return (\n <span className={`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs font-medium ${cfg.color} ${cfg.bg}`}>\n <Icon className=\"h-3 w-3\" />\n {showLabel && <span className=\"capitalize\">{priority}</span>}\n </span>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\n\nexport function TaskLabelBadge({ labelId }: { labelId: string }) {\n const labels = useTasksStore((s) => s.labels)\n const label = labels.find((l) => l.id === labelId)\n if (!label) return null\n\n return (\n <span\n className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium leading-none\"\n style={{\n backgroundColor: label.color + '20',\n color: label.color,\n }}\n >\n {label.name}\n </span>\n )\n}\n\nexport function TaskLabelBadges({ labelIds, max = 2 }: { labelIds: string[]; max?: number }) {\n if (labelIds.length === 0) return null\n const visible = labelIds.slice(0, max)\n const overflow = labelIds.length - max\n\n return (\n <span className=\"inline-flex items-center gap-1\">\n {visible.map((id) => (\n <TaskLabelBadge key={id} labelId={id} />\n ))}\n {overflow > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">+{overflow}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { Calendar, ListChecks } from 'lucide-react'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { useTasksStore } from '../context'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport type { Task } from '../types'\n\nfunction isOverdue(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate < new Date().toISOString().slice(0, 10)\n}\n\nfunction isToday(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate === new Date().toISOString().slice(0, 10)\n}\n\nfunction formatDueDate(dueDate: string): string {\n const d = new Date(dueDate + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n\nexport function TaskCard({ task, subtaskCount }: { task: Task; subtaskCount?: { done: number; total: number } }) {\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n\n const isDone = task.status === 'done'\n const overdue = !isDone && isOverdue(task.dueDate)\n const dueToday = !isDone && isToday(task.dueDate)\n\n const handleCheck = (e: React.MouseEvent) => {\n e.stopPropagation()\n updateTask(task.id, { status: isDone ? 'todo' : 'done' })\n }\n\n return (\n <div\n onClick={() => selectTask(task.id)}\n className=\"group flex items-start gap-2.5 rounded-lg border border-transparent px-3 py-2.5 transition-colors hover:bg-muted bg-card shadow-button active:shadow-button-inset hover:border-border cursor-pointer\"\n >\n <div className=\"pt-0.5\" onClick={handleCheck}>\n <Checkbox checked={isDone} onChange={() => {}} />\n </div>\n\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className={`text-sm leading-snug ${isDone ? 'line-through text-muted-foreground' : ''}`}>\n {task.title}\n </p>\n\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <TaskPriorityBadge priority={task.priority} />\n\n {task.dueDate && (\n <span className={`inline-flex items-center gap-1 text-[11px] ${\n overdue ? 'text-destructive font-medium' : dueToday ? 'text-warning font-medium' : 'text-muted-foreground'\n }`}>\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(task.dueDate)}\n </span>\n )}\n\n {subtaskCount && subtaskCount.total > 0 && (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-muted-foreground\">\n <ListChecks className=\"h-3 w-3\" />\n {subtaskCount.done}/{subtaskCount.total}\n </span>\n )}\n\n <TaskLabelBadges labelIds={task.labels} max={2} />\n </div>\n </div>\n\n {task.assignedToName && (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-medium text-primary\" title={task.assignedToName}>\n {task.assignedToName.split(' ').map((n) => n[0]).join('').slice(0, 2).toUpperCase()}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus } from '../types'\n\nconst STATUS_COLORS: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\nexport function TaskStatusGroup({ status, tasks }: { status: TaskStatus; tasks: Task[] }) {\n const t = useTranslation()\n const [collapsed, setCollapsed] = useState(status === 'cancelled')\n\n if (tasks.length === 0) return null\n\n const Chevron = collapsed ? ChevronRight : ChevronDown\n\n return (\n <div className=\"space-y-0.5\">\n <button\n type=\"button\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider hover:text-foreground transition-colors\"\n >\n <span className={`h-2 w-2 rounded-full ${STATUS_COLORS[status]}`} />\n <span>{t(`tasks.status.${status}`)}</span>\n <span className=\"text-[10px] font-normal\">({tasks.length})</span>\n <Chevron className=\"ml-auto h-3.5 w-3.5\" />\n </button>\n\n {!collapsed && (\n <div>\n {tasks.map((task) => (\n <TaskCard key={task.id} task={task} />\n ))}\n </div>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Tasks Plugin — Domain Types\n// ---------------------------------------------------------------------------\n\nexport type TaskStatus = 'todo' | 'in_progress' | 'done' | 'cancelled'\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent'\n\nexport const TASK_STATUSES: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\nexport const TASK_PRIORITIES: TaskPriority[] = ['low', 'medium', 'high', 'urgent']\n\n// ---------------------------------------------------------------------------\n// Core entities\n// ---------------------------------------------------------------------------\n\nexport interface Task {\n id: string\n title: string\n description: string | null\n status: TaskStatus\n priority: TaskPriority\n dueDate: string | null\n assignedToId: string | null\n assignedToName: string | null\n parentId: string | null\n labels: string[]\n position: number\n createdById: string | null\n createdByName: string | null\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface TaskLabel {\n id: string\n name: string\n color: string\n isActive: boolean\n tenantId: string\n createdAt: string\n}\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface CreateTaskInput {\n title: string\n description?: string\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n parentId?: string | null\n labels?: string[]\n}\n\nexport interface UpdateTaskInput {\n title?: string\n description?: string | null\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n labels?: string[]\n position?: number\n}\n\n// ---------------------------------------------------------------------------\n// Query types\n// ---------------------------------------------------------------------------\n\nexport interface TaskQuery {\n status?: TaskStatus | TaskStatus[]\n priority?: TaskPriority | TaskPriority[]\n assignedToId?: string\n parentId?: string | null\n search?: string\n overdue?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Aggregation\n// ---------------------------------------------------------------------------\n\nexport interface TasksSummary {\n total: number\n todo: number\n inProgress: number\n done: number\n overdue: number\n dueToday: number\n highPriority: number\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft, Trash2, Calendar, ChevronDown, Sparkles } from 'lucide-react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useDelegateToAssistant } from '@fayz-ai/admin'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus, TaskPriority } from '../types'\nimport { TASK_STATUSES, TASK_PRIORITIES } from '../types'\n\nconst STATUS_DOT: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\n/** Same footer format as the Notes tab: time when today, short date otherwise. */\nfunction formatDateTime(iso: string): string {\n const d = new Date(iso)\n const sameDay = d.toDateString() === new Date().toDateString()\n return sameDay\n ? d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n : d.toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: '2-digit' })\n}\n\nexport function TaskDetail({ taskId }: { taskId: string }) {\n const t = useTranslation()\n const tasks = useTasksStore((s) => s.tasks)\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n const deleteTask = useTasksStore((s) => s.deleteTask)\n\n const task = tasks.find((tt) => tt.id === taskId)\n const delegate = useDelegateToAssistant()\n\n const [title, setTitle] = useState('')\n const [description, setDescription] = useState('')\n const [subtasks, setSubtasks] = useState<Task[]>([])\n\n useEffect(() => {\n if (task) {\n setTitle(task.title)\n setDescription(task.description ?? '')\n }\n }, [task])\n\n useEffect(() => { setSubtasks([]) }, [taskId])\n\n const handleTitleBlur = useCallback(() => {\n if (task && title.trim() && title !== task.title) {\n updateTask(task.id, { title: title.trim() })\n }\n }, [task, title, updateTask])\n\n const handleDescriptionBlur = useCallback(() => {\n if (task && description !== (task.description ?? '')) {\n updateTask(task.id, { description: description || null })\n }\n }, [task, description, updateTask])\n\n const handleDelete = useCallback(() => {\n if (task && confirm(t('tasks.detail.deleteConfirm'))) {\n deleteTask(task.id)\n }\n }, [task, deleteTask, t])\n\n if (!task) {\n return (\n <div className=\"flex flex-col items-center justify-center py-8 text-muted-foreground\">\n <p className=\"text-sm\">Task not found</p>\n <button type=\"button\" onClick={() => selectTask(null)} className=\"mt-2 text-xs text-primary hover:underline\">\n {t('tasks.detail.back')}\n </button>\n </div>\n )\n }\n\n return (\n // Same frame as the Notes editor: header row with back + icon actions,\n // full-bleed px-4 content, sectioned by hairlines, thin timestamp footer.\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex items-center gap-1 border-b border-border/40 px-2 py-1.5\">\n <button\n type=\"button\"\n onClick={() => selectTask(null)}\n className=\"inline-flex items-center gap-1 rounded-lg px-1.5 py-1 text-[11.5px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('tasks.drawer.title')}\n </button>\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={handleDelete}\n aria-label={t('tasks.detail.delete')}\n title={t('tasks.detail.delete')}\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={handleTitleBlur}\n onKeyDown={(e) => { if (e.key === 'Enter') e.currentTarget.blur() }}\n className=\"bg-transparent px-4 pt-3 text-sm font-semibold text-foreground outline-none\"\n />\n\n {/* Inline property chips */}\n <div className=\"flex flex-wrap items-center gap-1.5 px-4 pt-2\">\n {/* Status chip */}\n <div className=\"relative\">\n <select\n value={task.status}\n onChange={(e) => updateTask(task.id, { status: e.target.value as TaskStatus })}\n className=\"appearance-none rounded-full border bg-background pl-5 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>{t(`tasks.status.${s}`)}</option>\n ))}\n </select>\n <span className={`absolute left-2 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full ${STATUS_DOT[task.status]}`} />\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Priority chip */}\n <div className=\"relative\">\n <select\n value={task.priority}\n onChange={(e) => updateTask(task.id, { priority: e.target.value as TaskPriority })}\n className=\"appearance-none rounded-full border bg-background pl-2 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>{t(`tasks.priority.${p}`)}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Due date chip */}\n <div className=\"relative\">\n <input\n type=\"date\"\n value={task.dueDate ?? ''}\n onChange={(e) => updateTask(task.id, { dueDate: e.target.value || null })}\n className=\"appearance-none rounded-full border bg-background pl-6 pr-2 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors w-[120px]\"\n />\n <Calendar className=\"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Labels */}\n {task.labels.length > 0 && <TaskLabelBadges labelIds={task.labels} max={3} />}\n </div>\n\n {/* Description — borderless, fills the middle like the note body */}\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onBlur={handleDescriptionBlur}\n placeholder={t('tasks.detail.descriptionPlaceholder')}\n className=\"min-h-[72px] flex-1 resize-none bg-transparent px-4 py-3 text-sm leading-relaxed text-foreground outline-none placeholder:text-muted-foreground/60\"\n />\n\n {/* Agentic hand-off — same CTA pattern as the Notes tab */}\n <div className=\"px-4 pb-2\">\n <button\n type=\"button\"\n onClick={() =>\n delegate(\n `${t('tasks.detail.chatWithAi.prompt')}\\n\\n\"${task.title}\"${task.description ? `\\n${task.description}` : ''}${task.dueDate ? `\\n(${t('tasks.detail.dueDate')}: ${task.dueDate})` : ''}`,\n )\n }\n className=\"group flex w-full items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-primary via-primary/80 to-primary bg-[length:200%_100%] bg-left px-3 py-2 text-[13px] font-semibold text-primary-foreground shadow-sm transition-all duration-500 hover:bg-right hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Sparkles className=\"h-4 w-4 transition-transform duration-300 group-hover:rotate-12\" />\n {t('tasks.detail.chatWithAi')}\n </button>\n </div>\n\n {/* Subtasks — same section pattern as the note's todos */}\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <p className=\"pb-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n {t('tasks.detail.subtasks')}{subtasks.length > 0 ? ` · ${subtasks.length}` : ''}\n </p>\n <div className=\"-mx-3\">\n <TaskQuickAdd parentId={task.id} />\n </div>\n {subtasks.length > 0 && (\n <div className=\"divide-y divide-border/40\">\n {subtasks.map((st) => (\n <TaskCard key={st.id} task={st} />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer: timestamps only — delete lives in the header, like a note */}\n <p className=\"border-t border-border/40 px-4 py-1.5 text-[10px] text-muted-foreground/60\">\n {t('tasks.detail.created')} {formatDateTime(task.createdAt)} · {t('tasks.detail.updated')} {formatDateTime(task.updatedAt)}\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksFilterBar } from './TasksFilterBar'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport { TaskStatusGroup } from './TaskStatusGroup'\nimport { TaskDetail } from './TaskDetail'\nimport { ClipboardList } from 'lucide-react'\nimport type { TaskStatus } from '../types'\n\nconst STATUS_ORDER: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\n\n/** The task list with no box around it — shared by the sheet and the shell's\n * right-rail tab. */\nexport function TasksPanel() {\n const t = useTranslation()\n const selectedTaskId = useTasksStore((s) => s.selectedTaskId)\n const tasks = useTasksStore((s) => s.tasks)\n const tasksLoading = useTasksStore((s) => s.tasksLoading)\n const activeFilter = useTasksStore((s) => s.activeFilter)\n const fetchTasks = useTasksStore((s) => s.fetchTasks)\n const fetchLabels = useTasksStore((s) => s.fetchLabels)\n const fetchSummary = useTasksStore((s) => s.fetchSummary)\n\n // The rail tab mounts this panel directly — openDrawer() (the sheet path,\n // where fetching used to live) never runs there, so load on mount. Fetches\n // are deduped in the store, so the drawer path doesn't double-load.\n React.useEffect(() => {\n void fetchTasks()\n void fetchLabels()\n void fetchSummary()\n }, [fetchTasks, fetchLabels, fetchSummary])\n\n const grouped = React.useMemo(() => {\n const map = new Map<TaskStatus, typeof tasks>()\n for (const s of STATUS_ORDER) map.set(s, [])\n for (const task of tasks) {\n const group = map.get(task.status)\n if (group) group.push(task)\n }\n return map\n }, [tasks])\n\n return (\n <>\n {!selectedTaskId && <TasksFilterBar />}\n {!selectedTaskId && <TaskQuickAdd />}\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {selectedTaskId ? (\n <TaskDetail taskId={selectedTaskId} />\n ) : tasksLoading && tasks.length === 0 ? (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : tasks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-muted-foreground\">\n <ClipboardList className=\"mb-3 h-10 w-10 opacity-40\" />\n <p className=\"text-sm font-medium\">{t('tasks.empty')}</p>\n <p className=\"mt-1 text-xs\">{t('tasks.empty.description')}</p>\n </div>\n ) : activeFilter !== 'all' ? (\n <div className=\"py-1\">\n {tasks.map((task) => (\n <div key={task.id} className=\"px-2\">\n <TaskCard task={task} />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2 py-2\">\n {STATUS_ORDER.filter((s) => s !== 'cancelled' || (grouped.get(s)?.length ?? 0) > 0).map((status) => (\n <TaskStatusGroup key={status} status={status} tasks={grouped.get(status) ?? []} />\n ))}\n </div>\n )}\n </div>\n </>\n )\n}\n\n/** One-line summary of what needs attention (\"3 atrasadas · 2 para hoje\"). */\nexport function useTasksSummaryLine(): string {\n const t = useTranslation()\n const summary = useTasksStore((s) => s.summary)\n return React.useMemo(() => {\n if (!summary) return ''\n const parts: string[] = []\n if (summary.overdue > 0) parts.push(`${summary.overdue} ${t('tasks.summary.overdue')}`)\n if (summary.dueToday > 0) parts.push(`${summary.dueToday} ${t('tasks.summary.dueToday')}`)\n return parts.join(' · ')\n }, [summary, t])\n}\n","import React from 'react'\nimport {\n Sheet, SheetContent, SheetHeader, SheetBody, SheetTitle, SheetDescription,\n} from '@fayz-ai/ui'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksPanel, useTasksSummaryLine } from './TasksPanel'\n\n/** Tasks as a sheet — the fallback where the shell has no right rail. */\nexport function TasksDrawer() {\n const t = useTranslation()\n const drawerOpen = useTasksStore((s) => s.drawerOpen)\n const closeDrawer = useTasksStore((s) => s.closeDrawer)\n const summaryLine = useTasksSummaryLine()\n\n return (\n <Sheet open={drawerOpen} onOpenChange={(v) => { if (!v) closeDrawer() }}>\n <SheetContent width=\"max-w-lg\" overlay=\"dim\">\n <SheetHeader>\n <SheetTitle>{t('tasks.drawer.title')}</SheetTitle>\n <SheetDescription>\n {summaryLine || t('tasks.drawer.subtitle')}\n </SheetDescription>\n </SheetHeader>\n\n <SheetBody className=\"flex flex-col px-0 py-0\">\n <TasksPanel />\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useEffect } from 'react'\nimport { CheckSquare } from 'lucide-react'\nimport { Button } from '@fayz-ai/ui'\nimport { cn } from '@fayz-ai/ui'\nimport { useRightRailPanel, useRightRailStore } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksContextProvider, type ResolvedTasksConfig } from '../context'\nimport { TasksDrawer } from './TasksDrawer'\nimport { TasksPanel } from './TasksPanel'\nimport type { TasksDataProvider } from '../data/types'\nimport type { TasksUIState } from '../store'\nimport { useStore, type StoreApi } from 'zustand'\n\ninterface TasksTopbarWidgetProps {\n config: {\n tasksConfig: ResolvedTasksConfig\n tasksProvider: TasksDataProvider\n tasksStore: StoreApi<TasksUIState>\n }\n}\n\nexport function TasksTopbarButton({ config }: TasksTopbarWidgetProps) {\n const { tasksConfig, tasksProvider, tasksStore } = config\n const t = useTranslation()\n // The shell's rail when there is one, this plugin's sheet when there is not.\n const railMounted = useRightRailStore((s) => s.mounted)\n // Open tasks (todo + in progress) — the rail tab's red badge.\n const summary = useStore(tasksStore, (s) => s.summary)\n const openCount = summary ? summary.todo + summary.inProgress : 0\n\n // Carries its own providers (registered far from here) and must stay\n // referentially stable or the list remounts every render.\n const Panel = React.useMemo(() => {\n const RailPanel = () => (\n <TasksContextProvider config={tasksConfig} provider={tasksProvider} store={tasksStore}>\n <TasksPanel />\n </TasksContextProvider>\n )\n RailPanel.displayName = 'TasksRailPanel'\n return RailPanel\n }, [tasksConfig, tasksProvider, tasksStore])\n\n useRightRailPanel(\n React.useMemo(\n () =>\n railMounted\n ? {\n id: 'tasks',\n label: t('tasks.drawer.title') || 'Tasks',\n icon: CheckSquare,\n order: 20,\n badge: { count: openCount, tone: 'destructive' as const },\n Component: Panel,\n }\n : null,\n [railMounted, t, Panel, openCount],\n ),\n )\n\n return (\n <TasksContextProvider config={tasksConfig} provider={tasksProvider} store={tasksStore}>\n <TasksTopbarButtonInner store={tasksStore} railMounted={railMounted} />\n {!railMounted && <TasksDrawer />}\n </TasksContextProvider>\n )\n}\n\nfunction TasksTopbarButtonInner({\n store,\n railMounted,\n}: {\n store: StoreApi<TasksUIState>\n railMounted: boolean\n}) {\n const toggleDrawer = useStore(store, (s) => s.toggleDrawer)\n const fetchSummary = useStore(store, (s) => s.fetchSummary)\n const summary = useStore(store, (s) => s.summary)\n const togglePanel = useRightRailStore((s) => s.togglePanel)\n\n useEffect(() => {\n fetchSummary()\n }, [fetchSummary])\n\n const pendingCount = summary ? summary.todo + summary.inProgress : 0\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn('relative text-sidebar-foreground/70 hover:bg-sidebar/30 hover:text-sidebar-foreground')}\n onClick={() => (railMounted ? togglePanel('tasks') : toggleDrawer())}\n aria-label=\"Tasks\"\n >\n <CheckSquare className=\"h-5 w-5\" />\n {pendingCount > 0 && (\n <span\n className={cn(\n 'absolute -right-0.5 -top-0.5 flex items-center justify-center rounded-full bg-destructive text-destructive-foreground',\n pendingCount > 9\n ? 'h-5 min-w-5 px-1 text-[10px]'\n : 'h-4 w-4 text-[10px]'\n )}\n >\n {pendingCount > 99 ? '99+' : pendingCount}\n </span>\n )}\n </Button>\n )\n}\n","// AUTO-GENERATED from 000_plg_rename.sql, 001_tasks_base.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql — rename legacy tasks tables to plg_tasks_* for pools\n-- provisioned before the industry-pool rename. Guarded: fires only when legacy\n-- name exists and target does not, so fresh pools skip every branch.\nDO $$\nBEGIN\n IF to_regclass('public.tsk_tasks') IS NOT NULL AND to_regclass('public.plg_tasks_tasks') IS NULL THEN\n ALTER TABLE public.tsk_tasks RENAME TO plg_tasks_tasks;\n END IF;\n IF to_regclass('public.tsk_labels') IS NOT NULL AND to_regclass('public.plg_tasks_labels') IS NULL THEN\n ALTER TABLE public.tsk_labels RENAME TO plg_tasks_labels;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_001_TASKS_BASE = `-- Tasks Plugin: Base Tables\n-- Prefix: plg_tasks_\n\n-- Label definitions for categorizing tasks\nCREATE TABLE IF NOT EXISTS public.plg_tasks_labels (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n color text NOT NULL DEFAULT '#6366f1',\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_labels_tenant ON public.plg_tasks_labels(tenant_id);\n\n-- Main tasks table (subtasks via parent_id self-reference)\nCREATE TABLE IF NOT EXISTS public.plg_tasks_tasks (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n title text NOT NULL,\n description text,\n status text NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done', 'cancelled')),\n priority text NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'urgent')),\n due_date date,\n assigned_to_id uuid,\n assigned_to_name text,\n parent_id uuid REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE,\n labels jsonb NOT NULL DEFAULT '[]'::jsonb,\n position integer NOT NULL DEFAULT 0,\n created_by_id uuid,\n created_by_name text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_status ON public.plg_tasks_tasks(tenant_id, status);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks(parent_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks(assigned_to_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_due ON public.plg_tasks_tasks(tenant_id, due_date)\n WHERE due_date IS NOT NULL;\n\n-- RLS policies for plg_tasks_tasks (idempotent — DROP IF EXISTS before CREATE)\nDROP POLICY IF EXISTS plg_tasks_tasks_select ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_insert ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_insert ON public.plg_tasks_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_update ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_delete ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_tasks TO authenticated;\n\n-- RLS policies for plg_tasks_labels (idempotent)\nDROP POLICY IF EXISTS plg_tasks_labels_select ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_insert ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_insert ON public.plg_tasks_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_update ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_delete ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_labels TO authenticated;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_plg_rename\", sql: MIGRATION_000_PLG_RENAME },\n { id: \"001_tasks_base\", sql: MIGRATION_001_TASKS_BASE },\n]\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { TasksContextProvider, type ResolvedTasksConfig, type TasksPluginLabels } from './context'\nimport type { TasksDataProvider } from './data/types'\nimport type { TaskPriority } from './types'\nimport { createMockTasksProvider } from './data/mock'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { createSupabaseTasksProvider } from './data/supabase'\nimport { createTasksStore } from './store'\nimport { tasksLocales } from './locales'\nimport { tasksRegistries } from './data/registries'\nimport { TasksGeneralSettings } from './components/TasksGeneralSettings'\nimport { TasksTopbarButton } from './components/TasksTopbarButton'\nimport { registerNotesTasksAdapter, NOTE_LABEL_PREFIX } from '@fayz-ai/admin'\nimport { MIGRATION_000_PLG_RENAME, MIGRATION_001_TASKS_BASE } from './migrations'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginOptions {\n /** Label overrides */\n labels?: Partial<TasksPluginLabels>\n /** Plugin scope */\n scope?: PluginScope\n /** Vertical ID */\n verticalId?: VerticalId\n /** Data provider override (defaults to safe auto-selection) */\n dataProvider?: TasksDataProvider\n /** Default priority for new tasks (default: 'medium') */\n defaultPriority?: TaskPriority\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: TasksPluginLabels = {\n drawerTitle: 'Tasks',\n settingsTitle: 'Tasks',\n quickAddPlaceholder: 'Add a task...',\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: TasksPluginOptions): ResolvedTasksConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n}\n\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createTasksPlugin(options?: TasksPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Register locales globally so the plugin's translations resolve even when the\n // host shell does not mount @fayz-ai/core's I18nProvider (incremental de-bridge).\n registerTranslations(tasksLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseTasksProvider(),\n () => createMockTasksProvider(),\n )\n const store = createTasksStore(provider)\n\n // Notes ↔ Tasks bridge: note todos are real tasks, linked by a `note:<id>`\n // label. The shell's Notes tab consumes this; the Tarefas tab (and its\n // summary badge) stays the single source of truth.\n registerNotesTasksAdapter({\n async createTodo({ title, noteId, noteTitle }) {\n const task = await provider.createTask({\n title,\n description: noteTitle ? `Nota: ${noteTitle}` : undefined,\n labels: [`${NOTE_LABEL_PREFIX}${noteId}`],\n })\n void store.getState().fetchSummary()\n return { id: task.id, title: task.title, done: task.status === 'done' }\n },\n async listTodos(noteId) {\n const tasks = await provider.getTasks({})\n const label = `${NOTE_LABEL_PREFIX}${noteId}`\n return tasks\n .filter((t) => t.labels.includes(label))\n .sort((a, b) => (a.status === 'done' ? 1 : 0) - (b.status === 'done' ? 1 : 0))\n .map((t) => ({ id: t.id, title: t.title, done: t.status === 'done' }))\n },\n async toggleTodo(id: string, done: boolean) {\n await provider.updateTask(id, { status: done ? 'done' : 'todo' })\n void store.getState().fetchSummary()\n },\n async removeTodo(id: string) {\n await provider.deleteTask(id)\n void store.getState().fetchSummary()\n },\n })\n\n return {\n id: 'tasks',\n name: config.labels.drawerTitle,\n icon: 'CheckSquare',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n\n navigation: [],\n\n routes: [],\n\n widgets: [\n {\n id: 'tasks-topbar-button',\n zone: 'shell.topbar.end',\n component: TasksTopbarButton as unknown as React.ComponentType<unknown>,\n order: 10,\n props: {\n tasksConfig: config,\n tasksProvider: provider,\n tasksStore: store,\n },\n },\n ],\n\n aiTools: [\n {\n id: 'tasks.summary',\n name: 'getTasksSummary',\n description: 'Returns a summary of pending tasks: total, overdue, due today, by status and priority.',\n icon: 'CheckSquare',\n mode: 'read' as const,\n category: 'Tasks',\n parameters: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'string' as const,\n description: 'Filter by task status',\n enum: ['todo', 'in_progress', 'done', 'cancelled', 'all'],\n },\n },\n },\n suggestions: [\n { label: 'What tasks are overdue?' },\n { label: 'How many tasks are pending?' },\n { label: \"What's due today?\" },\n ],\n },\n ],\n\n registries: tasksRegistries,\n\n settings: [\n {\n id: 'tasks',\n label: config.labels.settingsTitle,\n icon: 'CheckSquare',\n component: (() => {\n const Tab: React.FC = () =>\n React.createElement(TasksContextProvider, { config, provider, store },\n React.createElement(TasksGeneralSettings),\n )\n Tab.displayName = 'TasksSettingsTab'\n return Tab as unknown as React.ComponentType<unknown>\n })(),\n order: 14,\n },\n ],\n\n migrations: [\n {\n id: 'tasks-000-plg-rename',\n version: '1.0.0',\n sql: MIGRATION_000_PLG_RENAME,\n description: 'Rename legacy tsk_* tables to plg_tasks_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)',\n },\n {\n id: 'tasks-001-base-tables',\n version: '1.0.0',\n sql: MIGRATION_001_TASKS_BASE,\n description: 'Create plg_tasks_tasks and plg_tasks_labels',\n },\n ],\n\n locales: tasksLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { TasksDataProvider } from './data/types'\nexport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nexport type {\n Task, TaskLabel, TaskStatus, TaskPriority, TasksSummary,\n CreateTaskInput, UpdateTaskInput, TaskQuery,\n} from './types'\n"]}
1
+ {"version":3,"sources":["../src/context.tsx","../src/data/mock.ts","../src/data/tables.ts","../src/data/supabase.ts","../src/store.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/registries.ts","../src/components/TasksGeneralSettings.tsx","../src/components/TasksFilterBar.tsx","../src/components/TaskQuickAdd.tsx","../src/components/TaskPriorityBadge.tsx","../src/components/TaskLabelBadge.tsx","../src/components/TaskCard.tsx","../src/components/TaskStatusGroup.tsx","../src/types.ts","../src/components/TaskDetail.tsx","../src/components/TasksPanel.tsx","../src/components/TasksDrawer.tsx","../src/components/TasksLauncher.tsx","../src/migrations/index.ts","../src/index.ts"],"names":["today","useTranslation","jsx","jsxs","useState","useCallback","ChevronDown","Calendar","React","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { createPluginContext } from '@fayz-ai/admin'\nimport type { TasksDataProvider } from './data/types'\nimport type { TasksUIState } from './store'\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginLabels {\n drawerTitle: string\n settingsTitle: string\n quickAddPlaceholder: string\n}\n\nexport interface ResolvedTasksConfig {\n labels: TasksPluginLabels\n}\n\nconst ctx = createPluginContext<ResolvedTasksConfig, TasksDataProvider, TasksUIState>('TasksContextProvider')\n\nexport const TasksContextProvider = ctx.ContextProvider\nexport const useTasksConfig = ctx.useConfig\nexport const useTasksProvider = ctx.useProvider\nexport const useTasksStore = ctx.useStore\n","import type { TasksDataProvider } from './types'\nimport type {\n Task, TaskLabel, CreateTaskInput, UpdateTaskInput,\n TaskQuery, TasksSummary, TaskStatus,\n} from '../types'\n\nfunction uid(): string { return crypto.randomUUID?.() ?? String(Date.now()) }\nfunction now(): string { return new Date().toISOString() }\nfunction today(): string { return new Date().toISOString().slice(0, 10) }\n\nconst SEED_LABELS: TaskLabel[] = [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true, tenantId: 'mock', createdAt: now() },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true, tenantId: 'mock', createdAt: now() },\n]\n\nfunction makeSeedTasks(): Task[] {\n const base = {\n tenantId: 'mock',\n description: null,\n assignedToId: null,\n assignedToName: null,\n parentId: null,\n labels: [],\n createdById: null,\n createdByName: null,\n createdAt: now(),\n updatedAt: now(),\n }\n return [\n { ...base, id: uid(), title: 'Setup payment gateway', status: 'todo' as const, priority: 'high' as const, dueDate: today(), position: 0 },\n { ...base, id: uid(), title: 'Update menu photos', status: 'todo' as const, priority: 'medium' as const, dueDate: null, position: 1 },\n { ...base, id: uid(), title: 'Review monthly report', status: 'in_progress' as const, priority: 'medium' as const, dueDate: null, position: 0 },\n { ...base, id: uid(), title: 'Fix login bug', status: 'in_progress' as const, priority: 'urgent' as const, dueDate: today(), position: 1, labels: ['lbl-bug'] },\n { ...base, id: uid(), title: 'Onboard new employee', status: 'done' as const, priority: 'low' as const, dueDate: null, position: 0 },\n ]\n}\n\nfunction matchesQuery(task: Task, query: TaskQuery): boolean {\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n if (!statuses.includes(task.status)) return false\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n if (!priorities.includes(task.priority)) return false\n }\n if (query.assignedToId && task.assignedToId !== query.assignedToId) return false\n if (query.parentId !== undefined) {\n if (query.parentId === null && task.parentId !== null) return false\n if (query.parentId !== null && task.parentId !== query.parentId) return false\n }\n if (query.search) {\n const s = query.search.toLowerCase()\n if (!task.title.toLowerCase().includes(s)) return false\n }\n if (query.overdue && task.dueDate) {\n if (task.dueDate >= today()) return false\n }\n return true\n}\n\nexport function createMockTasksProvider(): TasksDataProvider {\n let tasks = makeSeedTasks()\n const labels = [...SEED_LABELS]\n\n return {\n async getTasks(query) {\n return tasks.filter((t) => matchesQuery(t, query)).sort((a, b) => a.position - b.position)\n },\n\n async getTaskById(id) {\n return tasks.find((t) => t.id === id) ?? null\n },\n\n async getSubtasks(parentId) {\n return tasks.filter((t) => t.parentId === parentId).sort((a, b) => a.position - b.position)\n },\n\n async createTask(input: CreateTaskInput) {\n const statusTasks = tasks.filter((t) => t.status === (input.status ?? 'todo') && t.parentId === (input.parentId ?? null))\n const maxPos = statusTasks.reduce((max, t) => Math.max(max, t.position), -1)\n const task: Task = {\n id: uid(),\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n dueDate: input.dueDate ?? null,\n assignedToId: input.assignedToId ?? null,\n assignedToName: null,\n parentId: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n createdById: null,\n createdByName: null,\n tenantId: 'mock',\n createdAt: now(),\n updatedAt: now(),\n }\n tasks.push(task)\n return task\n },\n\n async updateTask(id, input: UpdateTaskInput) {\n const idx = tasks.findIndex((t) => t.id === id)\n if (idx === -1) throw new Error('Task not found')\n tasks[idx] = { ...tasks[idx], ...input, updatedAt: now() } as Task\n return tasks[idx]\n },\n\n async deleteTask(id) {\n tasks = tasks.filter((t) => t.id !== id && t.parentId !== id)\n },\n\n async reorderTask(id, newPosition, status) {\n const task = tasks.find((t) => t.id === id)\n if (!task) return\n task.status = status\n task.position = newPosition\n task.updatedAt = now()\n },\n\n async getLabels() {\n return labels.filter((l) => l.isActive)\n },\n\n async getSummary() {\n const topLevel = tasks.filter((t) => t.parentId === null)\n const d = today()\n return {\n total: topLevel.length,\n todo: topLevel.filter((t) => t.status === 'todo').length,\n inProgress: topLevel.filter((t) => t.status === 'in_progress').length,\n done: topLevel.filter((t) => t.status === 'done').length,\n overdue: topLevel.filter((t) => t.dueDate != null && t.dueDate < d && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: topLevel.filter((t) => t.dueDate === d && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: topLevel.filter((t) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","// Physical table names for the tasks plugin (plg_tasks_* prefix). Import T and\n// reference T.<key> in the data provider so a rename lands in exactly one place.\nexport const T = {\n tasks: 'plg_tasks_tasks',\n labels: 'plg_tasks_labels',\n} as const\n","import type { TasksDataProvider } from './types'\nimport type { Task, TaskLabel, TasksSummary, TaskStatus } from '../types'\nimport { getSupabaseClientOptional, getActiveTenantId } from '@fayz-ai/core'\nimport { getTasksTenantId } from '../lib/tenant'\nimport { T } from './tables'\n\nfunction getTenantId(): string | undefined {\n // Local override wins; else use the app's active tenant so writes pass RLS.\n return getTasksTenantId() ?? getActiveTenantId()\n}\n\nfunction getClient() {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('Supabase not initialized')\n return supabase\n}\n\nfunction snakeToCamel(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n result[key.replace(/_([a-z])/g, (_, c) => c.toUpperCase())] = value\n }\n return result\n}\n\nfunction toTask(row: Record<string, unknown>): Task {\n const t = snakeToCamel(row) as unknown as Task\n // Ensure labels is always an array\n if (!Array.isArray(t.labels)) t.labels = []\n return t\n}\n\nexport function createSupabaseTasksProvider(): TasksDataProvider {\n return {\n async getTasks(query) {\n const tenantId = getTenantId()\n if (!tenantId) return []\n let q = getClient()\n .from(T.tasks)\n .select('*')\n .eq('tenant_id', tenantId)\n\n if (query.parentId === null) {\n q = q.is('parent_id', null)\n } else if (query.parentId) {\n q = q.eq('parent_id', query.parentId)\n }\n\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n q = q.in('status', statuses)\n }\n if (query.priority) {\n const priorities = Array.isArray(query.priority) ? query.priority : [query.priority]\n q = q.in('priority', priorities)\n }\n if (query.assignedToId) {\n q = q.eq('assigned_to_id', query.assignedToId)\n }\n if (query.search) {\n q = q.ilike('title', `%${query.search}%`)\n }\n if (query.overdue) {\n q = q.lt('due_date', new Date().toISOString().slice(0, 10))\n .not('status', 'in', '(\"done\",\"cancelled\")')\n }\n\n q = q.order('position', { ascending: true }).order('created_at', { ascending: false })\n\n const { data } = await q\n return (data ?? []).map(toTask)\n },\n\n async getTaskById(id) {\n const { data } = await getClient()\n .from(T.tasks)\n .select('*')\n .eq('id', id)\n .maybeSingle()\n return data ? toTask(data) : null\n },\n\n async getSubtasks(parentId) {\n const { data } = await getClient()\n .from(T.tasks)\n .select('*')\n .eq('parent_id', parentId)\n .order('position', { ascending: true })\n return (data ?? []).map(toTask)\n },\n\n async createTask(input) {\n const tenantId = getTenantId()\n if (!tenantId) throw new Error('No active tenant')\n\n // Get max position for the status group\n const { data: maxData } = await getClient()\n .from(T.tasks)\n .select('position')\n .eq('tenant_id', tenantId)\n .eq('status', input.status ?? 'todo')\n .is('parent_id', input.parentId ?? null)\n .order('position', { ascending: false })\n .limit(1)\n const maxPos = maxData?.[0]?.position ?? -1\n\n const { data, error } = await getClient()\n .from(T.tasks)\n .insert({\n tenant_id: tenantId,\n title: input.title,\n description: input.description ?? null,\n status: input.status ?? 'todo',\n priority: input.priority ?? 'medium',\n due_date: input.dueDate ?? null,\n assigned_to_id: input.assignedToId ?? null,\n parent_id: input.parentId ?? null,\n labels: input.labels ?? [],\n position: maxPos + 1,\n })\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async updateTask(id, input) {\n const payload: Record<string, unknown> = { updated_at: new Date().toISOString() }\n if (input.title !== undefined) payload.title = input.title\n if (input.description !== undefined) payload.description = input.description\n if (input.status !== undefined) payload.status = input.status\n if (input.priority !== undefined) payload.priority = input.priority\n if (input.dueDate !== undefined) payload.due_date = input.dueDate\n if (input.assignedToId !== undefined) payload.assigned_to_id = input.assignedToId\n if (input.labels !== undefined) payload.labels = input.labels\n if (input.position !== undefined) payload.position = input.position\n\n const { data, error } = await getClient()\n .from(T.tasks)\n .update(payload)\n .eq('id', id)\n .select('*')\n .single()\n if (error) throw error\n return toTask(data)\n },\n\n async deleteTask(id) {\n await getClient().from(T.tasks).delete().eq('id', id)\n },\n\n async reorderTask(id, newPosition, status) {\n await getClient()\n .from(T.tasks)\n .update({ position: newPosition, status, updated_at: new Date().toISOString() })\n .eq('id', id)\n },\n\n async getLabels() {\n const tenantId = getTenantId()\n if (!tenantId) return []\n const { data } = await getClient()\n .from(T.labels)\n .select('*')\n .eq('tenant_id', tenantId)\n .eq('is_active', true)\n .order('name')\n return (data ?? []).map((r: any) => snakeToCamel(r) as unknown as TaskLabel)\n },\n\n async getSummary() {\n const tenantId = getTenantId()\n if (!tenantId) return { total: 0, todo: 0, inProgress: 0, done: 0, overdue: 0, dueToday: 0, highPriority: 0 }\n\n const { data } = await getClient()\n .from(T.tasks)\n .select('status, priority, due_date')\n .eq('tenant_id', tenantId)\n .is('parent_id', null)\n\n const tasks = data ?? []\n const today = new Date().toISOString().slice(0, 10)\n return {\n total: tasks.length,\n todo: tasks.filter((t: any) => t.status === 'todo').length,\n inProgress: tasks.filter((t: any) => t.status === 'in_progress').length,\n done: tasks.filter((t: any) => t.status === 'done').length,\n overdue: tasks.filter((t: any) => t.due_date && t.due_date < today && t.status !== 'done' && t.status !== 'cancelled').length,\n dueToday: tasks.filter((t: any) => t.due_date === today && t.status !== 'done' && t.status !== 'cancelled').length,\n highPriority: tasks.filter((t: any) => (t.priority === 'high' || t.priority === 'urgent') && t.status !== 'done' && t.status !== 'cancelled').length,\n }\n },\n }\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport type { TasksDataProvider } from './data/types'\nimport type {\n Task, TaskLabel, TasksSummary, TaskQuery,\n CreateTaskInput, UpdateTaskInput, TaskStatus,\n} from './types'\n\nexport interface TasksUIState {\n // Data\n tasks: Task[]\n tasksLoading: boolean\n labels: TaskLabel[]\n summary: TasksSummary | null\n summaryLoading: boolean\n\n // Drawer UI\n drawerOpen: boolean\n selectedTaskId: string | null\n activeFilter: TaskStatus | 'all'\n\n // Actions — data\n fetchTasks(query?: TaskQuery): Promise<void>\n fetchLabels(): Promise<void>\n fetchSummary(): Promise<void>\n createTask(input: CreateTaskInput): Promise<Task>\n updateTask(id: string, input: UpdateTaskInput): Promise<Task>\n deleteTask(id: string): Promise<void>\n reorderTask(id: string, newPosition: number, status: TaskStatus): Promise<void>\n\n // Actions — UI\n openDrawer(): void\n closeDrawer(): void\n toggleDrawer(): void\n selectTask(id: string | null): void\n setFilter(filter: TaskStatus | 'all'): void\n}\n\nexport function createTasksStore(provider: TasksDataProvider): StoreApi<TasksUIState> {\n return createStore<TasksUIState>((set, get) => ({\n tasks: [],\n tasksLoading: false,\n labels: [],\n summary: null,\n summaryLoading: false,\n\n drawerOpen: false,\n selectedTaskId: null,\n activeFilter: 'all',\n\n // ----- Data actions -----\n\n async fetchTasks(query?: TaskQuery) {\n return dedup('tasks:list', async () => {\n set({ tasksLoading: true })\n try {\n const filter = get().activeFilter\n const q: TaskQuery = {\n parentId: null,\n ...query,\n ...(filter !== 'all' ? { status: filter } : {}),\n }\n const tasks = await provider.getTasks(q)\n set({ tasks, tasksLoading: false })\n } catch {\n set({ tasksLoading: false })\n }\n })\n },\n\n async fetchLabels() {\n return dedup('tasks:labels', async () => {\n try {\n const labels = await provider.getLabels()\n set({ labels })\n } catch { /* silent */ }\n })\n },\n\n async fetchSummary() {\n return dedup('tasks:summary', async () => {\n set({ summaryLoading: true })\n try {\n const summary = await provider.getSummary()\n set({ summary, summaryLoading: false })\n } catch {\n set({ summaryLoading: false })\n }\n })\n },\n\n async createTask(input) {\n const task = await provider.createTask(input)\n // Re-fetch to get correct ordering\n await get().fetchTasks()\n await get().fetchSummary()\n return task\n },\n\n async updateTask(id, input) {\n const task = await provider.updateTask(id, input)\n // Update in-place for snappy UI, then re-fetch\n set((s) => ({ tasks: s.tasks.map((t) => (t.id === id ? task : t)) }))\n await get().fetchSummary()\n return task\n },\n\n async deleteTask(id) {\n await provider.deleteTask(id)\n set((s) => ({ tasks: s.tasks.filter((t) => t.id !== id), selectedTaskId: null }))\n await get().fetchSummary()\n },\n\n async reorderTask(id, newPosition, status) {\n await provider.reorderTask(id, newPosition, status)\n await get().fetchTasks()\n },\n\n // ----- UI actions -----\n\n openDrawer() {\n set({ drawerOpen: true })\n // Refresh data when opening\n get().fetchTasks()\n get().fetchLabels()\n get().fetchSummary()\n },\n\n closeDrawer() {\n set({ drawerOpen: false, selectedTaskId: null })\n },\n\n toggleDrawer() {\n const { drawerOpen } = get()\n if (drawerOpen) get().closeDrawer()\n else get().openDrawer()\n },\n\n selectTask(id) {\n set({ selectedTaskId: id })\n },\n\n setFilter(filter) {\n set({ activeFilter: filter })\n get().fetchTasks()\n },\n }))\n}\n","export const en: Record<string, string> = {\n 'tasks.title': 'Tasks',\n 'tasks.drawer.title': 'Tasks',\n 'tasks.drawer.subtitle': 'Manage your team tasks',\n 'tasks.quickAdd.placeholder': 'Add a task...',\n 'tasks.filter.all': 'All',\n 'tasks.filter.todo': 'To Do',\n 'tasks.filter.inProgress': 'In Progress',\n 'tasks.filter.done': 'Done',\n 'tasks.status.todo': 'To Do',\n 'tasks.status.in_progress': 'In Progress',\n 'tasks.status.done': 'Done',\n 'tasks.status.cancelled': 'Cancelled',\n 'tasks.priority.low': 'Low',\n 'tasks.priority.medium': 'Medium',\n 'tasks.priority.high': 'High',\n 'tasks.priority.urgent': 'Urgent',\n 'tasks.detail.description': 'Description',\n 'tasks.detail.descriptionPlaceholder': 'Add a description...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Priority',\n 'tasks.detail.dueDate': 'Due Date',\n 'tasks.detail.assignee': 'Assigned To',\n 'tasks.detail.labels': 'Labels',\n 'tasks.detail.subtasks': 'Subtasks',\n 'tasks.detail.delete': 'Delete Task',\n 'tasks.detail.deleteConfirm': 'Are you sure you want to delete this task?',\n 'tasks.detail.created': 'Created',\n 'tasks.detail.chatWithAi': 'Chat with AI',\n 'tasks.detail.chatWithAi.prompt': 'Take over this task and help me resolve it now, using your tools when needed:',\n 'tasks.detail.updated': 'Updated',\n 'tasks.detail.addSubtask': 'Add subtask...',\n 'tasks.detail.back': 'Back to list',\n 'tasks.summary.overdue': 'overdue',\n 'tasks.summary.dueToday': 'due today',\n 'tasks.empty': 'No tasks yet',\n 'tasks.empty.description': 'Add your first task using the input above',\n 'tasks.settings.title': 'Tasks',\n 'tasks.settings.general': 'General',\n 'tasks.settings.defaultPriority': 'Default Priority',\n 'tasks.settings.autoAssign': 'Auto-assign tasks to creator',\n}\n","export const ptBR: Record<string, string> = {\n 'tasks.title': 'Tarefas',\n 'tasks.drawer.title': 'Tarefas',\n 'tasks.drawer.subtitle': 'Gerencie as tarefas da equipe',\n 'tasks.quickAdd.placeholder': 'Adicionar tarefa...',\n 'tasks.filter.all': 'Todas',\n 'tasks.filter.todo': 'A Fazer',\n 'tasks.filter.inProgress': 'Em Andamento',\n 'tasks.filter.done': 'Concluídas',\n 'tasks.status.todo': 'A Fazer',\n 'tasks.status.in_progress': 'Em Andamento',\n 'tasks.status.done': 'Concluída',\n 'tasks.status.cancelled': 'Cancelada',\n 'tasks.priority.low': 'Baixa',\n 'tasks.priority.medium': 'Média',\n 'tasks.priority.high': 'Alta',\n 'tasks.priority.urgent': 'Urgente',\n 'tasks.detail.description': 'Descrição',\n 'tasks.detail.descriptionPlaceholder': 'Adicionar descrição...',\n 'tasks.detail.status': 'Status',\n 'tasks.detail.priority': 'Prioridade',\n 'tasks.detail.dueDate': 'Data de Vencimento',\n 'tasks.detail.assignee': 'Responsável',\n 'tasks.detail.labels': 'Etiquetas',\n 'tasks.detail.subtasks': 'Subtarefas',\n 'tasks.detail.delete': 'Excluir Tarefa',\n 'tasks.detail.deleteConfirm': 'Tem certeza que deseja excluir esta tarefa?',\n 'tasks.detail.created': 'Criada em',\n 'tasks.detail.chatWithAi': 'Conversar com IA',\n 'tasks.detail.chatWithAi.prompt': 'Assuma esta tarefa e me ajude a resolver agora, usando suas ferramentas quando precisar:',\n 'tasks.detail.updated': 'Atualizada em',\n 'tasks.detail.addSubtask': 'Adicionar subtarefa...',\n 'tasks.detail.back': 'Voltar à lista',\n 'tasks.summary.overdue': 'atrasadas',\n 'tasks.summary.dueToday': 'vencem hoje',\n 'tasks.empty': 'Nenhuma tarefa ainda',\n 'tasks.empty.description': 'Adicione sua primeira tarefa usando o campo acima',\n 'tasks.settings.title': 'Tarefas',\n 'tasks.settings.general': 'Geral',\n 'tasks.settings.defaultPriority': 'Prioridade Padrão',\n 'tasks.settings.autoAssign': 'Atribuir tarefas automaticamente ao criador',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const tasksLocales: Record<string, Record<string, string>> = {\n en,\n 'pt-BR': ptBR,\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\nimport { T } from './tables'\n\nconst taskLabelEntity: EntityDef = {\n name: 'Task Label',\n namePlural: 'Task Labels',\n icon: 'Tag',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'color', label: 'Color', type: 'text', showInTable: true, defaultValue: '#6366f1' },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: T.labels, tenantScoped: true },\n}\n\nexport const tasksRegistries: PluginRegistryDef[] = [\n {\n id: 'task-labels',\n entity: taskLabelEntity,\n icon: 'Tag',\n description: 'Labels for categorizing tasks',\n display: 'table',\n seedData: [\n { id: 'lbl-bug', name: 'Bug', color: '#ef4444', isActive: true },\n { id: 'lbl-feature', name: 'Feature', color: '#3b82f6', isActive: true },\n { id: 'lbl-urgent', name: 'Urgent', color: '#f59e0b', isActive: true },\n { id: 'lbl-personal', name: 'Personal', color: '#8b5cf6', isActive: true },\n ],\n },\n]\n","import React from 'react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useTenantPluginSettings } from '@fayz-ai/admin'\n\n// Per-tenant defaults = the value that used to be the hardcoded `selected` option.\n// Persisted + re-hydrated per tenant; behavioural consumption is a follow-up.\nconst TASKS_DEFAULTS = {\n defaultPriority: 'medium',\n}\n\nexport function TasksGeneralSettings() {\n const t = useTranslation()\n const s = useTenantPluginSettings('tasks', TASKS_DEFAULTS)\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3 className=\"text-sm font-semibold mb-1\">{t('tasks.settings.general')}</h3>\n <p className=\"text-xs text-muted-foreground mb-3\">\n {t('tasks.drawer.subtitle')}\n </p>\n </div>\n\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium\">{t('tasks.settings.defaultPriority')}</label>\n <select\n className=\"w-full max-w-xs rounded-input border border-input bg-card shadow-[inset_0_1px_0_rgb(0_0_0_/0.06)] px-3 py-2 text-sm\"\n value={s.get('defaultPriority')}\n onChange={(e) => s.set('defaultPriority', e.target.value)}\n >\n <option value=\"low\">{t('tasks.priority.low')}</option>\n <option value=\"medium\">{t('tasks.priority.medium')}</option>\n <option value=\"high\">{t('tasks.priority.high')}</option>\n <option value=\"urgent\">{t('tasks.priority.urgent')}</option>\n </select>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskStatus } from '../types'\n\nconst FILTERS: Array<{ key: TaskStatus | 'all'; labelKey: string }> = [\n { key: 'all', labelKey: 'tasks.filter.all' },\n { key: 'todo', labelKey: 'tasks.filter.todo' },\n { key: 'in_progress', labelKey: 'tasks.filter.inProgress' },\n { key: 'done', labelKey: 'tasks.filter.done' },\n]\n\nexport function TasksFilterBar() {\n const t = useTranslation()\n const activeFilter = useTasksStore((s) => s.activeFilter)\n const setFilter = useTasksStore((s) => s.setFilter)\n const summary = useTasksStore((s) => s.summary)\n\n const getCount = (key: TaskStatus | 'all'): number | undefined => {\n if (!summary) return undefined\n switch (key) {\n case 'all': return summary.total\n case 'todo': return summary.todo\n case 'in_progress': return summary.inProgress\n case 'done': return summary.done\n default: return undefined\n }\n }\n\n return (\n <div className=\"flex items-center gap-1 px-3 py-2 border-b overflow-x-auto\">\n {FILTERS.map(({ key, labelKey }) => {\n const active = activeFilter === key\n const count = getCount(key)\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => setFilter(key)}\n className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-medium transition-colors whitespace-nowrap ${\n active\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {t(labelKey)}\n {count != null && (\n <span className={`text-[10px] ${active ? 'text-primary-foreground/80' : 'text-muted-foreground'}`}>\n {count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","import React, { useState, useCallback } from 'react'\nimport { Plus } from 'lucide-react'\nimport { useTasksStore, useTasksConfig } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport type { TaskPriority } from '../types'\n\nexport function TaskQuickAdd({ parentId }: { parentId?: string | null }) {\n const t = useTranslation()\n const createTask = useTasksStore((s) => s.createTask)\n const [title, setTitle] = useState('')\n const [loading, setLoading] = useState(false)\n\n const handleSubmit = useCallback(async (e: React.FormEvent) => {\n e.preventDefault()\n const trimmed = title.trim()\n if (!trimmed || loading) return\n setLoading(true)\n try {\n await createTask({\n title: trimmed,\n parentId: parentId ?? null,\n })\n setTitle('')\n } finally {\n setLoading(false)\n }\n }, [title, loading, createTask, parentId])\n\n return (\n <form onSubmit={handleSubmit} className=\"flex items-center gap-2 px-3 py-2 border-b\">\n <Plus className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={parentId ? t('tasks.detail.addSubtask') : t('tasks.quickAdd.placeholder')}\n className=\"flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground/60\"\n disabled={loading}\n />\n </form>\n )\n}\n","import React from 'react'\nimport { AlertTriangle, ArrowUp, ArrowDown, Minus } from 'lucide-react'\nimport type { TaskPriority } from '../types'\n\nconst PRIORITY_CONFIG: Record<TaskPriority, { color: string; bg: string; icon: React.ComponentType<{ className?: string }> }> = {\n low: { color: 'text-muted-foreground', bg: 'bg-muted', icon: ArrowDown },\n medium: { color: 'text-info-soft-foreground', bg: 'bg-info-soft', icon: Minus },\n high: { color: 'text-warning-soft-foreground', bg: 'bg-warning-soft', icon: ArrowUp },\n urgent: { color: 'text-destructive-soft-foreground', bg: 'bg-destructive-soft', icon: AlertTriangle },\n}\n\nexport function TaskPriorityBadge({ priority, showLabel }: { priority: TaskPriority; showLabel?: boolean }) {\n const cfg = PRIORITY_CONFIG[priority]\n const Icon = cfg.icon\n return (\n <span className={`inline-flex items-center gap-1 rounded px-1.5 py-0.5 text-xs font-medium ${cfg.color} ${cfg.bg}`}>\n <Icon className=\"h-3 w-3\" />\n {showLabel && <span className=\"capitalize\">{priority}</span>}\n </span>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\n\nexport function TaskLabelBadge({ labelId }: { labelId: string }) {\n const labels = useTasksStore((s) => s.labels)\n const label = labels.find((l) => l.id === labelId)\n if (!label) return null\n\n return (\n <span\n className=\"inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium leading-none\"\n style={{\n backgroundColor: label.color + '20',\n color: label.color,\n }}\n >\n {label.name}\n </span>\n )\n}\n\nexport function TaskLabelBadges({ labelIds, max = 2 }: { labelIds: string[]; max?: number }) {\n if (labelIds.length === 0) return null\n const visible = labelIds.slice(0, max)\n const overflow = labelIds.length - max\n\n return (\n <span className=\"inline-flex items-center gap-1\">\n {visible.map((id) => (\n <TaskLabelBadge key={id} labelId={id} />\n ))}\n {overflow > 0 && (\n <span className=\"text-[10px] text-muted-foreground\">+{overflow}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { Calendar, ListChecks } from 'lucide-react'\nimport { Checkbox } from '@fayz-ai/ui'\nimport { useTasksStore } from '../context'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport type { Task } from '../types'\n\nfunction isOverdue(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate < new Date().toISOString().slice(0, 10)\n}\n\nfunction isToday(dueDate: string | null): boolean {\n if (!dueDate) return false\n return dueDate === new Date().toISOString().slice(0, 10)\n}\n\nfunction formatDueDate(dueDate: string): string {\n const d = new Date(dueDate + 'T00:00:00')\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })\n}\n\nexport function TaskCard({ task, subtaskCount }: { task: Task; subtaskCount?: { done: number; total: number } }) {\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n\n const isDone = task.status === 'done'\n const overdue = !isDone && isOverdue(task.dueDate)\n const dueToday = !isDone && isToday(task.dueDate)\n\n const handleCheck = (e: React.MouseEvent) => {\n e.stopPropagation()\n updateTask(task.id, { status: isDone ? 'todo' : 'done' })\n }\n\n return (\n <div\n onClick={() => selectTask(task.id)}\n className=\"group flex items-start gap-2.5 rounded-lg border border-transparent px-3 py-2.5 transition-colors hover:bg-muted bg-card shadow-button active:shadow-button-inset hover:border-border cursor-pointer\"\n >\n <div className=\"pt-0.5\" onClick={handleCheck}>\n <Checkbox checked={isDone} onChange={() => {}} />\n </div>\n\n <div className=\"min-w-0 flex-1 space-y-1\">\n <p className={`text-sm leading-snug ${isDone ? 'line-through text-muted-foreground' : ''}`}>\n {task.title}\n </p>\n\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <TaskPriorityBadge priority={task.priority} />\n\n {task.dueDate && (\n <span className={`inline-flex items-center gap-1 text-[11px] ${\n overdue ? 'text-destructive font-medium' : dueToday ? 'text-warning font-medium' : 'text-muted-foreground'\n }`}>\n <Calendar className=\"h-3 w-3\" />\n {formatDueDate(task.dueDate)}\n </span>\n )}\n\n {subtaskCount && subtaskCount.total > 0 && (\n <span className=\"inline-flex items-center gap-1 text-[11px] text-muted-foreground\">\n <ListChecks className=\"h-3 w-3\" />\n {subtaskCount.done}/{subtaskCount.total}\n </span>\n )}\n\n <TaskLabelBadges labelIds={task.labels} max={2} />\n </div>\n </div>\n\n {task.assignedToName && (\n <div className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-primary/10 text-[10px] font-medium text-primary\" title={task.assignedToName}>\n {task.assignedToName.split(' ').map((n) => n[0]).join('').slice(0, 2).toUpperCase()}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus } from '../types'\n\nconst STATUS_COLORS: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\nexport function TaskStatusGroup({ status, tasks }: { status: TaskStatus; tasks: Task[] }) {\n const t = useTranslation()\n const [collapsed, setCollapsed] = useState(status === 'cancelled')\n\n if (tasks.length === 0) return null\n\n const Chevron = collapsed ? ChevronRight : ChevronDown\n\n return (\n <div className=\"space-y-0.5\">\n <button\n type=\"button\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider hover:text-foreground transition-colors\"\n >\n <span className={`h-2 w-2 rounded-full ${STATUS_COLORS[status]}`} />\n <span>{t(`tasks.status.${status}`)}</span>\n <span className=\"text-[10px] font-normal\">({tasks.length})</span>\n <Chevron className=\"ml-auto h-3.5 w-3.5\" />\n </button>\n\n {!collapsed && (\n <div>\n {tasks.map((task) => (\n <TaskCard key={task.id} task={task} />\n ))}\n </div>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Tasks Plugin — Domain Types\n// ---------------------------------------------------------------------------\n\nexport type TaskStatus = 'todo' | 'in_progress' | 'done' | 'cancelled'\nexport type TaskPriority = 'low' | 'medium' | 'high' | 'urgent'\n\nexport const TASK_STATUSES: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\nexport const TASK_PRIORITIES: TaskPriority[] = ['low', 'medium', 'high', 'urgent']\n\n// ---------------------------------------------------------------------------\n// Core entities\n// ---------------------------------------------------------------------------\n\nexport interface Task {\n id: string\n title: string\n description: string | null\n status: TaskStatus\n priority: TaskPriority\n dueDate: string | null\n assignedToId: string | null\n assignedToName: string | null\n parentId: string | null\n labels: string[]\n position: number\n createdById: string | null\n createdByName: string | null\n tenantId: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface TaskLabel {\n id: string\n name: string\n color: string\n isActive: boolean\n tenantId: string\n createdAt: string\n}\n\n// ---------------------------------------------------------------------------\n// Input types\n// ---------------------------------------------------------------------------\n\nexport interface CreateTaskInput {\n title: string\n description?: string\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n parentId?: string | null\n labels?: string[]\n}\n\nexport interface UpdateTaskInput {\n title?: string\n description?: string | null\n status?: TaskStatus\n priority?: TaskPriority\n dueDate?: string | null\n assignedToId?: string | null\n labels?: string[]\n position?: number\n}\n\n// ---------------------------------------------------------------------------\n// Query types\n// ---------------------------------------------------------------------------\n\nexport interface TaskQuery {\n status?: TaskStatus | TaskStatus[]\n priority?: TaskPriority | TaskPriority[]\n assignedToId?: string\n parentId?: string | null\n search?: string\n overdue?: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Aggregation\n// ---------------------------------------------------------------------------\n\nexport interface TasksSummary {\n total: number\n todo: number\n inProgress: number\n done: number\n overdue: number\n dueToday: number\n highPriority: number\n}\n","import React, { useState, useEffect, useCallback } from 'react'\nimport { ArrowLeft, Trash2, Calendar, ChevronDown, Sparkles } from 'lucide-react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { useDelegateToAssistant } from '@fayz-ai/admin'\nimport { TaskPriorityBadge } from './TaskPriorityBadge'\nimport { TaskLabelBadges } from './TaskLabelBadge'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport type { Task, TaskStatus, TaskPriority } from '../types'\nimport { TASK_STATUSES, TASK_PRIORITIES } from '../types'\n\nconst STATUS_DOT: Record<TaskStatus, string> = {\n todo: 'bg-muted-foreground',\n in_progress: 'bg-info',\n done: 'bg-success',\n cancelled: 'bg-muted-foreground/60',\n}\n\n/** Same footer format as the Notes tab: time when today, short date otherwise. */\nfunction formatDateTime(iso: string): string {\n const d = new Date(iso)\n const sameDay = d.toDateString() === new Date().toDateString()\n return sameDay\n ? d.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n : d.toLocaleDateString(undefined, { day: '2-digit', month: '2-digit', year: '2-digit' })\n}\n\nexport function TaskDetail({ taskId }: { taskId: string }) {\n const t = useTranslation()\n const tasks = useTasksStore((s) => s.tasks)\n const selectTask = useTasksStore((s) => s.selectTask)\n const updateTask = useTasksStore((s) => s.updateTask)\n const deleteTask = useTasksStore((s) => s.deleteTask)\n\n const task = tasks.find((tt) => tt.id === taskId)\n const delegate = useDelegateToAssistant()\n\n const [title, setTitle] = useState('')\n const [description, setDescription] = useState('')\n const [subtasks, setSubtasks] = useState<Task[]>([])\n\n useEffect(() => {\n if (task) {\n setTitle(task.title)\n setDescription(task.description ?? '')\n }\n }, [task])\n\n useEffect(() => { setSubtasks([]) }, [taskId])\n\n const handleTitleBlur = useCallback(() => {\n if (task && title.trim() && title !== task.title) {\n updateTask(task.id, { title: title.trim() })\n }\n }, [task, title, updateTask])\n\n const handleDescriptionBlur = useCallback(() => {\n if (task && description !== (task.description ?? '')) {\n updateTask(task.id, { description: description || null })\n }\n }, [task, description, updateTask])\n\n const handleDelete = useCallback(() => {\n if (task && confirm(t('tasks.detail.deleteConfirm'))) {\n deleteTask(task.id)\n }\n }, [task, deleteTask, t])\n\n if (!task) {\n return (\n <div className=\"flex flex-col items-center justify-center py-8 text-muted-foreground\">\n <p className=\"text-sm\">Task not found</p>\n <button type=\"button\" onClick={() => selectTask(null)} className=\"mt-2 text-xs text-primary hover:underline\">\n {t('tasks.detail.back')}\n </button>\n </div>\n )\n }\n\n return (\n // Same frame as the Notes editor: header row with back + icon actions,\n // full-bleed px-4 content, sectioned by hairlines, thin timestamp footer.\n <div className=\"flex min-h-full flex-col\">\n <div className=\"flex items-center gap-1 border-b border-border/40 px-2 py-1.5\">\n <button\n type=\"button\"\n onClick={() => selectTask(null)}\n className=\"inline-flex items-center gap-1 rounded-lg px-1.5 py-1 text-[11.5px] text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5\" />\n {t('tasks.drawer.title')}\n </button>\n <span className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={handleDelete}\n aria-label={t('tasks.detail.delete')}\n title={t('tasks.detail.delete')}\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n <input\n type=\"text\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onBlur={handleTitleBlur}\n onKeyDown={(e) => { if (e.key === 'Enter') e.currentTarget.blur() }}\n className=\"bg-transparent px-4 pt-3 text-sm font-semibold text-foreground outline-none\"\n />\n\n {/* Inline property chips */}\n <div className=\"flex flex-wrap items-center gap-1.5 px-4 pt-2\">\n {/* Status chip */}\n <div className=\"relative\">\n <select\n value={task.status}\n onChange={(e) => updateTask(task.id, { status: e.target.value as TaskStatus })}\n className=\"appearance-none rounded-full border bg-background pl-5 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_STATUSES.map((s) => (\n <option key={s} value={s}>{t(`tasks.status.${s}`)}</option>\n ))}\n </select>\n <span className={`absolute left-2 top-1/2 -translate-y-1/2 h-2 w-2 rounded-full ${STATUS_DOT[task.status]}`} />\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Priority chip */}\n <div className=\"relative\">\n <select\n value={task.priority}\n onChange={(e) => updateTask(task.id, { priority: e.target.value as TaskPriority })}\n className=\"appearance-none rounded-full border bg-background pl-2 pr-6 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors\"\n >\n {TASK_PRIORITIES.map((p) => (\n <option key={p} value={p}>{t(`tasks.priority.${p}`)}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-1.5 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Due date chip */}\n <div className=\"relative\">\n <input\n type=\"date\"\n value={task.dueDate ?? ''}\n onChange={(e) => updateTask(task.id, { dueDate: e.target.value || null })}\n className=\"appearance-none rounded-full border bg-background pl-6 pr-2 py-1 text-xs font-medium cursor-pointer hover:border-primary/40 transition-colors w-[120px]\"\n />\n <Calendar className=\"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none\" />\n </div>\n\n {/* Labels */}\n {task.labels.length > 0 && <TaskLabelBadges labelIds={task.labels} max={3} />}\n </div>\n\n {/* Description — borderless, fills the middle like the note body */}\n <textarea\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n onBlur={handleDescriptionBlur}\n placeholder={t('tasks.detail.descriptionPlaceholder')}\n className=\"min-h-[72px] flex-1 resize-none bg-transparent px-4 py-3 text-sm leading-relaxed text-foreground outline-none placeholder:text-muted-foreground/60\"\n />\n\n {/* Agentic hand-off — same CTA pattern as the Notes tab */}\n <div className=\"px-4 pb-2\">\n <button\n type=\"button\"\n onClick={() =>\n delegate(\n `${t('tasks.detail.chatWithAi.prompt')}\\n\\n\"${task.title}\"${task.description ? `\\n${task.description}` : ''}${task.dueDate ? `\\n(${t('tasks.detail.dueDate')}: ${task.dueDate})` : ''}`,\n )\n }\n className=\"group flex w-full items-center justify-center gap-2 rounded-xl bg-gradient-to-r from-primary via-primary/80 to-primary bg-[length:200%_100%] bg-left px-3 py-2 text-[13px] font-semibold text-primary-foreground shadow-sm transition-all duration-500 hover:bg-right hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Sparkles className=\"h-4 w-4 transition-transform duration-300 group-hover:rotate-12\" />\n {t('tasks.detail.chatWithAi')}\n </button>\n </div>\n\n {/* Subtasks — same section pattern as the note's todos */}\n <div className=\"border-t border-border/40 px-4 py-2.5\">\n <p className=\"pb-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n {t('tasks.detail.subtasks')}{subtasks.length > 0 ? ` · ${subtasks.length}` : ''}\n </p>\n <div className=\"-mx-3\">\n <TaskQuickAdd parentId={task.id} />\n </div>\n {subtasks.length > 0 && (\n <div className=\"divide-y divide-border/40\">\n {subtasks.map((st) => (\n <TaskCard key={st.id} task={st} />\n ))}\n </div>\n )}\n </div>\n\n {/* Footer: timestamps only — delete lives in the header, like a note */}\n <p className=\"border-t border-border/40 px-4 py-1.5 text-[10px] text-muted-foreground/60\">\n {t('tasks.detail.created')} {formatDateTime(task.createdAt)} · {t('tasks.detail.updated')} {formatDateTime(task.updatedAt)}\n </p>\n </div>\n )\n}\n","import React from 'react'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksFilterBar } from './TasksFilterBar'\nimport { TaskQuickAdd } from './TaskQuickAdd'\nimport { TaskCard } from './TaskCard'\nimport { TaskStatusGroup } from './TaskStatusGroup'\nimport { TaskDetail } from './TaskDetail'\nimport { ClipboardList } from 'lucide-react'\nimport type { TaskStatus } from '../types'\n\nconst STATUS_ORDER: TaskStatus[] = ['todo', 'in_progress', 'done', 'cancelled']\n\n/** The task list with no box around it — shared by the sheet and the shell's\n * right-rail tab. */\nexport function TasksPanel() {\n const t = useTranslation()\n const selectedTaskId = useTasksStore((s) => s.selectedTaskId)\n const tasks = useTasksStore((s) => s.tasks)\n const tasksLoading = useTasksStore((s) => s.tasksLoading)\n const activeFilter = useTasksStore((s) => s.activeFilter)\n const fetchTasks = useTasksStore((s) => s.fetchTasks)\n const fetchLabels = useTasksStore((s) => s.fetchLabels)\n const fetchSummary = useTasksStore((s) => s.fetchSummary)\n\n // The rail tab mounts this panel directly — openDrawer() (the sheet path,\n // where fetching used to live) never runs there, so load on mount. Fetches\n // are deduped in the store, so the drawer path doesn't double-load.\n React.useEffect(() => {\n void fetchTasks()\n void fetchLabels()\n void fetchSummary()\n }, [fetchTasks, fetchLabels, fetchSummary])\n\n const grouped = React.useMemo(() => {\n const map = new Map<TaskStatus, typeof tasks>()\n for (const s of STATUS_ORDER) map.set(s, [])\n for (const task of tasks) {\n const group = map.get(task.status)\n if (group) group.push(task)\n }\n return map\n }, [tasks])\n\n return (\n <>\n {!selectedTaskId && <TasksFilterBar />}\n {!selectedTaskId && <TaskQuickAdd />}\n\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {selectedTaskId ? (\n <TaskDetail taskId={selectedTaskId} />\n ) : tasksLoading && tasks.length === 0 ? (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : tasks.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 text-muted-foreground\">\n <ClipboardList className=\"mb-3 h-10 w-10 opacity-40\" />\n <p className=\"text-sm font-medium\">{t('tasks.empty')}</p>\n <p className=\"mt-1 text-xs\">{t('tasks.empty.description')}</p>\n </div>\n ) : activeFilter !== 'all' ? (\n <div className=\"py-1\">\n {tasks.map((task) => (\n <div key={task.id} className=\"px-2\">\n <TaskCard task={task} />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2 py-2\">\n {STATUS_ORDER.filter((s) => s !== 'cancelled' || (grouped.get(s)?.length ?? 0) > 0).map((status) => (\n <TaskStatusGroup key={status} status={status} tasks={grouped.get(status) ?? []} />\n ))}\n </div>\n )}\n </div>\n </>\n )\n}\n\n/** One-line summary of what needs attention (\"3 atrasadas · 2 para hoje\"). */\nexport function useTasksSummaryLine(): string {\n const t = useTranslation()\n const summary = useTasksStore((s) => s.summary)\n return React.useMemo(() => {\n if (!summary) return ''\n const parts: string[] = []\n if (summary.overdue > 0) parts.push(`${summary.overdue} ${t('tasks.summary.overdue')}`)\n if (summary.dueToday > 0) parts.push(`${summary.dueToday} ${t('tasks.summary.dueToday')}`)\n return parts.join(' · ')\n }, [summary, t])\n}\n","import React from 'react'\nimport {\n Sheet, SheetContent, SheetHeader, SheetBody, SheetTitle, SheetDescription,\n} from '@fayz-ai/ui'\nimport { useTasksStore } from '../context'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksPanel, useTasksSummaryLine } from './TasksPanel'\n\n/** Tasks as a sheet — the fallback where the shell has no right rail. */\nexport function TasksDrawer() {\n const t = useTranslation()\n const drawerOpen = useTasksStore((s) => s.drawerOpen)\n const closeDrawer = useTasksStore((s) => s.closeDrawer)\n const summaryLine = useTasksSummaryLine()\n\n return (\n <Sheet open={drawerOpen} onOpenChange={(v) => { if (!v) closeDrawer() }}>\n <SheetContent width=\"max-w-lg\" overlay=\"dim\">\n <SheetHeader>\n <SheetTitle>{t('tasks.drawer.title')}</SheetTitle>\n <SheetDescription>\n {summaryLine || t('tasks.drawer.subtitle')}\n </SheetDescription>\n </SheetHeader>\n\n <SheetBody className=\"flex flex-col px-0 py-0\">\n <TasksPanel />\n </SheetBody>\n </SheetContent>\n </Sheet>\n )\n}\n","import React, { useEffect } from 'react'\nimport { CheckSquare } from 'lucide-react'\nimport { cn, useLayoutStore, useRailRow } from '@fayz-ai/ui'\nimport { useRightRailPanel, useRightRailStore, useWidgetSurface } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksContextProvider, type ResolvedTasksConfig } from '../context'\nimport { TasksDrawer } from './TasksDrawer'\nimport { TasksPanel } from './TasksPanel'\nimport type { TasksDataProvider } from '../data/types'\nimport type { TasksUIState } from '../store'\nimport { useStore, type StoreApi } from 'zustand'\n\ninterface TasksLauncherProps {\n config: {\n tasksConfig: ResolvedTasksConfig\n tasksProvider: TasksDataProvider\n tasksStore: StoreApi<TasksUIState>\n }\n}\n\nexport function TasksLauncher({ config }: TasksLauncherProps) {\n const { tasksConfig, tasksProvider, tasksStore } = config\n const t = useTranslation()\n // The shell's rail when there is one, this plugin's sheet when there is not.\n const railMounted = useRightRailStore((s) => s.mounted)\n // Open tasks (todo + in progress) — the rail tab's red badge.\n const summary = useStore(tasksStore, (s) => s.summary)\n const openCount = summary ? summary.todo + summary.inProgress : 0\n\n // Carries its own providers (registered far from here) and must stay\n // referentially stable or the list remounts every render.\n const Panel = React.useMemo(() => {\n const RailPanel = () => (\n <TasksContextProvider config={tasksConfig} provider={tasksProvider} store={tasksStore}>\n <TasksPanel />\n </TasksContextProvider>\n )\n RailPanel.displayName = 'TasksRailPanel'\n return RailPanel\n }, [tasksConfig, tasksProvider, tasksStore])\n\n useRightRailPanel(\n React.useMemo(\n () =>\n railMounted\n ? {\n id: 'tasks',\n label: t('tasks.drawer.title') || 'Tasks',\n icon: CheckSquare,\n order: 20,\n badge: { count: openCount, tone: 'destructive' as const },\n Component: Panel,\n }\n : null,\n [railMounted, t, Panel, openCount],\n ),\n )\n\n return (\n <TasksContextProvider config={tasksConfig} provider={tasksProvider} store={tasksStore}>\n <TasksLauncherRow store={tasksStore} railMounted={railMounted} />\n {!railMounted && <TasksDrawer />}\n </TasksContextProvider>\n )\n}\n\nfunction TasksLauncherRow({\n store,\n railMounted,\n}: {\n store: StoreApi<TasksUIState>\n railMounted: boolean\n}) {\n const t = useTranslation()\n const toggleDrawer = useStore(store, (s) => s.toggleDrawer)\n const fetchSummary = useStore(store, (s) => s.fetchSummary)\n const summary = useStore(store, (s) => s.summary)\n const togglePanel = useRightRailStore((s) => s.togglePanel)\n\n useEffect(() => {\n fetchSummary()\n }, [fetchSummary])\n\n const pendingCount = summary ? summary.todo + summary.inProgress : 0\n const collapsed = useLayoutStore((s) => s.sidebarCollapsed)\n // Numa shell sem trilha a shell põe isto na barra de topo — ali só cabe o\n // ícone, exatamente como na trilha recolhida.\n const surface = useWidgetSurface()\n const compact = collapsed || surface === 'topbar'\n const label = t('tasks.drawer.title') || 'Tasks'\n const open = () => (railMounted ? togglePanel('tasks') : toggleDrawer())\n // Na trilha recolhida, o mesmo painel de hover que os links abrem — senão\n // esta linha é o único ícone do menu sem nome.\n const railRow = useRailRow(\n surface === 'rail'\n ? { key: 'tasks', label, badge: pendingCount > 0 ? pendingCount : undefined }\n : null,\n )\n\n // A row of the rail, not an icon in the top bar. Tarefas são do workspace —\n // não mudam com a tela aberta — e lá em cima dividiam o canto com o \"Novo\" da\n // página. Os tokens já eram os da trilha (`text-sidebar-*`), o que sobre papel\n // dava um ícone quase invisível: agora eles pousam onde foram feitos.\n if (compact) {\n return (\n <button\n {...railRow}\n onClick={open}\n aria-label={label}\n // Na barra de topo não há painel da trilha para dizer o nome.\n title={surface === 'topbar' ? label : undefined}\n className={cn(\n 'fz-tap relative flex shrink-0 items-center justify-center rounded-button p-2 text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-foreground',\n // Na trilha ele é uma linha (ocupa a coluna); na barra, um ícone\n // entre outros, e esticar tomaria a barra inteira.\n surface === 'rail' && 'w-full',\n )}\n >\n <CheckSquare className=\"h-4 w-4\" />\n {pendingCount > 0 && (\n <span className=\"absolute right-1 top-1 h-2 w-2 rounded-full bg-destructive\" />\n )}\n </button>\n )\n }\n\n return (\n <button\n onClick={open}\n aria-label={label}\n className=\"fz-tap flex w-full items-center gap-2 rounded-button px-2.5 py-1.5 text-sm text-sidebar-muted transition-colors hover:bg-sidebar-accent/50 hover:text-sidebar-foreground\"\n >\n <CheckSquare className=\"h-4 w-4 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate text-left\">{label}</span>\n {pendingCount > 0 && (\n <span\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-full bg-destructive text-[10px] text-destructive-foreground',\n pendingCount > 9 ? 'h-5 min-w-5 px-1' : 'h-4 w-4',\n )}\n >\n {pendingCount > 99 ? '99+' : pendingCount}\n </span>\n )}\n </button>\n )\n}\n","// AUTO-GENERATED from 000_plg_rename.sql, 001_tasks_base.sql — regenerate with scripts/embed-migrations.mjs\n// SQL files are the source of truth; this inline copy lets the manifest declare\n// migrations as data. Do not edit by hand — run the embed script instead.\n\nexport const MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql — rename legacy tasks tables to plg_tasks_* for pools\n-- provisioned before the industry-pool rename. Guarded: fires only when legacy\n-- name exists and target does not, so fresh pools skip every branch.\nDO $$\nBEGIN\n IF to_regclass('public.tsk_tasks') IS NOT NULL AND to_regclass('public.plg_tasks_tasks') IS NULL THEN\n ALTER TABLE public.tsk_tasks RENAME TO plg_tasks_tasks;\n END IF;\n IF to_regclass('public.tsk_labels') IS NOT NULL AND to_regclass('public.plg_tasks_labels') IS NULL THEN\n ALTER TABLE public.tsk_labels RENAME TO plg_tasks_labels;\n END IF;\nEND $$;\n`\n\nexport const MIGRATION_001_TASKS_BASE = `-- Tasks Plugin: Base Tables\n-- Prefix: plg_tasks_\n\n-- Label definitions for categorizing tasks\nCREATE TABLE IF NOT EXISTS public.plg_tasks_labels (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n name text NOT NULL,\n color text NOT NULL DEFAULT '#6366f1',\n is_active boolean NOT NULL DEFAULT true,\n created_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_labels_tenant ON public.plg_tasks_labels(tenant_id);\n\n-- Main tasks table (subtasks via parent_id self-reference)\nCREATE TABLE IF NOT EXISTS public.plg_tasks_tasks (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n title text NOT NULL,\n description text,\n status text NOT NULL DEFAULT 'todo'\n CHECK (status IN ('todo', 'in_progress', 'done', 'cancelled')),\n priority text NOT NULL DEFAULT 'medium'\n CHECK (priority IN ('low', 'medium', 'high', 'urgent')),\n due_date date,\n assigned_to_id uuid,\n assigned_to_name text,\n parent_id uuid REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE,\n labels jsonb NOT NULL DEFAULT '[]'::jsonb,\n position integer NOT NULL DEFAULT 0,\n created_by_id uuid,\n created_by_name text,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\nALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks(tenant_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_status ON public.plg_tasks_tasks(tenant_id, status);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks(parent_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks(assigned_to_id);\nCREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_due ON public.plg_tasks_tasks(tenant_id, due_date)\n WHERE due_date IS NOT NULL;\n\n-- RLS policies for plg_tasks_tasks (idempotent — DROP IF EXISTS before CREATE)\nDROP POLICY IF EXISTS plg_tasks_tasks_select ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_insert ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_insert ON public.plg_tasks_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_update ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_tasks_delete ON public.plg_tasks_tasks;\nCREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_tasks TO authenticated;\n\n-- RLS policies for plg_tasks_labels (idempotent)\nDROP POLICY IF EXISTS plg_tasks_labels_select ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_insert ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_insert ON public.plg_tasks_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_update ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nDROP POLICY IF EXISTS plg_tasks_labels_delete ON public.plg_tasks_labels;\nCREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));\nGRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_labels TO authenticated;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_plg_rename\", sql: MIGRATION_000_PLG_RENAME },\n { id: \"001_tasks_base\", sql: MIGRATION_001_TASKS_BASE },\n]\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { TasksContextProvider, type ResolvedTasksConfig, type TasksPluginLabels } from './context'\nimport type { TasksDataProvider } from './data/types'\nimport type { TaskPriority } from './types'\nimport { createMockTasksProvider } from './data/mock'\nimport { createSafeDataProvider, registerTranslations } from '@fayz-ai/core'\nimport { createSupabaseTasksProvider } from './data/supabase'\nimport { createTasksStore } from './store'\nimport { tasksLocales } from './locales'\nimport { tasksRegistries } from './data/registries'\nimport { TasksGeneralSettings } from './components/TasksGeneralSettings'\nimport { TasksLauncher } from './components/TasksLauncher'\nimport { registerNotesTasksAdapter, NOTE_LABEL_PREFIX } from '@fayz-ai/admin'\nimport { MIGRATION_000_PLG_RENAME, MIGRATION_001_TASKS_BASE } from './migrations'\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface TasksPluginOptions {\n /** Label overrides */\n labels?: Partial<TasksPluginLabels>\n /** Plugin scope */\n scope?: PluginScope\n /** Vertical ID */\n verticalId?: VerticalId\n /** Data provider override (defaults to safe auto-selection) */\n dataProvider?: TasksDataProvider\n /** Default priority for new tasks (default: 'medium') */\n defaultPriority?: TaskPriority\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_LABELS: TasksPluginLabels = {\n drawerTitle: 'Tasks',\n settingsTitle: 'Tasks',\n quickAddPlaceholder: 'Add a task...',\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: TasksPluginOptions): ResolvedTasksConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\n }\n}\n\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createTasksPlugin(options?: TasksPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n // Register locales globally so the plugin's translations resolve even when the\n // host shell does not mount @fayz-ai/core's I18nProvider (incremental de-bridge).\n registerTranslations(tasksLocales)\n const provider = options?.dataProvider ?? createSafeDataProvider(\n () => createSupabaseTasksProvider(),\n () => createMockTasksProvider(),\n )\n const store = createTasksStore(provider)\n\n // Notes ↔ Tasks bridge: note todos are real tasks, linked by a `note:<id>`\n // label. The shell's Notes tab consumes this; the Tarefas tab (and its\n // summary badge) stays the single source of truth.\n registerNotesTasksAdapter({\n async createTodo({ title, noteId, noteTitle }) {\n const task = await provider.createTask({\n title,\n description: noteTitle ? `Nota: ${noteTitle}` : undefined,\n labels: [`${NOTE_LABEL_PREFIX}${noteId}`],\n })\n void store.getState().fetchSummary()\n return { id: task.id, title: task.title, done: task.status === 'done' }\n },\n async listTodos(noteId) {\n const tasks = await provider.getTasks({})\n const label = `${NOTE_LABEL_PREFIX}${noteId}`\n return tasks\n .filter((t) => t.labels.includes(label))\n .sort((a, b) => (a.status === 'done' ? 1 : 0) - (b.status === 'done' ? 1 : 0))\n .map((t) => ({ id: t.id, title: t.title, done: t.status === 'done' }))\n },\n async toggleTodo(id: string, done: boolean) {\n await provider.updateTask(id, { status: done ? 'done' : 'todo' })\n void store.getState().fetchSummary()\n },\n async removeTodo(id: string) {\n await provider.deleteTask(id)\n void store.getState().fetchSummary()\n },\n })\n\n return {\n id: 'tasks',\n name: config.labels.drawerTitle,\n icon: 'CheckSquare',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n\n navigation: [],\n\n routes: [],\n\n widgets: [\n {\n // No pé da trilha, não no topo: tarefas são do workspace, não da\n // tela aberta — e no topo elas dividiam o canto com as ações da página.\n id: 'tasks-launcher',\n zone: 'shell.sidebar.footer',\n component: TasksLauncher as unknown as React.ComponentType<unknown>,\n order: 10,\n props: {\n tasksConfig: config,\n tasksProvider: provider,\n tasksStore: store,\n },\n },\n ],\n\n aiTools: [\n {\n id: 'tasks.summary',\n name: 'getTasksSummary',\n description: 'Returns a summary of pending tasks: total, overdue, due today, by status and priority.',\n icon: 'CheckSquare',\n mode: 'read' as const,\n category: 'Tasks',\n parameters: {\n type: 'object' as const,\n properties: {\n status: {\n type: 'string' as const,\n description: 'Filter by task status',\n enum: ['todo', 'in_progress', 'done', 'cancelled', 'all'],\n },\n },\n },\n suggestions: [\n { label: 'What tasks are overdue?' },\n { label: 'How many tasks are pending?' },\n { label: \"What's due today?\" },\n ],\n },\n ],\n\n registries: tasksRegistries,\n\n settings: [\n {\n id: 'tasks',\n label: config.labels.settingsTitle,\n icon: 'CheckSquare',\n component: (() => {\n const Tab: React.FC = () =>\n React.createElement(TasksContextProvider, { config, provider, store },\n React.createElement(TasksGeneralSettings),\n )\n Tab.displayName = 'TasksSettingsTab'\n return Tab as unknown as React.ComponentType<unknown>\n })(),\n order: 14,\n },\n ],\n\n migrations: [\n {\n id: 'tasks-000-plg-rename',\n version: '1.0.0',\n sql: MIGRATION_000_PLG_RENAME,\n description: 'Rename legacy tsk_* tables to plg_tasks_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)',\n },\n {\n id: 'tasks-001-base-tables',\n version: '1.0.0',\n sql: MIGRATION_001_TASKS_BASE,\n description: 'Create plg_tasks_tasks and plg_tasks_labels',\n },\n ],\n\n locales: tasksLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport type { TasksDataProvider } from './data/types'\nexport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nexport type {\n Task, TaskLabel, TaskStatus, TaskPriority, TasksSummary,\n CreateTaskInput, UpdateTaskInput, TaskQuery,\n} from './types'\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "fayz": {
4
4
  "status": "beta"
5
5
  },
6
- "version": "0.9.2",
6
+ "version": "0.9.4",
7
7
  "description": "Fayz SDK — plugin-tasks plugin",
8
8
  "type": "module",
9
9
  "sideEffects": false,
@@ -26,9 +26,9 @@
26
26
  "lucide-react": ">=0.400.0 <1.0.0"
27
27
  },
28
28
  "dependencies": {
29
- "@fayz-ai/core": "^0.11.0",
30
- "@fayz-ai/admin": "^0.11.0",
31
- "@fayz-ai/ui": "^0.11.0"
29
+ "@fayz-ai/core": "^0.14.0",
30
+ "@fayz-ai/admin": "^0.14.0",
31
+ "@fayz-ai/ui": "^0.14.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/react": "^18.3.0",
@@ -49,10 +49,10 @@
49
49
  "access": "public"
50
50
  },
51
51
  "scripts": {
52
- "build": "tsup && tsc --emitDeclarationOnly --declaration --declarationMap --noEmit false",
52
+ "build": "tsup && tsc -b --force",
53
53
  "dev": "tsup --watch",
54
- "typecheck": "tsc --noEmit",
54
+ "typecheck": "tsc -b tsconfig.test.json",
55
55
  "test": "vitest run",
56
- "clean": "rm -rf dist"
56
+ "clean": "rm -rf dist .tsbuildinfo"
57
57
  }
58
58
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"TasksTopbarButton.d.ts","sourceRoot":"","sources":["../../src/components/TasksTopbarButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAMxC,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAG3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEjD,UAAU,sBAAsB;IAC9B,MAAM,EAAE;QACN,WAAW,EAAE,mBAAmB,CAAA;QAChC,aAAa,EAAE,iBAAiB,CAAA;QAChC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAA;KACnC,CAAA;CACF;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,qBA4CnE"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=capability.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capability.test.d.ts","sourceRoot":"","sources":["../../src/data/capability.test.ts"],"names":[],"mappings":""}