@noclaf/cli 0.8.0 → 0.9.0
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/README.md +26 -88
- package/dist/app.js +13 -0
- package/dist/app.js.map +1 -0
- package/dist/brand.js +9 -49
- package/dist/brand.js.map +1 -1
- package/dist/cli.js +3 -37
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.js +3 -187
- package/dist/mcp-server.js.map +1 -1
- package/package.json +8 -17
- package/dist/adapters/supabase/allocation-gateway.js +0 -291
- package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
- package/dist/adapters/supabase/analytics-gateway.js +0 -18
- package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
- package/dist/adapters/supabase/calendar-gateway.js +0 -48
- package/dist/adapters/supabase/calendar-gateway.js.map +0 -1
- package/dist/adapters/supabase/calendar-write-gateway.js +0 -35
- package/dist/adapters/supabase/calendar-write-gateway.js.map +0 -1
- package/dist/adapters/supabase/checklist-gateway.js +0 -63
- package/dist/adapters/supabase/checklist-gateway.js.map +0 -1
- package/dist/adapters/supabase/client.js +0 -136
- package/dist/adapters/supabase/client.js.map +0 -1
- package/dist/adapters/supabase/context-gateway.js +0 -23
- package/dist/adapters/supabase/context-gateway.js.map +0 -1
- package/dist/adapters/supabase/gateway.js +0 -28
- package/dist/adapters/supabase/gateway.js.map +0 -1
- package/dist/adapters/supabase/release-gateway.js +0 -61
- package/dist/adapters/supabase/release-gateway.js.map +0 -1
- package/dist/adapters/supabase/sprint-gateway.js +0 -59
- package/dist/adapters/supabase/sprint-gateway.js.map +0 -1
- package/dist/adapters/supabase/task-gateway.js +0 -533
- package/dist/adapters/supabase/task-gateway.js.map +0 -1
- package/dist/auth.js +0 -141
- package/dist/auth.js.map +0 -1
- package/dist/cli/commands/auth.js +0 -127
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/clean.js +0 -120
- package/dist/cli/commands/clean.js.map +0 -1
- package/dist/cli/commands/completion.js +0 -114
- package/dist/cli/commands/completion.js.map +0 -1
- package/dist/cli/commands/exec.js +0 -69
- package/dist/cli/commands/exec.js.map +0 -1
- package/dist/cli/commands/init/analyze-step.js +0 -21
- package/dist/cli/commands/init/analyze-step.js.map +0 -1
- package/dist/cli/commands/init/apply-answers.js +0 -122
- package/dist/cli/commands/init/apply-answers.js.map +0 -1
- package/dist/cli/commands/init/apply-step.js +0 -165
- package/dist/cli/commands/init/apply-step.js.map +0 -1
- package/dist/cli/commands/init/auth-step.js +0 -48
- package/dist/cli/commands/init/auth-step.js.map +0 -1
- package/dist/cli/commands/init/boilerplate-step.js +0 -20
- package/dist/cli/commands/init/boilerplate-step.js.map +0 -1
- package/dist/cli/commands/init/clients-step.js +0 -78
- package/dist/cli/commands/init/clients-step.js.map +0 -1
- package/dist/cli/commands/init/context-step.js +0 -81
- package/dist/cli/commands/init/context-step.js.map +0 -1
- package/dist/cli/commands/init/describe-step.js +0 -68
- package/dist/cli/commands/init/describe-step.js.map +0 -1
- package/dist/cli/commands/init/index.js +0 -98
- package/dist/cli/commands/init/index.js.map +0 -1
- package/dist/cli/commands/init/mode.js +0 -18
- package/dist/cli/commands/init/mode.js.map +0 -1
- package/dist/cli/commands/init/progress.js +0 -60
- package/dist/cli/commands/init/progress.js.map +0 -1
- package/dist/cli/commands/init/project-step.js +0 -133
- package/dist/cli/commands/init/project-step.js.map +0 -1
- package/dist/cli/commands/init/provision-step.js +0 -103
- package/dist/cli/commands/init/provision-step.js.map +0 -1
- package/dist/cli/commands/map.js +0 -18
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/plan.js +0 -45
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/skills.js +0 -23
- package/dist/cli/commands/skills.js.map +0 -1
- package/dist/cli/commands/sync.js +0 -319
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/validate-plan.js +0 -42
- package/dist/cli/commands/validate-plan.js.map +0 -1
- package/dist/cli/commands/wave.js +0 -57
- package/dist/cli/commands/wave.js.map +0 -1
- package/dist/cli/copy/auth.json +0 -6
- package/dist/cli/copy/flows.json +0 -6
- package/dist/cli/copy/init.json +0 -20
- package/dist/cli/copy/sync.json +0 -3
- package/dist/cli/copy.js +0 -23
- package/dist/cli/copy.js.map +0 -1
- package/dist/cli/flows/clients.js +0 -130
- package/dist/cli/flows/clients.js.map +0 -1
- package/dist/cli/flows/completion.js +0 -63
- package/dist/cli/flows/completion.js.map +0 -1
- package/dist/cli/flows/dependencies.js +0 -114
- package/dist/cli/flows/dependencies.js.map +0 -1
- package/dist/cli/flows/sections.js +0 -85
- package/dist/cli/flows/sections.js.map +0 -1
- package/dist/cli/flows/user-config.js +0 -37
- package/dist/cli/flows/user-config.js.map +0 -1
- package/dist/cli/ui/render.js +0 -239
- package/dist/cli/ui/render.js.map +0 -1
- package/dist/cli/ui/report.js +0 -130
- package/dist/cli/ui/report.js.map +0 -1
- package/dist/config.js +0 -289
- package/dist/config.js.map +0 -1
- package/dist/constants.js +0 -9
- package/dist/constants.js.map +0 -1
- package/dist/core/ports.js +0 -2
- package/dist/core/ports.js.map +0 -1
- package/dist/core/types.js +0 -5
- package/dist/core/types.js.map +0 -1
- package/dist/database.types.js +0 -11
- package/dist/database.types.js.map +0 -1
- package/dist/lib/active-project.js +0 -28
- package/dist/lib/active-project.js.map +0 -1
- package/dist/lib/autopull.js +0 -13
- package/dist/lib/autopull.js.map +0 -1
- package/dist/lib/boilerplate-scaffold.js +0 -65
- package/dist/lib/boilerplate-scaffold.js.map +0 -1
- package/dist/lib/boilerplates.js +0 -61
- package/dist/lib/boilerplates.js.map +0 -1
- package/dist/lib/calendar-logic.js +0 -59
- package/dist/lib/calendar-logic.js.map +0 -1
- package/dist/lib/calendar-write-logic.js +0 -6
- package/dist/lib/calendar-write-logic.js.map +0 -1
- package/dist/lib/checklist-logic.js +0 -5
- package/dist/lib/checklist-logic.js.map +0 -1
- package/dist/lib/client-configs.js +0 -191
- package/dist/lib/client-configs.js.map +0 -1
- package/dist/lib/client-install.js +0 -40
- package/dist/lib/client-install.js.map +0 -1
- package/dist/lib/colors.js +0 -92
- package/dist/lib/colors.js.map +0 -1
- package/dist/lib/cowork-extension.js +0 -143
- package/dist/lib/cowork-extension.js.map +0 -1
- package/dist/lib/dates.js +0 -21
- package/dist/lib/dates.js.map +0 -1
- package/dist/lib/dependencies.js +0 -145
- package/dist/lib/dependencies.js.map +0 -1
- package/dist/lib/dependency-install.js +0 -163
- package/dist/lib/dependency-install.js.map +0 -1
- package/dist/lib/duration.js +0 -5
- package/dist/lib/duration.js.map +0 -1
- package/dist/lib/exec-delegate.js +0 -218
- package/dist/lib/exec-delegate.js.map +0 -1
- package/dist/lib/exec-engines.js +0 -90
- package/dist/lib/exec-engines.js.map +0 -1
- package/dist/lib/exec-events.js +0 -87
- package/dist/lib/exec-events.js.map +0 -1
- package/dist/lib/exec-translators.js +0 -198
- package/dist/lib/exec-translators.js.map +0 -1
- package/dist/lib/file-merge.js +0 -33
- package/dist/lib/file-merge.js.map +0 -1
- package/dist/lib/git-exposure.js +0 -35
- package/dist/lib/git-exposure.js.map +0 -1
- package/dist/lib/harness.js +0 -127
- package/dist/lib/harness.js.map +0 -1
- package/dist/lib/hooks.js +0 -216
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/patterns.js +0 -25
- package/dist/lib/patterns.js.map +0 -1
- package/dist/lib/pg-error.js +0 -53
- package/dist/lib/pg-error.js.map +0 -1
- package/dist/lib/plan-delegate.js +0 -117
- package/dist/lib/plan-delegate.js.map +0 -1
- package/dist/lib/project-context.js +0 -151
- package/dist/lib/project-context.js.map +0 -1
- package/dist/lib/prompts.js +0 -69
- package/dist/lib/prompts.js.map +0 -1
- package/dist/lib/provision-apply.js +0 -220
- package/dist/lib/provision-apply.js.map +0 -1
- package/dist/lib/provision-collect.js +0 -47
- package/dist/lib/provision-collect.js.map +0 -1
- package/dist/lib/provision.js +0 -45
- package/dist/lib/provision.js.map +0 -1
- package/dist/lib/release-logic.js +0 -10
- package/dist/lib/release-logic.js.map +0 -1
- package/dist/lib/repo-map.js +0 -176
- package/dist/lib/repo-map.js.map +0 -1
- package/dist/lib/require-config.js +0 -32
- package/dist/lib/require-config.js.map +0 -1
- package/dist/lib/rules.js +0 -146
- package/dist/lib/rules.js.map +0 -1
- package/dist/lib/sections.js +0 -89
- package/dist/lib/sections.js.map +0 -1
- package/dist/lib/skill-agent.js +0 -44
- package/dist/lib/skill-agent.js.map +0 -1
- package/dist/lib/skill-serve.js +0 -128
- package/dist/lib/skill-serve.js.map +0 -1
- package/dist/lib/skills-cache.js +0 -99
- package/dist/lib/skills-cache.js.map +0 -1
- package/dist/lib/skills.js +0 -237
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/sprint-deadline.js +0 -28
- package/dist/lib/sprint-deadline.js.map +0 -1
- package/dist/lib/sprint-logic.js +0 -31
- package/dist/lib/sprint-logic.js.map +0 -1
- package/dist/lib/targets.js +0 -150
- package/dist/lib/targets.js.map +0 -1
- package/dist/lib/task-history.js +0 -15
- package/dist/lib/task-history.js.map +0 -1
- package/dist/lib/telemetry.js +0 -51
- package/dist/lib/telemetry.js.map +0 -1
- package/dist/lib/tool-result.js +0 -15
- package/dist/lib/tool-result.js.map +0 -1
- package/dist/lib/validate-plan-delegate.js +0 -106
- package/dist/lib/validate-plan-delegate.js.map +0 -1
- package/dist/lib/version-check.js +0 -89
- package/dist/lib/version-check.js.map +0 -1
- package/dist/lib/wave-scheduler.js +0 -95
- package/dist/lib/wave-scheduler.js.map +0 -1
- package/dist/session-factory.js +0 -19
- package/dist/session-factory.js.map +0 -1
- package/dist/spinner.js +0 -12
- package/dist/spinner.js.map +0 -1
- package/dist/tools/activate-sprint.js +0 -44
- package/dist/tools/activate-sprint.js.map +0 -1
- package/dist/tools/add-checklist-item.js +0 -44
- package/dist/tools/add-checklist-item.js.map +0 -1
- package/dist/tools/add-checklist.js +0 -63
- package/dist/tools/add-checklist.js.map +0 -1
- package/dist/tools/add-holiday.js +0 -41
- package/dist/tools/add-holiday.js.map +0 -1
- package/dist/tools/add-home-office.js +0 -31
- package/dist/tools/add-home-office.js.map +0 -1
- package/dist/tools/add-vacation.js +0 -39
- package/dist/tools/add-vacation.js.map +0 -1
- package/dist/tools/attach-pr.js +0 -97
- package/dist/tools/attach-pr.js.map +0 -1
- package/dist/tools/comment-task.js +0 -72
- package/dist/tools/comment-task.js.map +0 -1
- package/dist/tools/create-release.js +0 -46
- package/dist/tools/create-release.js.map +0 -1
- package/dist/tools/create-sprint.js +0 -66
- package/dist/tools/create-sprint.js.map +0 -1
- package/dist/tools/create-task.js +0 -174
- package/dist/tools/create-task.js.map +0 -1
- package/dist/tools/delegate-exec.js +0 -63
- package/dist/tools/delegate-exec.js.map +0 -1
- package/dist/tools/end-allocation.js +0 -38
- package/dist/tools/end-allocation.js.map +0 -1
- package/dist/tools/end-sprint.js +0 -37
- package/dist/tools/end-sprint.js.map +0 -1
- package/dist/tools/end-task-allocation.js +0 -60
- package/dist/tools/end-task-allocation.js.map +0 -1
- package/dist/tools/exec-status.js +0 -45
- package/dist/tools/exec-status.js.map +0 -1
- package/dist/tools/finalize-release.js +0 -45
- package/dist/tools/finalize-release.js.map +0 -1
- package/dist/tools/get-active-allocation.js +0 -69
- package/dist/tools/get-active-allocation.js.map +0 -1
- package/dist/tools/get-calendar.js +0 -40
- package/dist/tools/get-calendar.js.map +0 -1
- package/dist/tools/get-context.js +0 -48
- package/dist/tools/get-context.js.map +0 -1
- package/dist/tools/get-sprint.js +0 -38
- package/dist/tools/get-sprint.js.map +0 -1
- package/dist/tools/get-task.js +0 -146
- package/dist/tools/get-task.js.map +0 -1
- package/dist/tools/index.js +0 -92
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/list-my-allocations.js +0 -71
- package/dist/tools/list-my-allocations.js.map +0 -1
- package/dist/tools/list-projects.js +0 -38
- package/dist/tools/list-projects.js.map +0 -1
- package/dist/tools/list-releases.js +0 -32
- package/dist/tools/list-releases.js.map +0 -1
- package/dist/tools/list-sprints.js +0 -30
- package/dist/tools/list-sprints.js.map +0 -1
- package/dist/tools/list-tasks.js +0 -95
- package/dist/tools/list-tasks.js.map +0 -1
- package/dist/tools/move-task.js +0 -82
- package/dist/tools/move-task.js.map +0 -1
- package/dist/tools/plan.js +0 -56
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/record-delivery.js +0 -100
- package/dist/tools/record-delivery.js.map +0 -1
- package/dist/tools/remove-checklist-item.js +0 -42
- package/dist/tools/remove-checklist-item.js.map +0 -1
- package/dist/tools/remove-checklist.js +0 -42
- package/dist/tools/remove-checklist.js.map +0 -1
- package/dist/tools/remove-holiday.js +0 -31
- package/dist/tools/remove-holiday.js.map +0 -1
- package/dist/tools/remove-home-office.js +0 -32
- package/dist/tools/remove-home-office.js.map +0 -1
- package/dist/tools/remove-vacation.js +0 -31
- package/dist/tools/remove-vacation.js.map +0 -1
- package/dist/tools/set-project.js +0 -52
- package/dist/tools/set-project.js.map +0 -1
- package/dist/tools/set-review.js +0 -132
- package/dist/tools/set-review.js.map +0 -1
- package/dist/tools/sprint-common.js +0 -13
- package/dist/tools/sprint-common.js.map +0 -1
- package/dist/tools/start-allocation.js +0 -32
- package/dist/tools/start-allocation.js.map +0 -1
- package/dist/tools/start-task-allocation.js +0 -83
- package/dist/tools/start-task-allocation.js.map +0 -1
- package/dist/tools/update-checklist-item.js +0 -51
- package/dist/tools/update-checklist-item.js.map +0 -1
- package/dist/tools/update-release.js +0 -58
- package/dist/tools/update-release.js.map +0 -1
- package/dist/tools/update-sprint.js +0 -56
- package/dist/tools/update-sprint.js.map +0 -1
- package/dist/tools/update-task.js +0 -183
- package/dist/tools/update-task.js.map +0 -1
- package/dist/tools/validate-plan.js +0 -58
- package/dist/tools/validate-plan.js.map +0 -1
- package/dist/version.js +0 -16
- package/dist/version.js.map +0 -1
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Escolhe qual timer parar entre os abertos. Puro.
|
|
3
|
-
* Com `taskId`, filtra pelo dela; sem, só decide sozinho se houver exatamente um.
|
|
4
|
-
* Devolve `null` quando não há nada a parar, ou a lista quando fica ambíguo.
|
|
5
|
-
*/
|
|
6
|
-
export function pickTaskAllocationToClose(open, taskId) {
|
|
7
|
-
const candidates = taskId ? open.filter((o) => o.task_id === taskId) : open;
|
|
8
|
-
return candidates.length === 0 ? null : candidates;
|
|
9
|
-
}
|
|
10
|
-
/** Monta a referência legível de um timer aberto (pra desambiguação). Pura. */
|
|
11
|
-
export function toOpenTaskAllocationRef(open, task) {
|
|
12
|
-
return {
|
|
13
|
-
task_allocation_id: open.id,
|
|
14
|
-
task_id: open.task_id,
|
|
15
|
-
task_key: task?.key ?? null,
|
|
16
|
-
task_title: task?.title ?? null,
|
|
17
|
-
start_time: open.start_time,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/** Adaptador Supabase do `AllocationGateway` (ponto do dia + timers de task). */
|
|
21
|
-
export function allocationGateway(db) {
|
|
22
|
-
return {
|
|
23
|
-
async startAllocation(userId) {
|
|
24
|
-
const activeRes = await db
|
|
25
|
-
.from('allocations')
|
|
26
|
-
.select('id, start_time')
|
|
27
|
-
.eq('user_id', userId)
|
|
28
|
-
.is('end_time', null)
|
|
29
|
-
.maybeSingle();
|
|
30
|
-
if (activeRes.error)
|
|
31
|
-
throw new Error(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
32
|
-
if (activeRes.data)
|
|
33
|
-
return { allocation: activeRes.data, alreadyActive: true };
|
|
34
|
-
const insertRes = await db
|
|
35
|
-
.from('allocations')
|
|
36
|
-
.insert({ user_id: userId })
|
|
37
|
-
.select('id, start_time')
|
|
38
|
-
.single();
|
|
39
|
-
if (insertRes.error)
|
|
40
|
-
throw new Error(`Erro ao iniciar alocação: ${insertRes.error.message}`);
|
|
41
|
-
return { allocation: insertRes.data, alreadyActive: false };
|
|
42
|
-
},
|
|
43
|
-
async endAllocation(userId) {
|
|
44
|
-
const activeRes = await db
|
|
45
|
-
.from('allocations')
|
|
46
|
-
.select('id, start_time')
|
|
47
|
-
.eq('user_id', userId)
|
|
48
|
-
.is('end_time', null)
|
|
49
|
-
.maybeSingle();
|
|
50
|
-
if (activeRes.error)
|
|
51
|
-
throw new Error(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
52
|
-
if (!activeRes.data)
|
|
53
|
-
return null;
|
|
54
|
-
const allocationId = activeRes.data.id;
|
|
55
|
-
const now = new Date().toISOString();
|
|
56
|
-
// Fecha task_allocations abertas dessa allocation em paralelo com o close da allocation.
|
|
57
|
-
const [taskCloseRes, allocCloseRes] = await Promise.all([
|
|
58
|
-
db
|
|
59
|
-
.from('task_allocations')
|
|
60
|
-
.update({ end_time: now })
|
|
61
|
-
.eq('allocation_id', allocationId)
|
|
62
|
-
.is('end_time', null)
|
|
63
|
-
.select('id'),
|
|
64
|
-
db
|
|
65
|
-
.from('allocations')
|
|
66
|
-
.update({ end_time: now })
|
|
67
|
-
.eq('id', allocationId)
|
|
68
|
-
.select('id, start_time, end_time')
|
|
69
|
-
.single(),
|
|
70
|
-
]);
|
|
71
|
-
if (taskCloseRes.error)
|
|
72
|
-
throw new Error(`Erro ao fechar task_allocations: ${taskCloseRes.error.message}`);
|
|
73
|
-
if (allocCloseRes.error)
|
|
74
|
-
throw new Error(`Erro ao encerrar alocação: ${allocCloseRes.error.message}`);
|
|
75
|
-
return { closed: allocCloseRes.data, closedTaskAllocations: (taskCloseRes.data ?? []).length };
|
|
76
|
-
},
|
|
77
|
-
async endTaskAllocation(userId, taskId) {
|
|
78
|
-
// Lista (não `maybeSingle`): com timers simultâneos há mais de uma aberta por usuário.
|
|
79
|
-
const openRes = await db
|
|
80
|
-
.from('task_allocations')
|
|
81
|
-
.select('id, task_id, start_time')
|
|
82
|
-
.eq('user_id', userId)
|
|
83
|
-
.is('end_time', null)
|
|
84
|
-
.order('start_time', { ascending: true });
|
|
85
|
-
if (openRes.error)
|
|
86
|
-
throw new Error(`Erro ao buscar task_allocations ativas: ${openRes.error.message}`);
|
|
87
|
-
const open = openRes.data ?? [];
|
|
88
|
-
const picked = pickTaskAllocationToClose(open, taskId);
|
|
89
|
-
if (!picked)
|
|
90
|
-
return null;
|
|
91
|
-
if (picked.length > 1) {
|
|
92
|
-
const { tasksById } = await loadTaskAndProjectRefs(db, picked.map((o) => o.task_id));
|
|
93
|
-
return { ambiguous: picked.map((o) => toOpenTaskAllocationRef(o, tasksById.get(o.task_id) ?? null)) };
|
|
94
|
-
}
|
|
95
|
-
const active = picked[0];
|
|
96
|
-
const now = new Date().toISOString();
|
|
97
|
-
const closeRes = await db
|
|
98
|
-
.from('task_allocations')
|
|
99
|
-
.update({ end_time: now })
|
|
100
|
-
.eq('id', active.id)
|
|
101
|
-
.select('id, start_time, end_time')
|
|
102
|
-
.single();
|
|
103
|
-
if (closeRes.error)
|
|
104
|
-
throw new Error(`Erro ao parar task_allocation: ${closeRes.error.message}`);
|
|
105
|
-
// Info da task é best-effort (não falha o close se a task sumiu).
|
|
106
|
-
const taskRes = await db
|
|
107
|
-
.from('tasks')
|
|
108
|
-
.select('id, key, title')
|
|
109
|
-
.eq('id', active.task_id)
|
|
110
|
-
.maybeSingle();
|
|
111
|
-
const task = taskRes.data ?? { id: active.task_id, key: null, title: null };
|
|
112
|
-
return { closed: closeRes.data, task };
|
|
113
|
-
},
|
|
114
|
-
async listMyAllocations(userId, opts) {
|
|
115
|
-
let query = db
|
|
116
|
-
.from('allocations')
|
|
117
|
-
.select('id, start_time, end_time, auto_closed')
|
|
118
|
-
.eq('user_id', userId)
|
|
119
|
-
.not('end_time', 'is', null);
|
|
120
|
-
if (opts.from)
|
|
121
|
-
query = query.gte('start_time', `${opts.from.slice(0, 10)}T00:00:00Z`);
|
|
122
|
-
if (opts.to)
|
|
123
|
-
query = query.lte('start_time', `${opts.to.slice(0, 10)}T23:59:59Z`);
|
|
124
|
-
query = query
|
|
125
|
-
.order('start_time', { ascending: false })
|
|
126
|
-
.range(opts.offset, opts.offset + opts.limit - 1);
|
|
127
|
-
const { data, error } = await query;
|
|
128
|
-
if (error)
|
|
129
|
-
throw new Error(`Erro ao listar alocações: ${error.message}`);
|
|
130
|
-
const allocations = data ?? [];
|
|
131
|
-
if (allocations.length === 0)
|
|
132
|
-
return { allocations: [], segments: [] };
|
|
133
|
-
const segRes = await db
|
|
134
|
-
.from('task_allocations')
|
|
135
|
-
.select('allocation_id, start_time, end_time')
|
|
136
|
-
.in('allocation_id', allocations.map((a) => a.id));
|
|
137
|
-
if (segRes.error)
|
|
138
|
-
throw new Error(`Erro ao buscar segmentos: ${segRes.error.message}`);
|
|
139
|
-
return { allocations, segments: segRes.data ?? [] };
|
|
140
|
-
},
|
|
141
|
-
async getActiveAllocation(userId) {
|
|
142
|
-
const allocRes = await db
|
|
143
|
-
.from('allocations')
|
|
144
|
-
.select('id, start_time')
|
|
145
|
-
.eq('user_id', userId)
|
|
146
|
-
.is('end_time', null)
|
|
147
|
-
.maybeSingle();
|
|
148
|
-
if (allocRes.error)
|
|
149
|
-
throw new Error(`Erro ao buscar alocação ativa: ${allocRes.error.message}`);
|
|
150
|
-
if (!allocRes.data)
|
|
151
|
-
return null;
|
|
152
|
-
const allocation = allocRes.data;
|
|
153
|
-
const segmentsRes = await db
|
|
154
|
-
.from('task_allocations')
|
|
155
|
-
.select('id, task_id, start_time, end_time, is_overtime')
|
|
156
|
-
.eq('allocation_id', allocation.id)
|
|
157
|
-
.order('start_time', { ascending: true });
|
|
158
|
-
if (segmentsRes.error)
|
|
159
|
-
throw new Error(`Erro ao buscar segmentos: ${segmentsRes.error.message}`);
|
|
160
|
-
const segments = segmentsRes.data ?? [];
|
|
161
|
-
const { tasksById, projectsById } = await loadTaskAndProjectRefs(db, Array.from(new Set(segments.map((s) => s.task_id))));
|
|
162
|
-
return { allocation, segments, tasksById, projectsById };
|
|
163
|
-
},
|
|
164
|
-
async startTaskAllocation(taskId, projectId, userId, isOvertime, concurrent) {
|
|
165
|
-
const taskRes = await db
|
|
166
|
-
.from('tasks')
|
|
167
|
-
.select('id, key, title, project_id')
|
|
168
|
-
.eq('id', taskId)
|
|
169
|
-
.eq('project_id', projectId)
|
|
170
|
-
.maybeSingle();
|
|
171
|
-
if (taskRes.error)
|
|
172
|
-
throw new Error(`Erro ao buscar tarefa: ${taskRes.error.message}`);
|
|
173
|
-
if (!taskRes.data)
|
|
174
|
-
return null;
|
|
175
|
-
const task = taskRes.data;
|
|
176
|
-
const now = new Date().toISOString();
|
|
177
|
-
// Timer já rodando pra essa task → devolve o existente. Abrir um segundo contaria a
|
|
178
|
-
// mesma task duas vezes no relatório de horas.
|
|
179
|
-
const runningRes = await db
|
|
180
|
-
.from('task_allocations')
|
|
181
|
-
.select('id, start_time, is_overtime')
|
|
182
|
-
.eq('user_id', userId)
|
|
183
|
-
.eq('task_id', taskId)
|
|
184
|
-
.is('end_time', null)
|
|
185
|
-
.limit(1);
|
|
186
|
-
if (runningRes.error)
|
|
187
|
-
throw new Error(`Erro ao buscar timer da tarefa: ${runningRes.error.message}`);
|
|
188
|
-
const running = (runningRes.data ?? [])[0];
|
|
189
|
-
if (running) {
|
|
190
|
-
return {
|
|
191
|
-
alreadyRunning: true,
|
|
192
|
-
taskAllocation: running,
|
|
193
|
-
task: { id: task.id, key: task.key, title: task.title },
|
|
194
|
-
previousClosed: [],
|
|
195
|
-
allocationWasCreated: false,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
const alloc = await ensureActiveAllocation(db, userId);
|
|
199
|
-
// `concurrent` = timers simultâneos: mantém os outros rodando em vez da transição atômica.
|
|
200
|
-
const previousClosed = concurrent ? [] : await closeOtherTaskAllocations(db, userId, now);
|
|
201
|
-
const insertRes = await db
|
|
202
|
-
.from('task_allocations')
|
|
203
|
-
.insert({ allocation_id: alloc.allocationId, task_id: taskId, user_id: userId, start_time: now, is_overtime: isOvertime })
|
|
204
|
-
.select('id, start_time, is_overtime')
|
|
205
|
-
.single();
|
|
206
|
-
if (insertRes.error)
|
|
207
|
-
throw new Error(`Erro ao iniciar task_allocation: ${insertRes.error.message}`);
|
|
208
|
-
return {
|
|
209
|
-
alreadyRunning: false,
|
|
210
|
-
taskAllocation: insertRes.data,
|
|
211
|
-
task: { id: task.id, key: task.key, title: task.title },
|
|
212
|
-
previousClosed,
|
|
213
|
-
allocationWasCreated: alloc.wasCreated,
|
|
214
|
-
};
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
async function loadTaskAndProjectRefs(db, taskIds) {
|
|
219
|
-
const tasksById = new Map();
|
|
220
|
-
const projectsById = new Map();
|
|
221
|
-
if (taskIds.length === 0)
|
|
222
|
-
return { tasksById, projectsById };
|
|
223
|
-
const tasksRes = await db.from('tasks').select('id, key, title, project_id').in('id', taskIds);
|
|
224
|
-
if (tasksRes.error)
|
|
225
|
-
throw new Error(`Erro ao buscar tarefas: ${tasksRes.error.message}`);
|
|
226
|
-
for (const t of tasksRes.data ?? []) {
|
|
227
|
-
tasksById.set(t.id, { key: t.key, title: t.title, project_id: t.project_id });
|
|
228
|
-
}
|
|
229
|
-
const projectIds = Array.from(new Set((tasksRes.data ?? []).map((t) => t.project_id)));
|
|
230
|
-
if (projectIds.length > 0) {
|
|
231
|
-
const projectsRes = await db.from('projects').select('id, name').in('id', projectIds);
|
|
232
|
-
if (projectsRes.error)
|
|
233
|
-
throw new Error(`Erro ao buscar projetos: ${projectsRes.error.message}`);
|
|
234
|
-
for (const p of projectsRes.data ?? [])
|
|
235
|
-
projectsById.set(p.id, p.name);
|
|
236
|
-
}
|
|
237
|
-
return { tasksById, projectsById };
|
|
238
|
-
}
|
|
239
|
-
/** Reaproveita a allocation (ponto) ativa do usuário ou cria uma. */
|
|
240
|
-
async function ensureActiveAllocation(db, userId) {
|
|
241
|
-
const activeAllocRes = await db
|
|
242
|
-
.from('allocations')
|
|
243
|
-
.select('id')
|
|
244
|
-
.eq('user_id', userId)
|
|
245
|
-
.is('end_time', null)
|
|
246
|
-
.maybeSingle();
|
|
247
|
-
if (activeAllocRes.error)
|
|
248
|
-
throw new Error(`Erro ao buscar alocação ativa: ${activeAllocRes.error.message}`);
|
|
249
|
-
if (activeAllocRes.data)
|
|
250
|
-
return { allocationId: activeAllocRes.data.id, wasCreated: false };
|
|
251
|
-
const newAlloc = await db.from('allocations').insert({ user_id: userId }).select('id').single();
|
|
252
|
-
if (newAlloc.error)
|
|
253
|
-
throw new Error(`Erro ao iniciar alocação: ${newAlloc.error.message}`);
|
|
254
|
-
return { allocationId: newAlloc.data.id, wasCreated: true };
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Modo exclusivo (`concurrent: false`): fecha TODAS as task_allocations abertas do usuário.
|
|
258
|
-
* Lista em vez de `maybeSingle` porque o modo concorrente permite várias abertas ao mesmo tempo.
|
|
259
|
-
*/
|
|
260
|
-
async function closeOtherTaskAllocations(db, userId, now) {
|
|
261
|
-
const openRes = await db
|
|
262
|
-
.from('task_allocations')
|
|
263
|
-
.select('id, task_id, start_time')
|
|
264
|
-
.eq('user_id', userId)
|
|
265
|
-
.is('end_time', null)
|
|
266
|
-
.order('start_time', { ascending: true });
|
|
267
|
-
if (openRes.error)
|
|
268
|
-
throw new Error(`Erro ao buscar task_allocations ativas: ${openRes.error.message}`);
|
|
269
|
-
const open = openRes.data ?? [];
|
|
270
|
-
if (open.length === 0)
|
|
271
|
-
return [];
|
|
272
|
-
const closeRes = await db
|
|
273
|
-
.from('task_allocations')
|
|
274
|
-
.update({ end_time: now })
|
|
275
|
-
.in('id', open.map((o) => o.id))
|
|
276
|
-
.select('id, start_time, end_time');
|
|
277
|
-
if (closeRes.error)
|
|
278
|
-
throw new Error(`Erro ao fechar task_allocations anteriores: ${closeRes.error.message}`);
|
|
279
|
-
// Keys das tasks anteriores são best-effort (retorno informativo).
|
|
280
|
-
const { tasksById } = await loadTaskAndProjectRefs(db, open.map((o) => o.task_id));
|
|
281
|
-
const taskIdByAllocation = new Map(open.map((o) => [o.id, o.task_id]));
|
|
282
|
-
return (closeRes.data ?? []).map((c) => {
|
|
283
|
-
const taskId = taskIdByAllocation.get(c.id) ?? '';
|
|
284
|
-
return {
|
|
285
|
-
prev: { id: c.id, task_id: taskId },
|
|
286
|
-
closed: { start_time: c.start_time, end_time: c.end_time },
|
|
287
|
-
prevTaskKey: tasksById.get(taskId)?.key ?? null,
|
|
288
|
-
};
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
//# sourceMappingURL=allocation-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"allocation-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/allocation-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { track as trackUsage } from '../../lib/telemetry.js';
|
|
2
|
-
/** Adaptador Supabase do `AnalyticsGateway` (entregas + telemetria de uso). */
|
|
3
|
-
export function analyticsGateway(db) {
|
|
4
|
-
return {
|
|
5
|
-
async recordDelivery(row) {
|
|
6
|
-
// `deliveries` ainda não está nos types gerados (rode `gen:types` após a migration)
|
|
7
|
-
// — usamos o client destipado só pra este insert.
|
|
8
|
-
const raw = db;
|
|
9
|
-
const { error } = await raw.from('deliveries').insert(row);
|
|
10
|
-
if (error)
|
|
11
|
-
throw new Error(`Erro ao registrar entrega: ${error.message}`);
|
|
12
|
-
},
|
|
13
|
-
track(event) {
|
|
14
|
-
trackUsage(db, event);
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=analytics-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analytics-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/analytics-gateway.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAmB,MAAM,wBAAwB,CAAC;AAE9E,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,EAAY;IAC3C,OAAO;QACL,KAAK,CAAC,cAAc,CAAC,GAAkB;YACrC,oFAAoF;YACpF,kDAAkD;YAClD,MAAM,GAAG,GAAG,EAA+B,CAAC;YAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,CAAC,KAAiB;YACrB,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { FINISHED_FILTER } from '../../core/types.js';
|
|
2
|
-
/** Adaptador Supabase do `CalendarGateway` (leitura do calendário pessoal). */
|
|
3
|
-
export function calendarGateway(db) {
|
|
4
|
-
const ok = (r, what) => {
|
|
5
|
-
if (r.error)
|
|
6
|
-
throw new Error(`Erro ao ler ${what}: ${r.error.message}`);
|
|
7
|
-
return r.data ?? [];
|
|
8
|
-
};
|
|
9
|
-
const names = async (ids) => {
|
|
10
|
-
if (ids.length === 0)
|
|
11
|
-
return new Map();
|
|
12
|
-
const rows = ok(await db.from('profiles').select('id, full_name').in('id', ids), 'perfis');
|
|
13
|
-
return new Map(rows.map((p) => [p.id, p.full_name ?? 'Sem nome']));
|
|
14
|
-
};
|
|
15
|
-
return {
|
|
16
|
-
async getCalendarSources(userId, from, to) {
|
|
17
|
-
const [holidays, vacations, homeOffice, releases, people, tasks] = await Promise.all([
|
|
18
|
-
db.from('holidays').select('id, date, name, type, scope').gte('date', from).lte('date', to),
|
|
19
|
-
db.from('vacations').select('id, user_id, start_date, end_date, notes').lte('start_date', to).gte('end_date', from),
|
|
20
|
-
db.from('home_office_days').select('user_id, date').gte('date', from).lte('date', to),
|
|
21
|
-
db.from('releases').select('project_id, name, status, target_date').gte('target_date', from).lte('target_date', to),
|
|
22
|
-
db.from('profiles').select('full_name, birth_date, company_anniversary_date').eq('is_active', true),
|
|
23
|
-
db.from('tasks')
|
|
24
|
-
.select('key, title, status, end_date, task_assignees!inner(user_id), projects(name)')
|
|
25
|
-
.eq('task_assignees.user_id', userId)
|
|
26
|
-
.gte('end_date', from).lte('end_date', to)
|
|
27
|
-
.not('status', 'in', FINISHED_FILTER),
|
|
28
|
-
]);
|
|
29
|
-
const vac = ok(vacations, 'férias');
|
|
30
|
-
const ho = ok(homeOffice, 'home office');
|
|
31
|
-
const name = await names([...new Set([...vac.map((v) => v.user_id), ...ho.map((h) => h.user_id)])]);
|
|
32
|
-
return {
|
|
33
|
-
holidays: ok(holidays, 'feriados'),
|
|
34
|
-
deadlines: ok(tasks, 'prazos').map((t) => ({
|
|
35
|
-
key: t.key, title: t.title, status: t.status, end_date: t.end_date,
|
|
36
|
-
project: t.projects?.name ?? '',
|
|
37
|
-
})),
|
|
38
|
-
vacations: vac.map((v) => ({ ...v, person: name.get(v.user_id) ?? 'Sem nome' })),
|
|
39
|
-
homeOffice: ho.map((h) => ({ date: h.date, person: name.get(h.user_id) ?? 'Sem nome' })),
|
|
40
|
-
releases: ok(releases, 'releases'),
|
|
41
|
-
people: ok(people, 'perfis').map((p) => ({
|
|
42
|
-
name: p.full_name ?? 'Sem nome', birth_date: p.birth_date, company_anniversary_date: p.company_anniversary_date,
|
|
43
|
-
})),
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=calendar-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/calendar-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/** Adaptador Supabase da escrita no calendário; RLS decide quem pode. */
|
|
2
|
-
export function calendarWriteGateway(db) {
|
|
3
|
-
const one = (r, what) => {
|
|
4
|
-
if (r.error || !r.data)
|
|
5
|
-
throw new Error(`Erro ao ${what}: ${r.error?.message ?? 'sem retorno'}`);
|
|
6
|
-
return r.data;
|
|
7
|
-
};
|
|
8
|
-
const many = (r, what) => {
|
|
9
|
-
if (r.error)
|
|
10
|
-
throw new Error(`Erro ao ${what}: ${r.error.message}`);
|
|
11
|
-
return r.data ?? [];
|
|
12
|
-
};
|
|
13
|
-
return {
|
|
14
|
-
async addHoliday(h) {
|
|
15
|
-
return one(await db.from('holidays').insert(h).select('id').single(), 'criar feriado');
|
|
16
|
-
},
|
|
17
|
-
async removeHoliday(id) {
|
|
18
|
-
return many(await db.from('holidays').delete().eq('id', id).select('id'), 'excluir feriado');
|
|
19
|
-
},
|
|
20
|
-
async addVacation(v) {
|
|
21
|
-
return one(await db.from('vacations').insert(v).select('id').single(), 'criar férias');
|
|
22
|
-
},
|
|
23
|
-
async removeVacation(id) {
|
|
24
|
-
return many(await db.from('vacations').delete().eq('id', id).select('id'), 'excluir férias');
|
|
25
|
-
},
|
|
26
|
-
async addHomeOffice(userId, date) {
|
|
27
|
-
return one(await db.from('home_office_days').insert({ user_id: userId, date }).select('id').single(), 'criar home office');
|
|
28
|
-
},
|
|
29
|
-
async removeHomeOffice(userId, date) {
|
|
30
|
-
const r = await db.from('home_office_days').delete().eq('user_id', userId).eq('date', date).select('id');
|
|
31
|
-
return many(r, 'excluir home office');
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=calendar-write-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-write-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/calendar-write-gateway.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,MAAM,GAAG,GAAG,CAAI,CAAwD,EAAE,IAAY,EAAK,EAAE;QAC3F,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC;QACjG,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAI,CAA0D,EAAE,IAAY,EAAO,EAAE;QAChG,IAAI,CAAC,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,CAAC;YAChB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC/F,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,CAAC;YACjB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/F,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI;YAC9B,OAAO,GAAG,CACR,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EACzF,mBAAmB,CACpB,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI;YACjC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzG,OAAO,IAAI,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { nextItemOrder } from '../../lib/checklist-logic.js';
|
|
2
|
-
/** Adaptador Supabase da edição de checklists; a posse é validada via task -> projeto. */
|
|
3
|
-
export function checklistGateway(db) {
|
|
4
|
-
const fail = (what, e) => {
|
|
5
|
-
if (e)
|
|
6
|
-
throw new Error(`Erro ao ${what}: ${e.message}`);
|
|
7
|
-
};
|
|
8
|
-
const inProject = async (taskId, projectId) => {
|
|
9
|
-
const r = await db.from('tasks').select('id').eq('id', taskId).eq('project_id', projectId).maybeSingle();
|
|
10
|
-
fail('validar tarefa', r.error);
|
|
11
|
-
return !!r.data;
|
|
12
|
-
};
|
|
13
|
-
const itemTask = async (itemId, projectId) => {
|
|
14
|
-
const r = await db.from('task_checklist_items').select('task_id').eq('id', itemId).maybeSingle();
|
|
15
|
-
fail('ler item', r.error);
|
|
16
|
-
return r.data && (await inProject(r.data.task_id, projectId)) ? r.data.task_id : null;
|
|
17
|
-
};
|
|
18
|
-
const listTask = async (listId, projectId) => {
|
|
19
|
-
const r = await db.from('task_checklists').select('task_id').eq('id', listId).maybeSingle();
|
|
20
|
-
fail('ler checklist', r.error);
|
|
21
|
-
return r.data && (await inProject(r.data.task_id, projectId)) ? r.data.task_id : null;
|
|
22
|
-
};
|
|
23
|
-
return {
|
|
24
|
-
async updateChecklistItem(projectId, itemId, patch) {
|
|
25
|
-
if (!(await itemTask(itemId, projectId)))
|
|
26
|
-
return null;
|
|
27
|
-
const r = await db.from('task_checklist_items').update(patch).eq('id', itemId).select('id, text, checked');
|
|
28
|
-
fail('atualizar item', r.error);
|
|
29
|
-
return r.data?.[0] ?? null;
|
|
30
|
-
},
|
|
31
|
-
async addChecklistItem(projectId, checklistId, text) {
|
|
32
|
-
const taskId = await listTask(checklistId, projectId);
|
|
33
|
-
if (!taskId)
|
|
34
|
-
return null;
|
|
35
|
-
const cur = await db.from('task_checklist_items').select('order').eq('checklist_id', checklistId);
|
|
36
|
-
fail('ler itens', cur.error);
|
|
37
|
-
const order = nextItemOrder((cur.data ?? []).map((i) => i.order));
|
|
38
|
-
const r = await db
|
|
39
|
-
.from('task_checklist_items')
|
|
40
|
-
.insert({ task_id: taskId, checklist_id: checklistId, text, checked: false, order })
|
|
41
|
-
.select('id')
|
|
42
|
-
.single();
|
|
43
|
-
fail('criar item', r.error);
|
|
44
|
-
return { id: r.data.id, order };
|
|
45
|
-
},
|
|
46
|
-
async removeChecklistItem(projectId, itemId) {
|
|
47
|
-
if (!(await itemTask(itemId, projectId)))
|
|
48
|
-
return null;
|
|
49
|
-
const r = await db.from('task_checklist_items').delete().eq('id', itemId).select('id');
|
|
50
|
-
fail('remover item', r.error);
|
|
51
|
-
return r.data ?? [];
|
|
52
|
-
},
|
|
53
|
-
async removeChecklist(projectId, checklistId) {
|
|
54
|
-
if (!(await listTask(checklistId, projectId)))
|
|
55
|
-
return null;
|
|
56
|
-
// itens saem junto: FK checklist_id ON DELETE CASCADE.
|
|
57
|
-
const r = await db.from('task_checklists').delete().eq('id', checklistId).select('id');
|
|
58
|
-
fail('remover checklist', r.error);
|
|
59
|
-
return r.data ?? [];
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
//# sourceMappingURL=checklist-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checklist-gateway.js","sourceRoot":"","sources":["../../../src/adapters/supabase/checklist-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { createClient } from '@supabase/supabase-js';
|
|
2
|
-
import { CREDENTIALS_FILE, SUPABASE_URL, SUPABASE_ANON_KEY } from '../../constants.js';
|
|
3
|
-
import { loadCredentials, exchangePatForJwt, patchCachedSession, } from '../../auth.js';
|
|
4
|
-
import { brand } from '../../brand.js';
|
|
5
|
-
/** Margem proativa antes do `exp`: usada tanto pro refresh em runtime quanto
|
|
6
|
-
* pra decidir se um JWT cacheado em disco ainda serve. */
|
|
7
|
-
export const TOKEN_REFRESH_MARGIN_SECONDS = 300;
|
|
8
|
-
/**
|
|
9
|
-
* JWT cacheado ainda serve? Reusar evita mintar outro magic link por processo
|
|
10
|
-
* (cada troca gera um novo). Cache parcial/corrompido (falta token, exp ou
|
|
11
|
-
* usuário) cai pro caminho de troca normal, igual a um `pat`-só legado.
|
|
12
|
-
*/
|
|
13
|
-
export function hasUsableCachedToken(creds, now = Math.floor(Date.now() / 1000)) {
|
|
14
|
-
return (typeof creds.access_token === 'string' &&
|
|
15
|
-
typeof creds.expires_at === 'number' &&
|
|
16
|
-
!!creds.user &&
|
|
17
|
-
creds.expires_at - TOKEN_REFRESH_MARGIN_SECONDS > now);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Lê o `exp` (epoch em segundos) do payload de um JWT. Retorna 0 se não der pra
|
|
21
|
-
* parsear — o chamador trata 0 como "sem validade conhecida" e cai no fallback.
|
|
22
|
-
*/
|
|
23
|
-
function jwtExp(token) {
|
|
24
|
-
try {
|
|
25
|
-
const payload = token.split('.')[1];
|
|
26
|
-
if (!payload)
|
|
27
|
-
return 0;
|
|
28
|
-
const json = JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
|
|
29
|
-
return typeof json.exp === 'number' ? json.exp : 0;
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return 0;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/** Validade absoluta (epoch em s) da troca: usa o `exp` do JWT; se ilegível, deriva do `expires_in`. */
|
|
36
|
-
function computeExp(exchange) {
|
|
37
|
-
const fromJwt = jwtExp(exchange.access_token);
|
|
38
|
-
if (fromJwt > 0)
|
|
39
|
-
return fromJwt;
|
|
40
|
-
return Math.floor(Date.now() / 1000) + (exchange.expires_in ?? 0);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Carrega PAT, reusa um JWT cacheado se ainda servir ou troca por um novo, e
|
|
44
|
-
* retorna client Supabase autenticado.
|
|
45
|
-
*
|
|
46
|
-
* Cada troca de PAT minta um magic link novo no mcp-token-exchange; rodar
|
|
47
|
-
* vários `noclaf` em sequência (ex.: o wizard do Studio chamando `init
|
|
48
|
-
* --projects` e depois `init --apply`) sem cache esgota o rate limit de
|
|
49
|
-
* magic link por hora. Por isso o JWT (e sua validade) é persistido em
|
|
50
|
-
* `credentials.json` ao lado do `pat` e reusado entre processos enquanto
|
|
51
|
-
* ainda estiver dentro da margem — ver `hasUsableCachedToken`.
|
|
52
|
-
*
|
|
53
|
-
* O JWT do mcp-token-exchange tem `exp` fixo e o client não tem refresh
|
|
54
|
-
* (autoRefreshToken:false). Chumbar o token num header estático fazia toda chamada
|
|
55
|
-
* falhar com "JWT expired" depois do exp, até reconectar o MCP (que reinicia o
|
|
56
|
-
* processo → nova troca). Em vez disso injetamos um JWT fresco por request via fetch
|
|
57
|
-
* custom, re-trocando o PAT (durável e re-trocável) de duas formas:
|
|
58
|
-
* - **proativa**: quando falta <300s pro exp (margem larga que absorve skew de relógio);
|
|
59
|
-
* - **reativa (one-shot)**: se o servidor devolver 401 (ex.: skew mandou um JWT já
|
|
60
|
-
* expirado), força uma troca fresca e repete a MESMA request UMA vez.
|
|
61
|
-
* Assim a sessão dura indefinidamente sem reconnect, mesmo com relógio dessincronizado.
|
|
62
|
-
* Toda troca (inicial ou re-troca) é persistida de volta no cache.
|
|
63
|
-
*
|
|
64
|
-
* Throw se não há PAT salvo, ou se a troca inicial falhar.
|
|
65
|
-
*/
|
|
66
|
-
export async function createAuthenticatedClient() {
|
|
67
|
-
const creds = await loadCredentials();
|
|
68
|
-
if (!creds) {
|
|
69
|
-
throw new Error(`Nenhum token encontrado. Rode \`${brand.name} login <PAT>\` antes.`);
|
|
70
|
-
}
|
|
71
|
-
const { pat } = creds;
|
|
72
|
-
let token;
|
|
73
|
-
let exp;
|
|
74
|
-
let user;
|
|
75
|
-
if (hasUsableCachedToken(creds)) {
|
|
76
|
-
token = creds.access_token;
|
|
77
|
-
exp = creds.expires_at;
|
|
78
|
-
user = creds.user;
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
const first = await exchangePatForJwt(pat);
|
|
82
|
-
token = first.access_token;
|
|
83
|
-
exp = computeExp(first);
|
|
84
|
-
user = first.user;
|
|
85
|
-
await patchCachedSession(CREDENTIALS_FILE, pat, { access_token: token, expires_at: exp, user });
|
|
86
|
-
}
|
|
87
|
-
// Re-troca o PAT por um JWT novo, deduplicando trocas concorrentes numa única
|
|
88
|
-
// promise pra não disparar N requests ao token-exchange quando várias tools
|
|
89
|
-
// chamam junto. Usado tanto pela checagem proativa quanto pelo retry reativo.
|
|
90
|
-
let refreshing = null;
|
|
91
|
-
function refreshOnce() {
|
|
92
|
-
if (!refreshing) {
|
|
93
|
-
refreshing = (async () => {
|
|
94
|
-
const fresh = await exchangePatForJwt(pat);
|
|
95
|
-
token = fresh.access_token;
|
|
96
|
-
exp = computeExp(fresh);
|
|
97
|
-
await patchCachedSession(CREDENTIALS_FILE, pat, {
|
|
98
|
-
access_token: token,
|
|
99
|
-
expires_at: exp,
|
|
100
|
-
user: fresh.user,
|
|
101
|
-
});
|
|
102
|
-
})().finally(() => {
|
|
103
|
-
refreshing = null;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
return refreshing;
|
|
107
|
-
}
|
|
108
|
-
// Proativo: refresca quando falta <TOKEN_REFRESH_MARGIN_SECONDS pro exp.
|
|
109
|
-
async function validToken() {
|
|
110
|
-
const now = Math.floor(Date.now() / 1000);
|
|
111
|
-
if (exp - TOKEN_REFRESH_MARGIN_SECONDS > now)
|
|
112
|
-
return token;
|
|
113
|
-
await refreshOnce();
|
|
114
|
-
return token;
|
|
115
|
-
}
|
|
116
|
-
const authFetch = async (input, init, retried = false) => {
|
|
117
|
-
const headers = new Headers(init?.headers);
|
|
118
|
-
headers.set('Authorization', `Bearer ${await validToken()}`);
|
|
119
|
-
const res = await fetch(input, { ...init, headers });
|
|
120
|
-
// Reativo (one-shot): se o servidor rejeita o token (401) — ex.: skew mandou um
|
|
121
|
-
// JWT já expirado — força uma troca fresca e repete a MESMA request uma vez.
|
|
122
|
-
if (res.status === 401 && !retried) {
|
|
123
|
-
await refreshOnce();
|
|
124
|
-
return authFetch(input, init, true);
|
|
125
|
-
}
|
|
126
|
-
return res;
|
|
127
|
-
};
|
|
128
|
-
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
129
|
-
auth: { persistSession: false, autoRefreshToken: false },
|
|
130
|
-
// Cast: nosso wrapper não implementa `fetch.preconnect` (que o supabase-js
|
|
131
|
-
// nunca chama), mas o tipo `Fetch` é `typeof fetch` e exige a propriedade.
|
|
132
|
-
global: { fetch: authFetch },
|
|
133
|
-
});
|
|
134
|
-
return { supabase, user };
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=client.js.map
|