@fayz-ai/plugin-tasks 0.10.3 → 0.10.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.
package/dist/index.d.ts CHANGED
@@ -12,6 +12,18 @@ export interface TasksPluginOptions {
12
12
  dataProvider?: TasksDataProvider;
13
13
  /** Default priority for new tasks (default: 'medium') */
14
14
  defaultPriority?: TaskPriority;
15
+ /**
16
+ * Show the Tasks row in the sidebar's foot. Default: true.
17
+ *
18
+ * The panel is worth a permanent row in a product where tasks are the work —
19
+ * an agency, a clinic with a follow-up list. In one where they are back-office
20
+ * (a restaurant during service), that row spends the whole shift competing
21
+ * with the things somebody actually touches, and the badge on it is a red
22
+ * number about paperwork. Turning it off keeps the plugin whole: the table,
23
+ * the provider, the settings tab, the agent's tools and the onboarding rows it
24
+ * carries all stay — only the rail entry goes.
25
+ */
26
+ launcher?: boolean;
15
27
  }
16
28
  export declare function createTasksPlugin(options?: TasksPluginOptions): PluginManifest;
17
29
  export type { ResolvedTasksConfig, TasksPluginLabels } from './context';
@@ -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;AAE5E,OAAO,EAGL,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAC1C,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAWvE,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,uDAAuD;IACvD,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,yDAAyD;IACzD,eAAe,CAAC,EAAE,YAAY,CAAA;CAC/B;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAuI9E;AAOD,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,EAAE,iBAAiB,GAC/D,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAC9D,aAAa,EAAE,mBAAmB,EAClC,2BAA2B,EAAE,uBAAuB,GACrD,MAAM,gBAAgB,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;AAE5E,OAAO,EAGL,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAC1C,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAWvE,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,uDAAuD;IACvD,YAAY,CAAC,EAAE,iBAAiB,CAAA;IAChC,yDAAyD;IACzD,eAAe,CAAC,EAAE,YAAY,CAAA;IAC9B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,cAAc,CA6H9E;AAOD,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,EAAE,iBAAiB,GAC/D,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAC9D,aAAa,EAAE,mBAAmB,EAClC,2BAA2B,EAAE,uBAAuB,GACrD,MAAM,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ var taskLabelEntity = {
112
112
  defaultSort: "name",
113
113
  fields: [
114
114
  { key: "name", label: "Name", type: "text", required: true, showInTable: true },
115
- { key: "color", label: "Color", type: "text", showInTable: true, defaultValue: "#6366f1" },
115
+ { key: "color", label: "Color", type: "color", showInTable: true, defaultValue: "#6366f1" },
116
116
  { key: "isActive", label: "Active", type: "boolean", showInTable: true, defaultValue: true }
117
117
  ],
118
118
  data: { table: LABELS_TABLE, tenantScoped: true }
@@ -252,135 +252,333 @@ function TasksLauncherRow({ railMounted }) {
252
252
  }
253
253
 
254
254
  // src/migrations/index.ts
255
- var MIGRATION_000_PLG_RENAME = `-- 000_plg_rename.sql \u2014 rename legacy tasks tables to plg_tasks_* for pools
256
- -- provisioned before the industry-pool rename. Guarded: fires only when legacy
257
- -- name exists and target does not, so fresh pools skip every branch.
258
- DO $$
259
- BEGIN
260
- IF to_regclass('public.tsk_tasks') IS NOT NULL AND to_regclass('public.plg_tasks_tasks') IS NULL THEN
261
- ALTER TABLE public.tsk_tasks RENAME TO plg_tasks_tasks;
262
- END IF;
263
- IF to_regclass('public.tsk_labels') IS NOT NULL AND to_regclass('public.plg_tasks_labels') IS NULL THEN
264
- ALTER TABLE public.tsk_labels RENAME TO plg_tasks_labels;
265
- END IF;
266
- END $$;
267
- `;
268
- var MIGRATION_001_TASKS_BASE = `-- Tasks Plugin: Base Tables
269
- -- Prefix: plg_tasks_
270
-
271
- -- Label definitions for categorizing tasks
272
- CREATE TABLE IF NOT EXISTS public.plg_tasks_labels (
273
- id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
274
- tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
275
- name text NOT NULL,
276
- color text NOT NULL DEFAULT '#6366f1',
277
- is_active boolean NOT NULL DEFAULT true,
278
- created_at timestamptz NOT NULL DEFAULT now()
279
- );
280
- ALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;
281
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_labels_tenant ON public.plg_tasks_labels(tenant_id);
282
-
283
- -- Main tasks table (subtasks via parent_id self-reference)
284
- CREATE TABLE IF NOT EXISTS public.plg_tasks_tasks (
285
- id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
286
- tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
287
- title text NOT NULL,
288
- description text,
289
- status text NOT NULL DEFAULT 'todo'
290
- CHECK (status IN ('todo', 'in_progress', 'done', 'cancelled')),
291
- priority text NOT NULL DEFAULT 'medium'
292
- CHECK (priority IN ('low', 'medium', 'high', 'urgent')),
293
- due_date date,
294
- assigned_to_id uuid,
295
- assigned_to_name text,
296
- parent_id uuid REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE,
297
- labels jsonb NOT NULL DEFAULT '[]'::jsonb,
298
- position integer NOT NULL DEFAULT 0,
299
- created_by_id uuid,
300
- created_by_name text,
301
- created_at timestamptz NOT NULL DEFAULT now(),
302
- updated_at timestamptz NOT NULL DEFAULT now()
303
- );
304
- ALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;
305
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks(tenant_id);
306
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_status ON public.plg_tasks_tasks(tenant_id, status);
307
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks(parent_id);
308
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks(assigned_to_id);
309
- CREATE INDEX IF NOT EXISTS idx_plg_tasks_tasks_due ON public.plg_tasks_tasks(tenant_id, due_date)
310
- WHERE due_date IS NOT NULL;
311
-
312
- -- RLS policies for plg_tasks_tasks (idempotent \u2014 DROP IF EXISTS before CREATE)
313
- DROP POLICY IF EXISTS plg_tasks_tasks_select ON public.plg_tasks_tasks;
314
- CREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
315
- DROP POLICY IF EXISTS plg_tasks_tasks_insert ON public.plg_tasks_tasks;
316
- CREATE POLICY plg_tasks_tasks_insert ON public.plg_tasks_tasks FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
317
- DROP POLICY IF EXISTS plg_tasks_tasks_update ON public.plg_tasks_tasks;
318
- CREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
319
- DROP POLICY IF EXISTS plg_tasks_tasks_delete ON public.plg_tasks_tasks;
320
- CREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
321
- GRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_tasks TO authenticated;
322
-
323
- -- RLS policies for plg_tasks_labels (idempotent)
324
- DROP POLICY IF EXISTS plg_tasks_labels_select ON public.plg_tasks_labels;
325
- CREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
326
- DROP POLICY IF EXISTS plg_tasks_labels_insert ON public.plg_tasks_labels;
327
- CREATE POLICY plg_tasks_labels_insert ON public.plg_tasks_labels FOR INSERT TO authenticated WITH CHECK (tenant_id IN (SELECT public.user_tenant_ids()));
328
- DROP POLICY IF EXISTS plg_tasks_labels_update ON public.plg_tasks_labels;
329
- CREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
330
- DROP POLICY IF EXISTS plg_tasks_labels_delete ON public.plg_tasks_labels;
331
- CREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING (tenant_id IN (SELECT public.user_tenant_ids()));
332
- GRANT SELECT, INSERT, UPDATE, DELETE ON public.plg_tasks_labels TO authenticated;
333
- `;
334
- var MIGRATION_002_TASKS_TO_SPINE = `-- 002_tasks_to_spine.sql \u2014 carry this plugin's rows into the spine's tasks table.
255
+ var MIGRATION_000_BASELINE = `-- ============================================================================
256
+ -- plugins/plugin-tasks/src/migrations/000_baseline.sql \u2014 what installing this provisions, as one file.
335
257
  --
336
- -- public.tasks (db migration 047) is now the one table admin work lives in: the
337
- -- shell's getting-started checklist writes it, so it has to exist in apps that
338
- -- never installed this plugin. This file moves what plg_tasks_tasks already has.
258
+ -- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:
259
+ -- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs
260
+ -- prove the result still matches.
339
261
  --
340
- -- WHY THE COPY IS HERE AND NOT IN 047. \`fayz db apply\` runs the spine BEFORE
341
- -- plugins (cli/src/lib/migration-plan.ts). On a fresh pool 047 runs while
342
- -- plg_tasks_tasks does not exist yet, and a checksum-frozen file cannot try
343
- -- again later. Here, both tables are guaranteed to exist.
262
+ -- This replaced 3 migration files. They are kept, unapplied, in
263
+ -- migrations.archive/ \u2014 a year of decisions is worth reading even when it is no
264
+ -- longer worth replaying.
344
265
  --
345
- -- plg_tasks_tasks is NOT dropped. It is retired in place; a later migration
346
- -- removes it once the fleet has been verified on the new table.
347
- --
348
- -- Idempotent.
349
-
350
- DO $$
351
- BEGIN
352
- -- An app on an older @fayz-ai/db has no spine table to copy into. Say so and
353
- -- leave: the plugin still works against its own table until db is upgraded.
354
- IF to_regclass('public.tasks') IS NULL THEN
355
- RAISE NOTICE 'plugin-tasks 002: public.tasks not found \u2014 upgrade @fayz-ai/db to move tasks to the spine';
356
- RETURN;
357
- END IF;
358
-
359
- IF to_regclass('public.plg_tasks_tasks') IS NULL THEN
360
- RETURN; -- fresh pool: nothing to carry
361
- END IF;
362
-
363
- -- The id is preserved deliberately. The notes bridge keys a note's todos by
364
- -- task id and stores the link as a 'note:<id>' string in \`labels\`; a new id
365
- -- here would orphan every note todo in the fleet.
366
- --
367
- -- Roots before children so the self-referencing parent_id always resolves.
368
- -- auth.uid() is NULL in a migration session and both of 047's stamping
369
- -- triggers COALESCE, so these explicit values win.
370
- INSERT INTO public.tasks (
371
- id, tenant_id, title, description, status, priority, due_date,
372
- assigned_to_id, assigned_to_name, parent_id, labels, position,
373
- created_by, created_by_name, owner_id, created_at, updated_at
374
- )
375
- SELECT
376
- src.id, src.tenant_id, src.title, src.description, src.status, src.priority, src.due_date,
377
- src.assigned_to_id, src.assigned_to_name, src.parent_id, src.labels, src.position,
378
- src.created_by_id, src.created_by_name, src.created_by_id, src.created_at, src.updated_at
379
- FROM public.plg_tasks_tasks src
380
- ORDER BY src.parent_id NULLS FIRST
381
- ON CONFLICT (id) DO NOTHING;
382
- END $$;
266
+ -- Object order is fixed rather than dependency-sorted: schemas, types,
267
+ -- sequences, tables, defaults, functions, constraints, views, indexes, foreign
268
+ -- keys, triggers, row security, policies, grants. Dependencies BETWEEN units
269
+ -- are carried by the order packages/db/chain.json declares.
270
+ -- ============================================================================
271
+
272
+ -- A LANGUAGE sql function binds its body at CREATE time, and 570 functions
273
+ -- sorted by name are not sorted by who calls whom. This is what lets them load
274
+ -- in any order; every body is still compiled on first call, so a genuinely
275
+ -- broken reference surfaces then rather than never. Session-scoped.
276
+ SET check_function_bodies = false;
277
+
278
+
279
+
280
+ -- \u2500\u2500 default privileges: reset \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
281
+ -- Cleared BEFORE anything is created, so every object below gets the ACL the
282
+ -- dump describes rather than the image's defaults on top of it. Restored at
283
+ -- the end of this file.
284
+
285
+ DO $dp$ BEGIN
286
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;
287
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
288
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;
289
+ END $dp$;
290
+
291
+ DO $dp$ BEGIN
292
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;
293
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
294
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;
295
+ END $dp$;
296
+
297
+ DO $dp$ BEGIN
298
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;
299
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
300
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;
301
+ END $dp$;
302
+
303
+ DO $dp$ BEGIN
304
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;
305
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
306
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;
307
+ END $dp$;
308
+
309
+ DO $dp$ BEGIN
310
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;
311
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
312
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;
313
+ END $dp$;
314
+
315
+ DO $dp$ BEGIN
316
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;
317
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
318
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;
319
+ END $dp$;
320
+
321
+
322
+ -- \u2500\u2500 table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
323
+
324
+ CREATE TABLE public.plg_tasks_labels (
325
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
326
+ tenant_id uuid NOT NULL,
327
+ name text NOT NULL,
328
+ color text DEFAULT '#6366f1'::text NOT NULL,
329
+ is_active boolean DEFAULT true NOT NULL,
330
+ created_at timestamp with time zone DEFAULT now() NOT NULL
331
+ );
332
+
333
+ CREATE TABLE public.plg_tasks_tasks (
334
+ id uuid DEFAULT gen_random_uuid() NOT NULL,
335
+ tenant_id uuid NOT NULL,
336
+ title text NOT NULL,
337
+ description text,
338
+ status text DEFAULT 'todo'::text NOT NULL,
339
+ priority text DEFAULT 'medium'::text NOT NULL,
340
+ due_date date,
341
+ assigned_to_id uuid,
342
+ assigned_to_name text,
343
+ parent_id uuid,
344
+ labels jsonb DEFAULT '[]'::jsonb NOT NULL,
345
+ "position" integer DEFAULT 0 NOT NULL,
346
+ created_by_id uuid,
347
+ created_by_name text,
348
+ created_at timestamp with time zone DEFAULT now() NOT NULL,
349
+ updated_at timestamp with time zone DEFAULT now() NOT NULL,
350
+ CONSTRAINT plg_tasks_tasks_priority_check CHECK ((priority = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'urgent'::text]))),
351
+ CONSTRAINT plg_tasks_tasks_status_check CHECK ((status = ANY (ARRAY['todo'::text, 'in_progress'::text, 'done'::text, 'cancelled'::text])))
352
+ );
353
+
354
+
355
+ -- \u2500\u2500 constraint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
356
+
357
+ ALTER TABLE ONLY public.plg_tasks_labels
358
+ ADD CONSTRAINT plg_tasks_labels_pkey PRIMARY KEY (id);
359
+
360
+ ALTER TABLE ONLY public.plg_tasks_tasks
361
+ ADD CONSTRAINT plg_tasks_tasks_pkey PRIMARY KEY (id);
362
+
363
+
364
+ -- \u2500\u2500 index \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
365
+
366
+ CREATE INDEX idx_plg_tasks_labels_tenant ON public.plg_tasks_labels USING btree (tenant_id);
367
+
368
+ CREATE INDEX idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks USING btree (assigned_to_id);
369
+
370
+ CREATE INDEX idx_plg_tasks_tasks_due ON public.plg_tasks_tasks USING btree (tenant_id, due_date) WHERE (due_date IS NOT NULL);
371
+
372
+ CREATE INDEX idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks USING btree (parent_id);
373
+
374
+ CREATE INDEX idx_plg_tasks_tasks_status ON public.plg_tasks_tasks USING btree (tenant_id, status);
375
+
376
+ CREATE INDEX idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks USING btree (tenant_id);
377
+
378
+
379
+ -- \u2500\u2500 fk constraint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
380
+
381
+ ALTER TABLE ONLY public.plg_tasks_labels
382
+ ADD CONSTRAINT plg_tasks_labels_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;
383
+
384
+ ALTER TABLE ONLY public.plg_tasks_tasks
385
+ ADD CONSTRAINT plg_tasks_tasks_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE;
386
+
387
+ ALTER TABLE ONLY public.plg_tasks_tasks
388
+ ADD CONSTRAINT plg_tasks_tasks_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;
389
+
390
+
391
+ -- \u2500\u2500 row security \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
392
+
393
+ ALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;
394
+
395
+ ALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;
396
+
397
+
398
+ -- \u2500\u2500 policy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
399
+
400
+ CREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
401
+
402
+ CREATE POLICY plg_tasks_labels_insert ON public.plg_tasks_labels FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
403
+
404
+ CREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
405
+
406
+ CREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
407
+
408
+ CREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
409
+
410
+ CREATE POLICY plg_tasks_tasks_insert ON public.plg_tasks_tasks FOR INSERT TO authenticated WITH CHECK ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
411
+
412
+ CREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
413
+
414
+ CREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));
415
+
416
+
417
+ -- \u2500\u2500 acl \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
418
+
419
+ GRANT MAINTAIN ON TABLE public.plg_tasks_labels TO anon;
420
+ GRANT ALL ON TABLE public.plg_tasks_labels TO authenticated;
421
+ GRANT ALL ON TABLE public.plg_tasks_labels TO service_role;
422
+
423
+ GRANT MAINTAIN ON TABLE public.plg_tasks_tasks TO anon;
424
+ GRANT ALL ON TABLE public.plg_tasks_tasks TO authenticated;
425
+ GRANT ALL ON TABLE public.plg_tasks_tasks TO service_role;
426
+
427
+
428
+ -- \u2500\u2500 default privileges: restore \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
429
+ -- Put back, so the NEXT thing installed inherits what the chain had.
430
+
431
+ DO $dp$ BEGIN
432
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;
433
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
434
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;
435
+ END $dp$;
436
+
437
+ DO $dp$ BEGIN
438
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;
439
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
440
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;
441
+ END $dp$;
442
+
443
+ DO $dp$ BEGIN
444
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;
445
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
446
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;
447
+ END $dp$;
448
+
449
+ DO $dp$ BEGIN
450
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;
451
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
452
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;
453
+ END $dp$;
454
+
455
+ DO $dp$ BEGIN
456
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;
457
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
458
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;
459
+ END $dp$;
460
+
461
+ DO $dp$ BEGIN
462
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;
463
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
464
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;
465
+ END $dp$;
466
+
467
+ DO $dp$ BEGIN
468
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;
469
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
470
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;
471
+ END $dp$;
472
+
473
+ DO $dp$ BEGIN
474
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;
475
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
476
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;
477
+ END $dp$;
478
+
479
+ DO $dp$ BEGIN
480
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;
481
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
482
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;
483
+ END $dp$;
484
+
485
+ DO $dp$ BEGIN
486
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;
487
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
488
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;
489
+ END $dp$;
490
+
491
+ DO $dp$ BEGIN
492
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;
493
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
494
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;
495
+ END $dp$;
496
+
497
+ DO $dp$ BEGIN
498
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;
499
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
500
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;
501
+ END $dp$;
502
+
503
+ DO $dp$ BEGIN
504
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;
505
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
506
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;
507
+ END $dp$;
508
+
509
+ DO $dp$ BEGIN
510
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;
511
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
512
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;
513
+ END $dp$;
514
+
515
+ DO $dp$ BEGIN
516
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;
517
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
518
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;
519
+ END $dp$;
520
+
521
+ DO $dp$ BEGIN
522
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;
523
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
524
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;
525
+ END $dp$;
526
+
527
+ DO $dp$ BEGIN
528
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;
529
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
530
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;
531
+ END $dp$;
532
+
533
+ DO $dp$ BEGIN
534
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;
535
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
536
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;
537
+ END $dp$;
538
+
539
+ DO $dp$ BEGIN
540
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;
541
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
542
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;
543
+ END $dp$;
544
+
545
+ DO $dp$ BEGIN
546
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;
547
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
548
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;
549
+ END $dp$;
550
+
551
+ DO $dp$ BEGIN
552
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;
553
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
554
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;
555
+ END $dp$;
556
+
557
+ DO $dp$ BEGIN
558
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;
559
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
560
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;
561
+ END $dp$;
562
+
563
+ DO $dp$ BEGIN
564
+ EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;
565
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
566
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;
567
+ END $dp$;
568
+
569
+ DO $dp$ BEGIN
570
+ EXECUTE $stmt$--
571
+ -- PostgreSQL database dump complete
572
+ --$stmt$;
573
+ EXCEPTION WHEN insufficient_privilege OR undefined_object THEN
574
+ RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$--
575
+ -- PostgreSQL database dump complete
576
+ --$stmt$;
577
+ END $dp$;
383
578
  `;
579
+ var MIGRATIONS = [
580
+ { id: "000_baseline", sql: MIGRATION_000_BASELINE }
581
+ ];
384
582
  var DEFAULT_LABELS = {
385
583
  drawerTitle: "Tasks",
386
584
  settingsTitle: "Tasks",
@@ -432,7 +630,7 @@ function createTasksPlugin(options) {
432
630
  dependencies: [],
433
631
  navigation: [],
434
632
  routes: [],
435
- widgets: [
633
+ widgets: options?.launcher === false ? [] : [
436
634
  {
437
635
  // No pé da trilha, não no topo: tarefas são do workspace, não da
438
636
  // tela aberta — e no topo elas dividiam o canto com as ações da página.
@@ -481,26 +679,15 @@ function createTasksPlugin(options) {
481
679
  order: 14
482
680
  }
483
681
  ],
484
- migrations: [
485
- {
486
- id: "tasks-000-plg-rename",
487
- version: "1.0.0",
488
- sql: MIGRATION_000_PLG_RENAME,
489
- description: "Rename legacy tsk_* tables to plg_tasks_* in-place for pools provisioned before the industry-pool rename (guarded no-op on fresh pools)"
490
- },
491
- {
492
- id: "tasks-001-base-tables",
493
- version: "1.0.0",
494
- sql: MIGRATION_001_TASKS_BASE,
495
- description: "Create plg_tasks_tasks and plg_tasks_labels"
496
- },
497
- {
498
- id: "tasks-002-to-spine",
499
- version: "1.1.0",
500
- sql: MIGRATION_002_TASKS_TO_SPINE,
501
- description: "Copy plg_tasks_tasks rows into the spine public.tasks (ids preserved; the old table is retired in place, not dropped)"
502
- }
503
- ],
682
+ // One baseline per unit since #338 — read from the generated barrel
683
+ // rather than listed here, so regenerating the SQL never needs a
684
+ // manifest edit to match.
685
+ migrations: MIGRATIONS.map((entry) => ({
686
+ id: `tasks-${entry.id}`,
687
+ version: "1.0.0",
688
+ sql: entry.sql,
689
+ description: "The whole schema this plugin provisions, as one file: every table, view, function, policy and grant, plus the reference rows it seeds. Replaced the per-change chain in the 1.0.0 squash (#338); the files it collapsed are kept, unapplied, in src/migrations.archive/."
690
+ })),
504
691
  locales: tasksLocales
505
692
  };
506
693
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/registries.ts","../src/components/TasksGeneralSettings.tsx","../src/components/TasksDrawer.tsx","../src/components/TasksLauncher.tsx","../src/migrations/index.ts","../src/index.ts"],"names":["useTranslation","jsxs","jsx","useTasksStore"],"mappings":"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","file":"index.js","sourcesContent":["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'\n\n// The label catalogue is the one table this plugin still owns — tasks\n// themselves moved to the spine's public.tasks with db migration 047.\nconst LABELS_TABLE = 'plg_tasks_labels'\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: LABELS_TABLE, 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 { SheetBody } from '@fayz-ai/ui'\nimport { RightRailPage, useTasksStore, TasksPanel, useTasksSummaryLine } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\n\n/** Tasks in the shell's right column — a sheet where there is no column. */\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 <RightRailPage\n title={t('tasks.drawer.title')}\n open={drawerOpen}\n onClose={closeDrawer}\n width=\"max-w-lg\"\n >\n {/* The count line only — the column header already carries the name. */}\n <p className=\"shrink-0 border-b border-border/40 px-5 py-2 text-xs text-muted-foreground\">\n {summaryLine || t('tasks.drawer.subtitle')}\n </p>\n\n <SheetBody className=\"flex flex-col px-0 py-0\">\n <TasksPanel />\n </SheetBody>\n </RightRailPage>\n )\n}\n","import React, { useEffect } from 'react'\nimport { CheckSquare } from 'lucide-react'\nimport { cn, useLayoutStore, useRailRow } from '@fayz-ai/ui'\nimport { useRightRailStore, useWidgetSurface, useTasksStore } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksDrawer } from './TasksDrawer'\n\n/**\n * The sidebar row that opens tasks.\n *\n * It no longer registers the rail tab — the shell does that now (db 047 made\n * public.tasks a spine table, so every app has the tab whether or not this\n * plugin is installed). What is left is the row and, on a shell without a rail,\n * the sheet.\n */\nexport function TasksLauncher() {\n const railMounted = useRightRailStore((s) => s.mounted)\n\n return (\n <>\n <TasksLauncherRow railMounted={railMounted} />\n {!railMounted && <TasksDrawer />}\n </>\n )\n}\n\nfunction TasksLauncherRow({ railMounted }: { railMounted: boolean }) {\n const t = useTranslation()\n const toggleDrawer = useTasksStore((s) => s.toggleDrawer)\n const fetchSummary = useTasksStore((s) => s.fetchSummary)\n const summary = useTasksStore((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, 002_tasks_to_spine.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 MIGRATION_002_TASKS_TO_SPINE = `-- 002_tasks_to_spine.sql — carry this plugin's rows into the spine's tasks table.\n--\n-- public.tasks (db migration 047) is now the one table admin work lives in: the\n-- shell's getting-started checklist writes it, so it has to exist in apps that\n-- never installed this plugin. This file moves what plg_tasks_tasks already has.\n--\n-- WHY THE COPY IS HERE AND NOT IN 047. \\`fayz db apply\\` runs the spine BEFORE\n-- plugins (cli/src/lib/migration-plan.ts). On a fresh pool 047 runs while\n-- plg_tasks_tasks does not exist yet, and a checksum-frozen file cannot try\n-- again later. Here, both tables are guaranteed to exist.\n--\n-- plg_tasks_tasks is NOT dropped. It is retired in place; a later migration\n-- removes it once the fleet has been verified on the new table.\n--\n-- Idempotent.\n\nDO $$\nBEGIN\n -- An app on an older @fayz-ai/db has no spine table to copy into. Say so and\n -- leave: the plugin still works against its own table until db is upgraded.\n IF to_regclass('public.tasks') IS NULL THEN\n RAISE NOTICE 'plugin-tasks 002: public.tasks not found — upgrade @fayz-ai/db to move tasks to the spine';\n RETURN;\n END IF;\n\n IF to_regclass('public.plg_tasks_tasks') IS NULL THEN\n RETURN; -- fresh pool: nothing to carry\n END IF;\n\n -- The id is preserved deliberately. The notes bridge keys a note's todos by\n -- task id and stores the link as a 'note:<id>' string in \\`labels\\`; a new id\n -- here would orphan every note todo in the fleet.\n --\n -- Roots before children so the self-referencing parent_id always resolves.\n -- auth.uid() is NULL in a migration session and both of 047's stamping\n -- triggers COALESCE, so these explicit values win.\n INSERT INTO public.tasks (\n id, tenant_id, title, description, status, priority, due_date,\n assigned_to_id, assigned_to_name, parent_id, labels, position,\n created_by, created_by_name, owner_id, created_at, updated_at\n )\n SELECT\n src.id, src.tenant_id, src.title, src.description, src.status, src.priority, src.due_date,\n src.assigned_to_id, src.assigned_to_name, src.parent_id, src.labels, src.position,\n src.created_by_id, src.created_by_name, src.created_by_id, src.created_at, src.updated_at\n FROM public.plg_tasks_tasks src\n ORDER BY src.parent_id NULLS FIRST\n ON CONFLICT (id) DO NOTHING;\nEND $$;\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 { id: \"002_tasks_to_spine\", sql: MIGRATION_002_TASKS_TO_SPINE },\n]\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations } from '@fayz-ai/core'\nimport {\n getTasksProvider, useTasksStore,\n registerNotesTasksAdapter, NOTE_LABEL_PREFIX,\n type TasksDataProvider, type TaskPriority,\n} from '@fayz-ai/admin'\nimport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nimport { tasksLocales } from './locales'\nimport { tasksRegistries } from './data/registries'\nimport { TasksGeneralSettings } from './components/TasksGeneralSettings'\nimport { TasksLauncher } from './components/TasksLauncher'\nimport { MIGRATION_000_PLG_RENAME, MIGRATION_001_TASKS_BASE, MIGRATION_002_TASKS_TO_SPINE } 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 the shell's) */\n dataProvider?: TasksDataProvider\n /** Default priority for new tasks (default: 'medium') */\n defaultPriority?: TaskPriority\n}\n\nconst DEFAULT_LABELS: TasksPluginLabels = {\n drawerTitle: 'Tasks',\n settingsTitle: 'Tasks',\n quickAddPlaceholder: 'Add a task...',\n}\n\nfunction resolveConfig(options?: TasksPluginOptions): ResolvedTasksConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\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\n // The table moved to the spine (db 047) and so did the store, the provider and\n // the panel. What is left here is the sidebar row, the sheet fallback, the\n // label catalogue and the settings tab — the plugin is now a set of surfaces\n // over a table it no longer owns.\n const provider = options?.dataProvider ?? getTasksProvider()\n const store = useTasksStore\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 defaultAgentRole: 'setup',\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 },\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: TasksGeneralSettings as unknown as React.ComponentType<unknown>,\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 id: 'tasks-002-to-spine',\n version: '1.1.0',\n sql: MIGRATION_002_TASKS_TO_SPINE,\n description: 'Copy plg_tasks_tasks rows into the spine public.tasks (ids preserved; the old table is retired in place, not dropped)',\n },\n ],\n\n locales: tasksLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports — the tasks slice lives in @fayz-ai/admin now, but this package's\n// public surface stays what it was.\n// ---------------------------------------------------------------------------\n\nexport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nexport type {\n Task, TaskLabel, TaskStatus, TaskPriority, TasksSummary,\n CreateTaskInput, UpdateTaskInput, TaskQuery, TasksDataProvider,\n} from '@fayz-ai/admin'\nexport {\n TasksPanel, TaskCard, TaskDetail, TaskQuickAdd, TasksFilterBar,\n useTasksStore, useTasksSummaryLine,\n createSupabaseTasksProvider, createMockTasksProvider,\n} from '@fayz-ai/admin'\n"]}
1
+ {"version":3,"sources":["../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/registries.ts","../src/components/TasksGeneralSettings.tsx","../src/components/TasksDrawer.tsx","../src/components/TasksLauncher.tsx","../src/migrations/index.ts","../src/index.ts"],"names":["useTranslation","jsxs","jsx","useTasksStore"],"mappings":"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","file":"index.js","sourcesContent":["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'\n\n// The label catalogue is the one table this plugin still owns — tasks\n// themselves moved to the spine's public.tasks with db migration 047.\nconst LABELS_TABLE = 'plg_tasks_labels'\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: 'color', showInTable: true, defaultValue: '#6366f1' },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: LABELS_TABLE, 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 { SheetBody } from '@fayz-ai/ui'\nimport { RightRailPage, useTasksStore, TasksPanel, useTasksSummaryLine } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\n\n/** Tasks in the shell's right column — a sheet where there is no column. */\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 <RightRailPage\n title={t('tasks.drawer.title')}\n open={drawerOpen}\n onClose={closeDrawer}\n width=\"max-w-lg\"\n >\n {/* The count line only — the column header already carries the name. */}\n <p className=\"shrink-0 border-b border-border/40 px-5 py-2 text-xs text-muted-foreground\">\n {summaryLine || t('tasks.drawer.subtitle')}\n </p>\n\n <SheetBody className=\"flex flex-col px-0 py-0\">\n <TasksPanel />\n </SheetBody>\n </RightRailPage>\n )\n}\n","import React, { useEffect } from 'react'\nimport { CheckSquare } from 'lucide-react'\nimport { cn, useLayoutStore, useRailRow } from '@fayz-ai/ui'\nimport { useRightRailStore, useWidgetSurface, useTasksStore } from '@fayz-ai/admin'\nimport { useTranslation } from '@fayz-ai/core'\nimport { TasksDrawer } from './TasksDrawer'\n\n/**\n * The sidebar row that opens tasks.\n *\n * It no longer registers the rail tab — the shell does that now (db 047 made\n * public.tasks a spine table, so every app has the tab whether or not this\n * plugin is installed). What is left is the row and, on a shell without a rail,\n * the sheet.\n */\nexport function TasksLauncher() {\n const railMounted = useRightRailStore((s) => s.mounted)\n\n return (\n <>\n <TasksLauncherRow railMounted={railMounted} />\n {!railMounted && <TasksDrawer />}\n </>\n )\n}\n\nfunction TasksLauncherRow({ railMounted }: { railMounted: boolean }) {\n const t = useTranslation()\n const toggleDrawer = useTasksStore((s) => s.toggleDrawer)\n const fetchSummary = useTasksStore((s) => s.fetchSummary)\n const summary = useTasksStore((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_baseline.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_BASELINE = `-- ============================================================================\n-- plugins/plugin-tasks/src/migrations/000_baseline.sql — what installing this provisions, as one file.\n--\n-- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:\n-- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs\n-- prove the result still matches.\n--\n-- This replaced 3 migration files. They are kept, unapplied, in\n-- migrations.archive/ — a year of decisions is worth reading even when it is no\n-- longer worth replaying.\n--\n-- Object order is fixed rather than dependency-sorted: schemas, types,\n-- sequences, tables, defaults, functions, constraints, views, indexes, foreign\n-- keys, triggers, row security, policies, grants. Dependencies BETWEEN units\n-- are carried by the order packages/db/chain.json declares.\n-- ============================================================================\n\n-- A LANGUAGE sql function binds its body at CREATE time, and 570 functions\n-- sorted by name are not sorted by who calls whom. This is what lets them load\n-- in any order; every body is still compiled on first call, so a genuinely\n-- broken reference surfaces then rather than never. Session-scoped.\nSET check_function_bodies = false;\n\n\n\n-- ── default privileges: reset ───────────────────────────────────────────\n-- Cleared BEFORE anything is created, so every object below gets the ACL the\n-- dump describes rather than the image's defaults on top of it. Restored at\n-- the end of this file.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\n\n-- ── table ───────────────────────────────────────────────────────────────\n\nCREATE TABLE public.plg_tasks_labels (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n color text DEFAULT '#6366f1'::text NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_tasks_tasks (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n title text NOT NULL,\n description text,\n status text DEFAULT 'todo'::text NOT NULL,\n priority text DEFAULT 'medium'::text NOT NULL,\n due_date date,\n assigned_to_id uuid,\n assigned_to_name text,\n parent_id uuid,\n labels jsonb DEFAULT '[]'::jsonb NOT NULL,\n \"position\" integer DEFAULT 0 NOT NULL,\n created_by_id uuid,\n created_by_name text,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_tasks_tasks_priority_check CHECK ((priority = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'urgent'::text]))),\n CONSTRAINT plg_tasks_tasks_status_check CHECK ((status = ANY (ARRAY['todo'::text, 'in_progress'::text, 'done'::text, 'cancelled'::text])))\n);\n\n\n-- ── constraint ──────────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_tasks_labels\n ADD CONSTRAINT plg_tasks_labels_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_pkey PRIMARY KEY (id);\n\n\n-- ── index ───────────────────────────────────────────────────────────────\n\nCREATE INDEX idx_plg_tasks_labels_tenant ON public.plg_tasks_labels USING btree (tenant_id);\n\nCREATE INDEX idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks USING btree (assigned_to_id);\n\nCREATE INDEX idx_plg_tasks_tasks_due ON public.plg_tasks_tasks USING btree (tenant_id, due_date) WHERE (due_date IS NOT NULL);\n\nCREATE INDEX idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks USING btree (parent_id);\n\nCREATE INDEX idx_plg_tasks_tasks_status ON public.plg_tasks_tasks USING btree (tenant_id, status);\n\nCREATE INDEX idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks USING btree (tenant_id);\n\n\n-- ── fk constraint ───────────────────────────────────────────────────────\n\nALTER TABLE ONLY public.plg_tasks_labels\n ADD CONSTRAINT plg_tasks_labels_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\n\n-- ── row security ────────────────────────────────────────────────────────\n\nALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;\n\n\n-- ── policy ──────────────────────────────────────────────────────────────\n\nCREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\n\n-- ── acl ─────────────────────────────────────────────────────────────────\n\nGRANT MAINTAIN ON TABLE public.plg_tasks_labels TO anon;\nGRANT ALL ON TABLE public.plg_tasks_labels TO authenticated;\nGRANT ALL ON TABLE public.plg_tasks_labels TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_tasks_tasks TO anon;\nGRANT ALL ON TABLE public.plg_tasks_tasks TO authenticated;\nGRANT ALL ON TABLE public.plg_tasks_tasks TO service_role;\n\n\n-- ── default privileges: restore ─────────────────────────────────────────\n-- Put back, so the NEXT thing installed inherits what the chain had.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set — %', $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEND $dp$;\n`\n\nexport const MIGRATIONS: Array<{ id: string; sql: string }> = [\n { id: \"000_baseline\", sql: MIGRATION_000_BASELINE },\n]\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { registerTranslations } from '@fayz-ai/core'\nimport {\n getTasksProvider, useTasksStore,\n registerNotesTasksAdapter, NOTE_LABEL_PREFIX,\n type TasksDataProvider, type TaskPriority,\n} from '@fayz-ai/admin'\nimport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nimport { tasksLocales } from './locales'\nimport { tasksRegistries } from './data/registries'\nimport { TasksGeneralSettings } from './components/TasksGeneralSettings'\nimport { TasksLauncher } from './components/TasksLauncher'\nimport { MIGRATIONS } 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 the shell's) */\n dataProvider?: TasksDataProvider\n /** Default priority for new tasks (default: 'medium') */\n defaultPriority?: TaskPriority\n /**\n * Show the Tasks row in the sidebar's foot. Default: true.\n *\n * The panel is worth a permanent row in a product where tasks are the work —\n * an agency, a clinic with a follow-up list. In one where they are back-office\n * (a restaurant during service), that row spends the whole shift competing\n * with the things somebody actually touches, and the badge on it is a red\n * number about paperwork. Turning it off keeps the plugin whole: the table,\n * the provider, the settings tab, the agent's tools and the onboarding rows it\n * carries all stay — only the rail entry goes.\n */\n launcher?: boolean\n}\n\nconst DEFAULT_LABELS: TasksPluginLabels = {\n drawerTitle: 'Tasks',\n settingsTitle: 'Tasks',\n quickAddPlaceholder: 'Add a task...',\n}\n\nfunction resolveConfig(options?: TasksPluginOptions): ResolvedTasksConfig {\n return {\n labels: { ...DEFAULT_LABELS, ...options?.labels },\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\n // The table moved to the spine (db 047) and so did the store, the provider and\n // the panel. What is left here is the sidebar row, the sheet fallback, the\n // label catalogue and the settings tab — the plugin is now a set of surfaces\n // over a table it no longer owns.\n const provider = options?.dataProvider ?? getTasksProvider()\n const store = useTasksStore\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 defaultAgentRole: 'setup',\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: options?.launcher === false ? [] : [\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 },\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: TasksGeneralSettings as unknown as React.ComponentType<unknown>,\n order: 14,\n },\n ],\n\n // One baseline per unit since #338 — read from the generated barrel\n // rather than listed here, so regenerating the SQL never needs a\n // manifest edit to match.\n migrations: MIGRATIONS.map((entry) => ({\n id: `tasks-${entry.id}`,\n version: '1.0.0',\n sql: entry.sql,\n description:\n 'The whole schema this plugin provisions, as one file: every table, view, function, policy and grant, plus the reference rows it seeds. Replaced the per-change chain in the 1.0.0 squash (#338); the files it collapsed are kept, unapplied, in src/migrations.archive/.',\n })),\n\n locales: tasksLocales,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports — the tasks slice lives in @fayz-ai/admin now, but this package's\n// public surface stays what it was.\n// ---------------------------------------------------------------------------\n\nexport type { ResolvedTasksConfig, TasksPluginLabels } from './context'\nexport type {\n Task, TaskLabel, TaskStatus, TaskPriority, TasksSummary,\n CreateTaskInput, UpdateTaskInput, TaskQuery, TasksDataProvider,\n} from '@fayz-ai/admin'\nexport {\n TasksPanel, TaskCard, TaskDetail, TaskQuickAdd, TasksFilterBar,\n useTasksStore, useTasksSummaryLine,\n createSupabaseTasksProvider, createMockTasksProvider,\n} from '@fayz-ai/admin'\n"]}
@@ -1,6 +1,4 @@
1
- export declare const MIGRATION_000_PLG_RENAME = "-- 000_plg_rename.sql \u2014 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";
2
- export declare 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 \u2014 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";
3
- export declare const MIGRATION_002_TASKS_TO_SPINE = "-- 002_tasks_to_spine.sql \u2014 carry this plugin's rows into the spine's tasks table.\n--\n-- public.tasks (db migration 047) is now the one table admin work lives in: the\n-- shell's getting-started checklist writes it, so it has to exist in apps that\n-- never installed this plugin. This file moves what plg_tasks_tasks already has.\n--\n-- WHY THE COPY IS HERE AND NOT IN 047. `fayz db apply` runs the spine BEFORE\n-- plugins (cli/src/lib/migration-plan.ts). On a fresh pool 047 runs while\n-- plg_tasks_tasks does not exist yet, and a checksum-frozen file cannot try\n-- again later. Here, both tables are guaranteed to exist.\n--\n-- plg_tasks_tasks is NOT dropped. It is retired in place; a later migration\n-- removes it once the fleet has been verified on the new table.\n--\n-- Idempotent.\n\nDO $$\nBEGIN\n -- An app on an older @fayz-ai/db has no spine table to copy into. Say so and\n -- leave: the plugin still works against its own table until db is upgraded.\n IF to_regclass('public.tasks') IS NULL THEN\n RAISE NOTICE 'plugin-tasks 002: public.tasks not found \u2014 upgrade @fayz-ai/db to move tasks to the spine';\n RETURN;\n END IF;\n\n IF to_regclass('public.plg_tasks_tasks') IS NULL THEN\n RETURN; -- fresh pool: nothing to carry\n END IF;\n\n -- The id is preserved deliberately. The notes bridge keys a note's todos by\n -- task id and stores the link as a 'note:<id>' string in `labels`; a new id\n -- here would orphan every note todo in the fleet.\n --\n -- Roots before children so the self-referencing parent_id always resolves.\n -- auth.uid() is NULL in a migration session and both of 047's stamping\n -- triggers COALESCE, so these explicit values win.\n INSERT INTO public.tasks (\n id, tenant_id, title, description, status, priority, due_date,\n assigned_to_id, assigned_to_name, parent_id, labels, position,\n created_by, created_by_name, owner_id, created_at, updated_at\n )\n SELECT\n src.id, src.tenant_id, src.title, src.description, src.status, src.priority, src.due_date,\n src.assigned_to_id, src.assigned_to_name, src.parent_id, src.labels, src.position,\n src.created_by_id, src.created_by_name, src.created_by_id, src.created_at, src.updated_at\n FROM public.plg_tasks_tasks src\n ORDER BY src.parent_id NULLS FIRST\n ON CONFLICT (id) DO NOTHING;\nEND $$;\n";
1
+ export declare const MIGRATION_000_BASELINE = "-- ============================================================================\n-- plugins/plugin-tasks/src/migrations/000_baseline.sql \u2014 what installing this provisions, as one file.\n--\n-- GENERATED by scripts/emit-unit-baselines.mjs (#338). Do not edit by hand:\n-- change the schema, regenerate, and let scripts/check-chain-equivalence.mjs\n-- prove the result still matches.\n--\n-- This replaced 3 migration files. They are kept, unapplied, in\n-- migrations.archive/ \u2014 a year of decisions is worth reading even when it is no\n-- longer worth replaying.\n--\n-- Object order is fixed rather than dependency-sorted: schemas, types,\n-- sequences, tables, defaults, functions, constraints, views, indexes, foreign\n-- keys, triggers, row security, policies, grants. Dependencies BETWEEN units\n-- are carried by the order packages/db/chain.json declares.\n-- ============================================================================\n\n-- A LANGUAGE sql function binds its body at CREATE time, and 570 functions\n-- sorted by name are not sorted by who calls whom. This is what lets them load\n-- in any order; every body is still compiled on first call, so a genuinely\n-- broken reference surfaces then rather than never. Session-scoped.\nSET check_function_bodies = false;\n\n\n\n-- \u2500\u2500 default privileges: reset \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n-- Cleared BEFORE anything is created, so every object below gets the ACL the\n-- dump describes rather than the image's defaults on top of it. Restored at\n-- the end of this file.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON SEQUENCES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated, service_role, fayz_connector$stmt$;\nEND $dp$;\n\n\n-- \u2500\u2500 table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nCREATE TABLE public.plg_tasks_labels (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n name text NOT NULL,\n color text DEFAULT '#6366f1'::text NOT NULL,\n is_active boolean DEFAULT true NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL\n);\n\nCREATE TABLE public.plg_tasks_tasks (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n title text NOT NULL,\n description text,\n status text DEFAULT 'todo'::text NOT NULL,\n priority text DEFAULT 'medium'::text NOT NULL,\n due_date date,\n assigned_to_id uuid,\n assigned_to_name text,\n parent_id uuid,\n labels jsonb DEFAULT '[]'::jsonb NOT NULL,\n \"position\" integer DEFAULT 0 NOT NULL,\n created_by_id uuid,\n created_by_name text,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_tasks_tasks_priority_check CHECK ((priority = ANY (ARRAY['low'::text, 'medium'::text, 'high'::text, 'urgent'::text]))),\n CONSTRAINT plg_tasks_tasks_status_check CHECK ((status = ANY (ARRAY['todo'::text, 'in_progress'::text, 'done'::text, 'cancelled'::text])))\n);\n\n\n-- \u2500\u2500 constraint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nALTER TABLE ONLY public.plg_tasks_labels\n ADD CONSTRAINT plg_tasks_labels_pkey PRIMARY KEY (id);\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_pkey PRIMARY KEY (id);\n\n\n-- \u2500\u2500 index \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nCREATE INDEX idx_plg_tasks_labels_tenant ON public.plg_tasks_labels USING btree (tenant_id);\n\nCREATE INDEX idx_plg_tasks_tasks_assigned ON public.plg_tasks_tasks USING btree (assigned_to_id);\n\nCREATE INDEX idx_plg_tasks_tasks_due ON public.plg_tasks_tasks USING btree (tenant_id, due_date) WHERE (due_date IS NOT NULL);\n\nCREATE INDEX idx_plg_tasks_tasks_parent ON public.plg_tasks_tasks USING btree (parent_id);\n\nCREATE INDEX idx_plg_tasks_tasks_status ON public.plg_tasks_tasks USING btree (tenant_id, status);\n\nCREATE INDEX idx_plg_tasks_tasks_tenant ON public.plg_tasks_tasks USING btree (tenant_id);\n\n\n-- \u2500\u2500 fk constraint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nALTER TABLE ONLY public.plg_tasks_labels\n ADD CONSTRAINT plg_tasks_labels_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES public.plg_tasks_tasks(id) ON DELETE CASCADE;\n\nALTER TABLE ONLY public.plg_tasks_tasks\n ADD CONSTRAINT plg_tasks_tasks_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n\n\n-- \u2500\u2500 row security \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nALTER TABLE public.plg_tasks_labels ENABLE ROW LEVEL SECURITY;\n\nALTER TABLE public.plg_tasks_tasks ENABLE ROW LEVEL SECURITY;\n\n\n-- \u2500\u2500 policy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nCREATE POLICY plg_tasks_labels_delete ON public.plg_tasks_labels FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_labels_select ON public.plg_tasks_labels FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_labels_update ON public.plg_tasks_labels FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_delete ON public.plg_tasks_tasks FOR DELETE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\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() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_select ON public.plg_tasks_tasks FOR SELECT TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\nCREATE POLICY plg_tasks_tasks_update ON public.plg_tasks_tasks FOR UPDATE TO authenticated USING ((tenant_id IN ( SELECT public.user_tenant_ids() AS user_tenant_ids)));\n\n\n-- \u2500\u2500 acl \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nGRANT MAINTAIN ON TABLE public.plg_tasks_labels TO anon;\nGRANT ALL ON TABLE public.plg_tasks_labels TO authenticated;\nGRANT ALL ON TABLE public.plg_tasks_labels TO service_role;\n\nGRANT MAINTAIN ON TABLE public.plg_tasks_tasks TO anon;\nGRANT ALL ON TABLE public.plg_tasks_tasks TO authenticated;\nGRANT ALL ON TABLE public.plg_tasks_tasks TO service_role;\n\n\n-- \u2500\u2500 default privileges: restore \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n-- Put back, so the NEXT thing installed inherits what the chain had.\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON SEQUENCES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON FUNCTIONS TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT MAINTAIN ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO postgres$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO anon$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO authenticated$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$ALTER DEFAULT PRIVILEGES FOR ROLE supabase_admin IN SCHEMA public GRANT ALL ON TABLES TO service_role$stmt$;\nEND $dp$;\n\nDO $dp$ BEGIN\n EXECUTE $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEXCEPTION WHEN insufficient_privilege OR undefined_object THEN\n RAISE NOTICE 'baseline: not ours to set \u2014 %', $stmt$--\n-- PostgreSQL database dump complete\n--$stmt$;\nEND $dp$;\n";
4
2
  export declare const MIGRATIONS: Array<{
5
3
  id: string;
6
4
  sql: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,4mBAYpC,CAAA;AAED,eAAO,MAAM,wBAAwB,skIAiEpC,CAAA;AAED,eAAO,MAAM,4BAA4B,yzEAiDxC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAIzD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,8rpBAmUlC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAEzD,CAAA"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "status": "beta",
5
5
  "dependencies": []
6
6
  },
7
- "version": "0.10.3",
7
+ "version": "0.10.4",
8
8
  "description": "Fayz SDK — plugin-tasks plugin",
9
9
  "type": "module",
10
10
  "sideEffects": false,
@@ -27,9 +27,9 @@
27
27
  "lucide-react": ">=0.400.0 <1.0.0"
28
28
  },
29
29
  "dependencies": {
30
- "@fayz-ai/core": "^0.18.0",
31
- "@fayz-ai/admin": "^0.18.0",
32
- "@fayz-ai/ui": "^0.18.0"
30
+ "@fayz-ai/core": "^0.19.0",
31
+ "@fayz-ai/admin": "^0.19.0",
32
+ "@fayz-ai/ui": "^0.19.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/react": "^18.3.0",