@minimalcorp/tsunagi 0.1.33 → 0.1.34

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.
Files changed (83) hide show
  1. package/.next/standalone/apps/web/.next/BUILD_ID +1 -1
  2. package/.next/standalone/apps/web/.next/build-manifest.json +3 -3
  3. package/.next/standalone/apps/web/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/apps/web/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/apps/web/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/apps/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/apps/web/.next/server/app/_not-found.html +1 -1
  13. package/.next/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
  14. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  15. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/standalone/apps/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/standalone/apps/web/.next/server/app/index.html +1 -1
  21. package/.next/standalone/apps/web/.next/server/app/index.rsc +3 -3
  22. package/.next/standalone/apps/web/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  23. package/.next/standalone/apps/web/.next/server/app/index.segments/_full.segment.rsc +3 -3
  24. package/.next/standalone/apps/web/.next/server/app/index.segments/_head.segment.rsc +1 -1
  25. package/.next/standalone/apps/web/.next/server/app/index.segments/_index.segment.rsc +2 -2
  26. package/.next/standalone/apps/web/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  27. package/.next/standalone/apps/web/.next/server/app/page.js.nft.json +1 -1
  28. package/.next/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/apps/web/.next/server/app/settings.html +1 -1
  31. package/.next/standalone/apps/web/.next/server/app/settings.rsc +3 -3
  32. package/.next/standalone/apps/web/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  33. package/.next/standalone/apps/web/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  34. package/.next/standalone/apps/web/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  35. package/.next/standalone/apps/web/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  36. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  37. package/.next/standalone/apps/web/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  38. package/.next/standalone/apps/web/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/apps/web/.next/server/chunks/ssr/{[root-of-the-server]__0r5k1o3._.js → [root-of-the-server]__0mct.7z._.js} +2 -2
  40. package/.next/standalone/apps/web/.next/server/chunks/ssr/_02dcd~k._.js +1 -1
  41. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0dar4c0._.js +1 -1
  42. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0g.cd6a._.js +1 -1
  43. package/.next/standalone/apps/web/.next/server/chunks/ssr/_0sxye4q._.js +1 -1
  44. package/.next/standalone/apps/web/.next/server/chunks/ssr/apps_web_src_app_tasks_[id]_page_tsx_0jshsm2._.js +1 -1
  45. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_03dusl-._.js → node_modules_07-e6tb._.js} +1 -1
  46. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_09g056t._.js → node_modules_0b6fjwn._.js} +1 -1
  47. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0ec.p48._.js → node_modules_0bix9lu._.js} +1 -1
  48. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0az0yoa._.js → node_modules_0fpqbi2._.js} +1 -1
  49. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_0_wjeog._.js → node_modules_0k8xmjr._.js} +1 -1
  50. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_09o-nzb._.js → node_modules_0r9vehj._.js} +1 -1
  51. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_00bsm~0._.js → node_modules_0w48uk8._.js} +1 -1
  52. package/.next/standalone/apps/web/.next/server/chunks/ssr/{node_modules_131360a._.js → node_modules_0yoat72._.js} +1 -1
  53. package/.next/standalone/apps/web/.next/server/middleware-build-manifest.js +3 -3
  54. package/.next/standalone/apps/web/.next/server/pages/404.html +1 -1
  55. package/.next/standalone/apps/web/.next/server/pages/500.html +1 -1
  56. package/.next/standalone/apps/web/.next/server/server-reference-manifest.js +1 -1
  57. package/.next/standalone/apps/web/.next/server/server-reference-manifest.json +1 -1
  58. package/.next/standalone/apps/web/.next/static/chunks/00e8eue.21.8h.css +4 -0
  59. package/.next/standalone/apps/web/.next/static/chunks/0j3485~p9pn9n.js +1 -0
  60. package/.next/standalone/apps/web/.next/static/chunks/{0szj.38-.-4p4.js → 0kmlu-0djf-rx.js} +1 -1
  61. package/.next/standalone/apps/web/.next/static/chunks/{0z8cfvtbwii50.js → 0vlse5ga2r0n7.js} +1 -1
  62. package/.next/standalone/apps/web/.next/static/chunks/{0dqv~laaou7x3.js → 0x3kp2s554oy5.js} +6 -6
  63. package/.next/standalone/apps/web/.next/static/chunks/{076mcjezjnahd.js → 13f6kj~4r5x0p.js} +1 -1
  64. package/dist/server/generated/prisma/internal/class.js +4 -4
  65. package/dist/server/generated/prisma/internal/prismaNamespace.d.ts +1 -0
  66. package/dist/server/generated/prisma/internal/prismaNamespace.js +1 -0
  67. package/dist/server/generated/prisma/internal/prismaNamespaceBrowser.d.ts +1 -0
  68. package/dist/server/generated/prisma/internal/prismaNamespaceBrowser.js +1 -0
  69. package/dist/server/generated/prisma/models/EnvironmentVariable.d.ts +0 -3
  70. package/dist/server/generated/prisma/models/Tab.d.ts +39 -1
  71. package/dist/server/lib/repositories/task.d.ts +5 -0
  72. package/dist/server/lib/repositories/task.js +13 -0
  73. package/dist/server/routes/hooks.js +21 -1
  74. package/dist/server/routes/tasks.js +20 -0
  75. package/npm-shrinkwrap.json +33 -29
  76. package/package.json +1 -1
  77. package/prisma/migrations/20260918000000_add_tab_unread/migration.sql +4 -0
  78. package/prisma/schema.prisma +2 -0
  79. package/.next/standalone/apps/web/.next/static/chunks/02k8hsfyr1oif.css +0 -4
  80. package/.next/standalone/apps/web/.next/static/chunks/0zdnw6m70_-dp.js +0 -1
  81. /package/.next/standalone/apps/web/.next/static/{fUycQdovbCSAwFW2xvyuD → mWBhkmlLJfxVxMeoAXXc3}/_buildManifest.js +0 -0
  82. /package/.next/standalone/apps/web/.next/static/{fUycQdovbCSAwFW2xvyuD → mWBhkmlLJfxVxMeoAXXc3}/_clientMiddlewareManifest.js +0 -0
  83. /package/.next/standalone/apps/web/.next/static/{fUycQdovbCSAwFW2xvyuD → mWBhkmlLJfxVxMeoAXXc3}/_ssgManifest.js +0 -0
@@ -28,6 +28,7 @@ export type TabMinAggregateOutputType = {
28
28
  startedAt: Date | null;
29
29
  completedAt: Date | null;
30
30
  todos: string | null;
31
+ unread: boolean | null;
31
32
  updatedAt: Date | null;
32
33
  };
33
34
  export type TabMaxAggregateOutputType = {
@@ -40,6 +41,7 @@ export type TabMaxAggregateOutputType = {
40
41
  startedAt: Date | null;
41
42
  completedAt: Date | null;
42
43
  todos: string | null;
44
+ unread: boolean | null;
43
45
  updatedAt: Date | null;
44
46
  };
45
47
  export type TabCountAggregateOutputType = {
@@ -52,6 +54,7 @@ export type TabCountAggregateOutputType = {
52
54
  startedAt: number;
53
55
  completedAt: number;
54
56
  todos: number;
57
+ unread: number;
55
58
  updatedAt: number;
56
59
  _all: number;
57
60
  };
@@ -71,6 +74,7 @@ export type TabMinAggregateInputType = {
71
74
  startedAt?: true;
72
75
  completedAt?: true;
73
76
  todos?: true;
77
+ unread?: true;
74
78
  updatedAt?: true;
75
79
  };
76
80
  export type TabMaxAggregateInputType = {
@@ -83,6 +87,7 @@ export type TabMaxAggregateInputType = {
83
87
  startedAt?: true;
84
88
  completedAt?: true;
85
89
  todos?: true;
90
+ unread?: true;
86
91
  updatedAt?: true;
87
92
  };
88
93
  export type TabCountAggregateInputType = {
@@ -95,6 +100,7 @@ export type TabCountAggregateInputType = {
95
100
  startedAt?: true;
96
101
  completedAt?: true;
97
102
  todos?: true;
103
+ unread?: true;
98
104
  updatedAt?: true;
99
105
  _all?: true;
100
106
  };
@@ -184,6 +190,7 @@ export type TabGroupByOutputType = {
184
190
  startedAt: Date;
185
191
  completedAt: Date | null;
186
192
  todos: string | null;
193
+ unread: boolean;
187
194
  updatedAt: Date;
188
195
  _count: TabCountAggregateOutputType | null;
189
196
  _avg: TabAvgAggregateOutputType | null;
@@ -207,6 +214,7 @@ export type TabWhereInput = {
207
214
  startedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
208
215
  completedAt?: Prisma.DateTimeNullableFilter<"Tab"> | Date | string | null;
209
216
  todos?: Prisma.StringNullableFilter<"Tab"> | string | null;
217
+ unread?: Prisma.BoolFilter<"Tab"> | boolean;
210
218
  updatedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
211
219
  task?: Prisma.XOR<Prisma.TaskScalarRelationFilter, Prisma.TaskWhereInput>;
212
220
  };
@@ -220,6 +228,7 @@ export type TabOrderByWithRelationInput = {
220
228
  startedAt?: Prisma.SortOrder;
221
229
  completedAt?: Prisma.SortOrderInput | Prisma.SortOrder;
222
230
  todos?: Prisma.SortOrderInput | Prisma.SortOrder;
231
+ unread?: Prisma.SortOrder;
223
232
  updatedAt?: Prisma.SortOrder;
224
233
  task?: Prisma.TaskOrderByWithRelationInput;
225
234
  };
@@ -236,6 +245,7 @@ export type TabWhereUniqueInput = Prisma.AtLeast<{
236
245
  startedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
237
246
  completedAt?: Prisma.DateTimeNullableFilter<"Tab"> | Date | string | null;
238
247
  todos?: Prisma.StringNullableFilter<"Tab"> | string | null;
248
+ unread?: Prisma.BoolFilter<"Tab"> | boolean;
239
249
  updatedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
240
250
  task?: Prisma.XOR<Prisma.TaskScalarRelationFilter, Prisma.TaskWhereInput>;
241
251
  }, "tabId">;
@@ -249,6 +259,7 @@ export type TabOrderByWithAggregationInput = {
249
259
  startedAt?: Prisma.SortOrder;
250
260
  completedAt?: Prisma.SortOrderInput | Prisma.SortOrder;
251
261
  todos?: Prisma.SortOrderInput | Prisma.SortOrder;
262
+ unread?: Prisma.SortOrder;
252
263
  updatedAt?: Prisma.SortOrder;
253
264
  _count?: Prisma.TabCountOrderByAggregateInput;
254
265
  _avg?: Prisma.TabAvgOrderByAggregateInput;
@@ -269,6 +280,7 @@ export type TabScalarWhereWithAggregatesInput = {
269
280
  startedAt?: Prisma.DateTimeWithAggregatesFilter<"Tab"> | Date | string;
270
281
  completedAt?: Prisma.DateTimeNullableWithAggregatesFilter<"Tab"> | Date | string | null;
271
282
  todos?: Prisma.StringNullableWithAggregatesFilter<"Tab"> | string | null;
283
+ unread?: Prisma.BoolWithAggregatesFilter<"Tab"> | boolean;
272
284
  updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Tab"> | Date | string;
273
285
  };
274
286
  export type TabCreateInput = {
@@ -280,6 +292,7 @@ export type TabCreateInput = {
280
292
  startedAt: Date | string;
281
293
  completedAt?: Date | string | null;
282
294
  todos?: string | null;
295
+ unread?: boolean;
283
296
  updatedAt?: Date | string;
284
297
  task: Prisma.TaskCreateNestedOneWithoutTabsInput;
285
298
  };
@@ -293,6 +306,7 @@ export type TabUncheckedCreateInput = {
293
306
  startedAt: Date | string;
294
307
  completedAt?: Date | string | null;
295
308
  todos?: string | null;
309
+ unread?: boolean;
296
310
  updatedAt?: Date | string;
297
311
  };
298
312
  export type TabUpdateInput = {
@@ -304,6 +318,7 @@ export type TabUpdateInput = {
304
318
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
305
319
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
306
320
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
321
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
307
322
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
308
323
  task?: Prisma.TaskUpdateOneRequiredWithoutTabsNestedInput;
309
324
  };
@@ -317,6 +332,7 @@ export type TabUncheckedUpdateInput = {
317
332
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
318
333
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
319
334
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
335
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
320
336
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
321
337
  };
322
338
  export type TabCreateManyInput = {
@@ -329,6 +345,7 @@ export type TabCreateManyInput = {
329
345
  startedAt: Date | string;
330
346
  completedAt?: Date | string | null;
331
347
  todos?: string | null;
348
+ unread?: boolean;
332
349
  updatedAt?: Date | string;
333
350
  };
334
351
  export type TabUpdateManyMutationInput = {
@@ -340,6 +357,7 @@ export type TabUpdateManyMutationInput = {
340
357
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
341
358
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
342
359
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
360
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
343
361
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
344
362
  };
345
363
  export type TabUncheckedUpdateManyInput = {
@@ -352,6 +370,7 @@ export type TabUncheckedUpdateManyInput = {
352
370
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
353
371
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
354
372
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
373
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
355
374
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
356
375
  };
357
376
  export type TabListRelationFilter = {
@@ -372,6 +391,7 @@ export type TabCountOrderByAggregateInput = {
372
391
  startedAt?: Prisma.SortOrder;
373
392
  completedAt?: Prisma.SortOrder;
374
393
  todos?: Prisma.SortOrder;
394
+ unread?: Prisma.SortOrder;
375
395
  updatedAt?: Prisma.SortOrder;
376
396
  };
377
397
  export type TabAvgOrderByAggregateInput = {
@@ -387,6 +407,7 @@ export type TabMaxOrderByAggregateInput = {
387
407
  startedAt?: Prisma.SortOrder;
388
408
  completedAt?: Prisma.SortOrder;
389
409
  todos?: Prisma.SortOrder;
410
+ unread?: Prisma.SortOrder;
390
411
  updatedAt?: Prisma.SortOrder;
391
412
  };
392
413
  export type TabMinOrderByAggregateInput = {
@@ -399,6 +420,7 @@ export type TabMinOrderByAggregateInput = {
399
420
  startedAt?: Prisma.SortOrder;
400
421
  completedAt?: Prisma.SortOrder;
401
422
  todos?: Prisma.SortOrder;
423
+ unread?: Prisma.SortOrder;
402
424
  updatedAt?: Prisma.SortOrder;
403
425
  };
404
426
  export type TabSumOrderByAggregateInput = {
@@ -442,6 +464,9 @@ export type TabUncheckedUpdateManyWithoutTaskNestedInput = {
442
464
  updateMany?: Prisma.TabUpdateManyWithWhereWithoutTaskInput | Prisma.TabUpdateManyWithWhereWithoutTaskInput[];
443
465
  deleteMany?: Prisma.TabScalarWhereInput | Prisma.TabScalarWhereInput[];
444
466
  };
467
+ export type BoolFieldUpdateOperationsInput = {
468
+ set?: boolean;
469
+ };
445
470
  export type TabCreateWithoutTaskInput = {
446
471
  tabId: string;
447
472
  order: number;
@@ -451,6 +476,7 @@ export type TabCreateWithoutTaskInput = {
451
476
  startedAt: Date | string;
452
477
  completedAt?: Date | string | null;
453
478
  todos?: string | null;
479
+ unread?: boolean;
454
480
  updatedAt?: Date | string;
455
481
  };
456
482
  export type TabUncheckedCreateWithoutTaskInput = {
@@ -462,6 +488,7 @@ export type TabUncheckedCreateWithoutTaskInput = {
462
488
  startedAt: Date | string;
463
489
  completedAt?: Date | string | null;
464
490
  todos?: string | null;
491
+ unread?: boolean;
465
492
  updatedAt?: Date | string;
466
493
  };
467
494
  export type TabCreateOrConnectWithoutTaskInput = {
@@ -497,6 +524,7 @@ export type TabScalarWhereInput = {
497
524
  startedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
498
525
  completedAt?: Prisma.DateTimeNullableFilter<"Tab"> | Date | string | null;
499
526
  todos?: Prisma.StringNullableFilter<"Tab"> | string | null;
527
+ unread?: Prisma.BoolFilter<"Tab"> | boolean;
500
528
  updatedAt?: Prisma.DateTimeFilter<"Tab"> | Date | string;
501
529
  };
502
530
  export type TabCreateManyTaskInput = {
@@ -508,6 +536,7 @@ export type TabCreateManyTaskInput = {
508
536
  startedAt: Date | string;
509
537
  completedAt?: Date | string | null;
510
538
  todos?: string | null;
539
+ unread?: boolean;
511
540
  updatedAt?: Date | string;
512
541
  };
513
542
  export type TabUpdateWithoutTaskInput = {
@@ -519,6 +548,7 @@ export type TabUpdateWithoutTaskInput = {
519
548
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
520
549
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
521
550
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
551
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
522
552
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
523
553
  };
524
554
  export type TabUncheckedUpdateWithoutTaskInput = {
@@ -530,6 +560,7 @@ export type TabUncheckedUpdateWithoutTaskInput = {
530
560
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
531
561
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
532
562
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
563
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
533
564
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
534
565
  };
535
566
  export type TabUncheckedUpdateManyWithoutTaskInput = {
@@ -541,6 +572,7 @@ export type TabUncheckedUpdateManyWithoutTaskInput = {
541
572
  startedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
542
573
  completedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null;
543
574
  todos?: Prisma.NullableStringFieldUpdateOperationsInput | string | null;
575
+ unread?: Prisma.BoolFieldUpdateOperationsInput | boolean;
544
576
  updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string;
545
577
  };
546
578
  export type TabSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -553,6 +585,7 @@ export type TabSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = ru
553
585
  startedAt?: boolean;
554
586
  completedAt?: boolean;
555
587
  todos?: boolean;
588
+ unread?: boolean;
556
589
  updatedAt?: boolean;
557
590
  task?: boolean | Prisma.TaskDefaultArgs<ExtArgs>;
558
591
  }, ExtArgs["result"]["tab"]>;
@@ -566,6 +599,7 @@ export type TabSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extension
566
599
  startedAt?: boolean;
567
600
  completedAt?: boolean;
568
601
  todos?: boolean;
602
+ unread?: boolean;
569
603
  updatedAt?: boolean;
570
604
  task?: boolean | Prisma.TaskDefaultArgs<ExtArgs>;
571
605
  }, ExtArgs["result"]["tab"]>;
@@ -579,6 +613,7 @@ export type TabSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extension
579
613
  startedAt?: boolean;
580
614
  completedAt?: boolean;
581
615
  todos?: boolean;
616
+ unread?: boolean;
582
617
  updatedAt?: boolean;
583
618
  task?: boolean | Prisma.TaskDefaultArgs<ExtArgs>;
584
619
  }, ExtArgs["result"]["tab"]>;
@@ -592,9 +627,10 @@ export type TabSelectScalar = {
592
627
  startedAt?: boolean;
593
628
  completedAt?: boolean;
594
629
  todos?: boolean;
630
+ unread?: boolean;
595
631
  updatedAt?: boolean;
596
632
  };
597
- export type TabOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"tabId" | "taskId" | "order" | "status" | "mode" | "createdAt" | "startedAt" | "completedAt" | "todos" | "updatedAt", ExtArgs["result"]["tab"]>;
633
+ export type TabOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"tabId" | "taskId" | "order" | "status" | "mode" | "createdAt" | "startedAt" | "completedAt" | "todos" | "unread" | "updatedAt", ExtArgs["result"]["tab"]>;
598
634
  export type TabInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
599
635
  task?: boolean | Prisma.TaskDefaultArgs<ExtArgs>;
600
636
  };
@@ -619,6 +655,7 @@ export type $TabPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs =
619
655
  startedAt: Date;
620
656
  completedAt: Date | null;
621
657
  todos: string | null;
658
+ unread: boolean;
622
659
  updatedAt: Date;
623
660
  }, ExtArgs["result"]["tab"]>;
624
661
  composites: {};
@@ -984,6 +1021,7 @@ export interface TabFieldRefs {
984
1021
  readonly startedAt: Prisma.FieldRef<"Tab", 'DateTime'>;
985
1022
  readonly completedAt: Prisma.FieldRef<"Tab", 'DateTime'>;
986
1023
  readonly todos: Prisma.FieldRef<"Tab", 'String'>;
1024
+ readonly unread: Prisma.FieldRef<"Tab", 'Boolean'>;
987
1025
  readonly updatedAt: Prisma.FieldRef<"Tab", 'DateTime'>;
988
1026
  }
989
1027
  /**
@@ -17,6 +17,11 @@ export declare function createTab(taskId: string, mode?: Tab['mode']): Promise<T
17
17
  export declare function getTab(taskId: string, tab_id: string): Promise<Tab | null>;
18
18
  export declare function updateTab(taskId: string, tab_id: string, updates: Partial<Omit<Tab, 'tab_id' | 'order' | 'startedAt'>>): Promise<Tab | null>;
19
19
  export declare function deleteTab(taskId: string, tab_id: string): Promise<boolean>;
20
+ /**
21
+ * タスク配下の全タブを既読にする。
22
+ * 「タスク詳細を開く = 確認した」とみなすため、タブ単位ではなくタスク単位で落とす。
23
+ */
24
+ export declare function markTaskTabsRead(taskId: string): Promise<number>;
20
25
  /**
21
26
  * タスクステータスを遷移させる
22
27
  */
@@ -156,6 +156,7 @@ export async function updateTab(taskId, tab_id, updates) {
156
156
  where: { tabId: tab_id },
157
157
  data: {
158
158
  ...(updates.status && { status: updates.status }),
159
+ ...(updates.unread !== undefined && { unread: updates.unread }),
159
160
  ...(updates.completedAt !== undefined && {
160
161
  completedAt: updates.completedAt ? new Date(updates.completedAt) : null,
161
162
  }),
@@ -178,6 +179,17 @@ export async function deleteTab(taskId, tab_id) {
178
179
  return false;
179
180
  }
180
181
  }
182
+ /**
183
+ * タスク配下の全タブを既読にする。
184
+ * 「タスク詳細を開く = 確認した」とみなすため、タブ単位ではなくタスク単位で落とす。
185
+ */
186
+ export async function markTaskTabsRead(taskId) {
187
+ const result = await prisma.tab.updateMany({
188
+ where: { taskId, unread: true },
189
+ data: { unread: false },
190
+ });
191
+ return result.count;
192
+ }
181
193
  // ============================================
182
194
  // Claude Tool関数(タスクワークフロー用)
183
195
  // ============================================
@@ -229,6 +241,7 @@ function mapTab(tab) {
229
241
  order: tab.order,
230
242
  status: tab.status,
231
243
  mode: tab.mode,
244
+ unread: tab.unread,
232
245
  todos: tab.todos ? JSON.parse(tab.todos) : [],
233
246
  startedAt: tab.startedAt.toISOString(),
234
247
  completedAt: tab.completedAt?.toISOString(),
@@ -11,14 +11,34 @@ function tasksToTodos(tasks) {
11
11
  status: t.status,
12
12
  }));
13
13
  }
14
- /** DBでタブのステータス(+ todos)を直接更新する */
14
+ /**
15
+ * status から未読フラグを導出する。
16
+ * 完了(success/error)で未読を立て、再実行・セッション終了で落とす。
17
+ * web 側 (apps/web/src/lib/claude-status.ts の unreadForStatus) と同じルール。
18
+ */
19
+ function unreadForStatus(status) {
20
+ switch (status) {
21
+ case 'success':
22
+ case 'error':
23
+ return true;
24
+ case 'running':
25
+ case 'idle':
26
+ return false;
27
+ default:
28
+ // waiting 等は未読状態を変えない
29
+ return undefined;
30
+ }
31
+ }
32
+ /** DBでタブのステータス(+ todos / 未読フラグ)を直接更新する */
15
33
  async function updateTabStatus(sessionId, status, todos) {
16
34
  try {
35
+ const unread = unreadForStatus(status);
17
36
  const result = await prisma.tab.updateMany({
18
37
  where: { tabId: sessionId },
19
38
  data: {
20
39
  status,
21
40
  ...(todos !== undefined && { todos: JSON.stringify(todos) }),
41
+ ...(unread !== undefined && { unread }),
22
42
  },
23
43
  });
24
44
  return { count: result.count };
@@ -288,6 +288,26 @@ export async function tasksRoutes(fastify) {
288
288
  return reply.status(500).send({ error: errorMessage });
289
289
  }
290
290
  });
291
+ // POST /tasks/:id/read - タスク配下の全タブを既読にする(詳細画面を開いた = 確認した)
292
+ fastify.post('/tasks/:id/read', async (request, reply) => {
293
+ try {
294
+ const { id: taskId } = request.params;
295
+ const markedCount = await taskRepo.markTaskTabsRead(taskId);
296
+ const task = await taskRepo.getTask(taskId);
297
+ if (!task) {
298
+ return reply.status(404).send({ error: 'Task not found' });
299
+ }
300
+ // 既読化を他の画面(ボード等)にも反映する。変化が無いときは通知不要
301
+ if (markedCount > 0) {
302
+ io.emit('task:updated', { task });
303
+ }
304
+ return reply.status(200).send({ data: { task } });
305
+ }
306
+ catch (error) {
307
+ fastify.log.error(error, 'POST /tasks/:id/read error');
308
+ return reply.status(500).send({ error: 'Failed to mark task as read' });
309
+ }
310
+ });
291
311
  // GET /tasks/:id/tabs
292
312
  fastify.get('/tasks/:id/tabs', async (request, reply) => {
293
313
  try {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@minimalcorp/tsunagi",
9
- "version": "0.1.33",
9
+ "version": "0.1.34",
10
10
  "license": "SEE LICENSE IN LICENSE",
11
11
  "os": [
12
12
  "darwin",
@@ -84,9 +84,9 @@
84
84
  }
85
85
  },
86
86
  "node_modules/@fastify/ajv-compiler/node_modules/fast-uri": {
87
- "version": "4.1.4",
88
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.1.4.tgz",
89
- "integrity": "sha512-dODXrIxlS9JSdgAnhIUKOosKV1oMtU2VtVw87QRaHzyl5jxO290Ii5tEZfCfzfWNHi3jKWwBSdQj0qIyshdZdQ==",
87
+ "version": "4.1.5",
88
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.1.5.tgz",
89
+ "integrity": "sha512-vZeoMRB4epNr7QfdHxel7te/RcX16CxyXI07JCCTFWZA2s4v1azGNESRj+2EoaHSaWFL/Z3GmKT2jF6A202jLg==",
90
90
  "funding": [
91
91
  {
92
92
  "type": "github",
@@ -257,9 +257,9 @@
257
257
  }
258
258
  },
259
259
  "node_modules/@fastify/proxy-addr": {
260
- "version": "5.1.0",
261
- "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz",
262
- "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==",
260
+ "version": "5.1.1",
261
+ "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.1.tgz",
262
+ "integrity": "sha512-zv07Y9GEuDsJPegZoDFd4SDWaZOW8N2pa0GSrYmKpId/tjt1Hgo3BjZBVjdVpfVrHaA+Qv5jawtS2O50J5xM9g==",
263
263
  "funding": [
264
264
  {
265
265
  "type": "github",
@@ -1189,9 +1189,9 @@
1189
1189
  "license": "MIT"
1190
1190
  },
1191
1191
  "node_modules/@types/node": {
1192
- "version": "26.5.1",
1193
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.5.1.tgz",
1194
- "integrity": "sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g==",
1192
+ "version": "26.6.1",
1193
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.1.tgz",
1194
+ "integrity": "sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==",
1195
1195
  "license": "MIT",
1196
1196
  "dependencies": {
1197
1197
  "undici-types": "~8.9.0"
@@ -2264,9 +2264,9 @@
2264
2264
  }
2265
2265
  },
2266
2266
  "node_modules/fast-json-stringify/node_modules/fast-uri": {
2267
- "version": "4.1.4",
2268
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.1.4.tgz",
2269
- "integrity": "sha512-dODXrIxlS9JSdgAnhIUKOosKV1oMtU2VtVw87QRaHzyl5jxO290Ii5tEZfCfzfWNHi3jKWwBSdQj0qIyshdZdQ==",
2267
+ "version": "4.1.5",
2268
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.1.5.tgz",
2269
+ "integrity": "sha512-vZeoMRB4epNr7QfdHxel7te/RcX16CxyXI07JCCTFWZA2s4v1azGNESRj+2EoaHSaWFL/Z3GmKT2jF6A202jLg==",
2270
2270
  "funding": [
2271
2271
  {
2272
2272
  "type": "github",
@@ -2289,9 +2289,9 @@
2289
2289
  }
2290
2290
  },
2291
2291
  "node_modules/fast-uri": {
2292
- "version": "3.1.7",
2293
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz",
2294
- "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==",
2292
+ "version": "3.1.8",
2293
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz",
2294
+ "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==",
2295
2295
  "funding": [
2296
2296
  {
2297
2297
  "type": "github",
@@ -2591,9 +2591,9 @@
2591
2591
  }
2592
2592
  },
2593
2593
  "node_modules/hono": {
2594
- "version": "4.13.7",
2595
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.7.tgz",
2596
- "integrity": "sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==",
2594
+ "version": "4.13.8",
2595
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.8.tgz",
2596
+ "integrity": "sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==",
2597
2597
  "license": "MIT",
2598
2598
  "engines": {
2599
2599
  "node": ">=16.9.0"
@@ -2651,9 +2651,9 @@
2651
2651
  }
2652
2652
  },
2653
2653
  "node_modules/ip-address": {
2654
- "version": "10.7.0",
2655
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.0.tgz",
2656
- "integrity": "sha512-BGFsyJd5mpXp3rK6jIdADLNgpJUK1jnjzvYF8lK+VyDab9JAmqN0YOKDdP17HlgKb2+ehPgDc8EtnRLbGCAMhA==",
2654
+ "version": "10.7.2",
2655
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz",
2656
+ "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==",
2657
2657
  "license": "MIT",
2658
2658
  "engines": {
2659
2659
  "node": ">= 12"
@@ -3274,9 +3274,9 @@
3274
3274
  "license": "ISC"
3275
3275
  },
3276
3276
  "node_modules/proxy-addr": {
3277
- "version": "2.0.7",
3278
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
3279
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
3277
+ "version": "2.0.8",
3278
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz",
3279
+ "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==",
3280
3280
  "license": "MIT",
3281
3281
  "dependencies": {
3282
3282
  "forwarded": "0.2.0",
@@ -3284,6 +3284,10 @@
3284
3284
  },
3285
3285
  "engines": {
3286
3286
  "node": ">= 0.10"
3287
+ },
3288
+ "funding": {
3289
+ "type": "opencollective",
3290
+ "url": "https://opencollective.com/express"
3287
3291
  }
3288
3292
  },
3289
3293
  "node_modules/proxy-addr/node_modules/ipaddr.js": {
@@ -4037,9 +4041,9 @@
4037
4041
  }
4038
4042
  },
4039
4043
  "node_modules/zod": {
4040
- "version": "4.6.2",
4041
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.2.tgz",
4042
- "integrity": "sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==",
4044
+ "version": "4.6.5",
4045
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz",
4046
+ "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==",
4043
4047
  "license": "MIT",
4044
4048
  "funding": {
4045
4049
  "url": "https://github.com/sponsors/colinhacks"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minimalcorp/tsunagi",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "description": "Multi-repo GitHub project management with Claude AI integration, designed for visualizing and controlling AI-driven development locally.",
5
5
  "keywords": [
6
6
  "tsunagi",
@@ -0,0 +1,4 @@
1
+ -- AlterTable
2
+ -- 完了(success/error)したがタスク詳細で未確認のタブを示すフラグ。
3
+ -- 既存タブは全て確認済み扱いとするため backfill はしない。
4
+ ALTER TABLE "tabs" ADD COLUMN "unread" BOOLEAN NOT NULL DEFAULT false;
@@ -65,6 +65,8 @@ model Tab {
65
65
  startedAt DateTime @map("started_at")
66
66
  completedAt DateTime? @map("completed_at")
67
67
  todos String? @default("[]") // JSON: Todo[]
68
+ // 完了(success/error)したがタスク詳細で未確認であることを示す。詳細を開くとfalseになる
69
+ unread Boolean @default(false)
68
70
  updatedAt DateTime @updatedAt @map("updated_at")
69
71
 
70
72
  task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)