@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.
Files changed (306) hide show
  1. package/README.md +26 -88
  2. package/dist/app.js +13 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/brand.js +9 -49
  5. package/dist/brand.js.map +1 -1
  6. package/dist/cli.js +3 -37
  7. package/dist/cli.js.map +1 -1
  8. package/dist/mcp-server.js +3 -187
  9. package/dist/mcp-server.js.map +1 -1
  10. package/package.json +8 -17
  11. package/dist/adapters/supabase/allocation-gateway.js +0 -291
  12. package/dist/adapters/supabase/allocation-gateway.js.map +0 -1
  13. package/dist/adapters/supabase/analytics-gateway.js +0 -18
  14. package/dist/adapters/supabase/analytics-gateway.js.map +0 -1
  15. package/dist/adapters/supabase/calendar-gateway.js +0 -48
  16. package/dist/adapters/supabase/calendar-gateway.js.map +0 -1
  17. package/dist/adapters/supabase/calendar-write-gateway.js +0 -35
  18. package/dist/adapters/supabase/calendar-write-gateway.js.map +0 -1
  19. package/dist/adapters/supabase/checklist-gateway.js +0 -63
  20. package/dist/adapters/supabase/checklist-gateway.js.map +0 -1
  21. package/dist/adapters/supabase/client.js +0 -136
  22. package/dist/adapters/supabase/client.js.map +0 -1
  23. package/dist/adapters/supabase/context-gateway.js +0 -23
  24. package/dist/adapters/supabase/context-gateway.js.map +0 -1
  25. package/dist/adapters/supabase/gateway.js +0 -28
  26. package/dist/adapters/supabase/gateway.js.map +0 -1
  27. package/dist/adapters/supabase/release-gateway.js +0 -61
  28. package/dist/adapters/supabase/release-gateway.js.map +0 -1
  29. package/dist/adapters/supabase/sprint-gateway.js +0 -59
  30. package/dist/adapters/supabase/sprint-gateway.js.map +0 -1
  31. package/dist/adapters/supabase/task-gateway.js +0 -533
  32. package/dist/adapters/supabase/task-gateway.js.map +0 -1
  33. package/dist/auth.js +0 -141
  34. package/dist/auth.js.map +0 -1
  35. package/dist/cli/commands/auth.js +0 -127
  36. package/dist/cli/commands/auth.js.map +0 -1
  37. package/dist/cli/commands/clean.js +0 -120
  38. package/dist/cli/commands/clean.js.map +0 -1
  39. package/dist/cli/commands/completion.js +0 -114
  40. package/dist/cli/commands/completion.js.map +0 -1
  41. package/dist/cli/commands/exec.js +0 -69
  42. package/dist/cli/commands/exec.js.map +0 -1
  43. package/dist/cli/commands/init/analyze-step.js +0 -21
  44. package/dist/cli/commands/init/analyze-step.js.map +0 -1
  45. package/dist/cli/commands/init/apply-answers.js +0 -122
  46. package/dist/cli/commands/init/apply-answers.js.map +0 -1
  47. package/dist/cli/commands/init/apply-step.js +0 -165
  48. package/dist/cli/commands/init/apply-step.js.map +0 -1
  49. package/dist/cli/commands/init/auth-step.js +0 -48
  50. package/dist/cli/commands/init/auth-step.js.map +0 -1
  51. package/dist/cli/commands/init/boilerplate-step.js +0 -20
  52. package/dist/cli/commands/init/boilerplate-step.js.map +0 -1
  53. package/dist/cli/commands/init/clients-step.js +0 -78
  54. package/dist/cli/commands/init/clients-step.js.map +0 -1
  55. package/dist/cli/commands/init/context-step.js +0 -81
  56. package/dist/cli/commands/init/context-step.js.map +0 -1
  57. package/dist/cli/commands/init/describe-step.js +0 -68
  58. package/dist/cli/commands/init/describe-step.js.map +0 -1
  59. package/dist/cli/commands/init/index.js +0 -98
  60. package/dist/cli/commands/init/index.js.map +0 -1
  61. package/dist/cli/commands/init/mode.js +0 -18
  62. package/dist/cli/commands/init/mode.js.map +0 -1
  63. package/dist/cli/commands/init/progress.js +0 -60
  64. package/dist/cli/commands/init/progress.js.map +0 -1
  65. package/dist/cli/commands/init/project-step.js +0 -133
  66. package/dist/cli/commands/init/project-step.js.map +0 -1
  67. package/dist/cli/commands/init/provision-step.js +0 -103
  68. package/dist/cli/commands/init/provision-step.js.map +0 -1
  69. package/dist/cli/commands/map.js +0 -18
  70. package/dist/cli/commands/map.js.map +0 -1
  71. package/dist/cli/commands/plan.js +0 -45
  72. package/dist/cli/commands/plan.js.map +0 -1
  73. package/dist/cli/commands/skills.js +0 -23
  74. package/dist/cli/commands/skills.js.map +0 -1
  75. package/dist/cli/commands/sync.js +0 -319
  76. package/dist/cli/commands/sync.js.map +0 -1
  77. package/dist/cli/commands/validate-plan.js +0 -42
  78. package/dist/cli/commands/validate-plan.js.map +0 -1
  79. package/dist/cli/commands/wave.js +0 -57
  80. package/dist/cli/commands/wave.js.map +0 -1
  81. package/dist/cli/copy/auth.json +0 -6
  82. package/dist/cli/copy/flows.json +0 -6
  83. package/dist/cli/copy/init.json +0 -20
  84. package/dist/cli/copy/sync.json +0 -3
  85. package/dist/cli/copy.js +0 -23
  86. package/dist/cli/copy.js.map +0 -1
  87. package/dist/cli/flows/clients.js +0 -130
  88. package/dist/cli/flows/clients.js.map +0 -1
  89. package/dist/cli/flows/completion.js +0 -63
  90. package/dist/cli/flows/completion.js.map +0 -1
  91. package/dist/cli/flows/dependencies.js +0 -114
  92. package/dist/cli/flows/dependencies.js.map +0 -1
  93. package/dist/cli/flows/sections.js +0 -85
  94. package/dist/cli/flows/sections.js.map +0 -1
  95. package/dist/cli/flows/user-config.js +0 -37
  96. package/dist/cli/flows/user-config.js.map +0 -1
  97. package/dist/cli/ui/render.js +0 -239
  98. package/dist/cli/ui/render.js.map +0 -1
  99. package/dist/cli/ui/report.js +0 -130
  100. package/dist/cli/ui/report.js.map +0 -1
  101. package/dist/config.js +0 -289
  102. package/dist/config.js.map +0 -1
  103. package/dist/constants.js +0 -9
  104. package/dist/constants.js.map +0 -1
  105. package/dist/core/ports.js +0 -2
  106. package/dist/core/ports.js.map +0 -1
  107. package/dist/core/types.js +0 -5
  108. package/dist/core/types.js.map +0 -1
  109. package/dist/database.types.js +0 -11
  110. package/dist/database.types.js.map +0 -1
  111. package/dist/lib/active-project.js +0 -28
  112. package/dist/lib/active-project.js.map +0 -1
  113. package/dist/lib/autopull.js +0 -13
  114. package/dist/lib/autopull.js.map +0 -1
  115. package/dist/lib/boilerplate-scaffold.js +0 -65
  116. package/dist/lib/boilerplate-scaffold.js.map +0 -1
  117. package/dist/lib/boilerplates.js +0 -61
  118. package/dist/lib/boilerplates.js.map +0 -1
  119. package/dist/lib/calendar-logic.js +0 -59
  120. package/dist/lib/calendar-logic.js.map +0 -1
  121. package/dist/lib/calendar-write-logic.js +0 -6
  122. package/dist/lib/calendar-write-logic.js.map +0 -1
  123. package/dist/lib/checklist-logic.js +0 -5
  124. package/dist/lib/checklist-logic.js.map +0 -1
  125. package/dist/lib/client-configs.js +0 -191
  126. package/dist/lib/client-configs.js.map +0 -1
  127. package/dist/lib/client-install.js +0 -40
  128. package/dist/lib/client-install.js.map +0 -1
  129. package/dist/lib/colors.js +0 -92
  130. package/dist/lib/colors.js.map +0 -1
  131. package/dist/lib/cowork-extension.js +0 -143
  132. package/dist/lib/cowork-extension.js.map +0 -1
  133. package/dist/lib/dates.js +0 -21
  134. package/dist/lib/dates.js.map +0 -1
  135. package/dist/lib/dependencies.js +0 -145
  136. package/dist/lib/dependencies.js.map +0 -1
  137. package/dist/lib/dependency-install.js +0 -163
  138. package/dist/lib/dependency-install.js.map +0 -1
  139. package/dist/lib/duration.js +0 -5
  140. package/dist/lib/duration.js.map +0 -1
  141. package/dist/lib/exec-delegate.js +0 -218
  142. package/dist/lib/exec-delegate.js.map +0 -1
  143. package/dist/lib/exec-engines.js +0 -90
  144. package/dist/lib/exec-engines.js.map +0 -1
  145. package/dist/lib/exec-events.js +0 -87
  146. package/dist/lib/exec-events.js.map +0 -1
  147. package/dist/lib/exec-translators.js +0 -198
  148. package/dist/lib/exec-translators.js.map +0 -1
  149. package/dist/lib/file-merge.js +0 -33
  150. package/dist/lib/file-merge.js.map +0 -1
  151. package/dist/lib/git-exposure.js +0 -35
  152. package/dist/lib/git-exposure.js.map +0 -1
  153. package/dist/lib/harness.js +0 -127
  154. package/dist/lib/harness.js.map +0 -1
  155. package/dist/lib/hooks.js +0 -216
  156. package/dist/lib/hooks.js.map +0 -1
  157. package/dist/lib/patterns.js +0 -25
  158. package/dist/lib/patterns.js.map +0 -1
  159. package/dist/lib/pg-error.js +0 -53
  160. package/dist/lib/pg-error.js.map +0 -1
  161. package/dist/lib/plan-delegate.js +0 -117
  162. package/dist/lib/plan-delegate.js.map +0 -1
  163. package/dist/lib/project-context.js +0 -151
  164. package/dist/lib/project-context.js.map +0 -1
  165. package/dist/lib/prompts.js +0 -69
  166. package/dist/lib/prompts.js.map +0 -1
  167. package/dist/lib/provision-apply.js +0 -220
  168. package/dist/lib/provision-apply.js.map +0 -1
  169. package/dist/lib/provision-collect.js +0 -47
  170. package/dist/lib/provision-collect.js.map +0 -1
  171. package/dist/lib/provision.js +0 -45
  172. package/dist/lib/provision.js.map +0 -1
  173. package/dist/lib/release-logic.js +0 -10
  174. package/dist/lib/release-logic.js.map +0 -1
  175. package/dist/lib/repo-map.js +0 -176
  176. package/dist/lib/repo-map.js.map +0 -1
  177. package/dist/lib/require-config.js +0 -32
  178. package/dist/lib/require-config.js.map +0 -1
  179. package/dist/lib/rules.js +0 -146
  180. package/dist/lib/rules.js.map +0 -1
  181. package/dist/lib/sections.js +0 -89
  182. package/dist/lib/sections.js.map +0 -1
  183. package/dist/lib/skill-agent.js +0 -44
  184. package/dist/lib/skill-agent.js.map +0 -1
  185. package/dist/lib/skill-serve.js +0 -128
  186. package/dist/lib/skill-serve.js.map +0 -1
  187. package/dist/lib/skills-cache.js +0 -99
  188. package/dist/lib/skills-cache.js.map +0 -1
  189. package/dist/lib/skills.js +0 -237
  190. package/dist/lib/skills.js.map +0 -1
  191. package/dist/lib/sprint-deadline.js +0 -28
  192. package/dist/lib/sprint-deadline.js.map +0 -1
  193. package/dist/lib/sprint-logic.js +0 -31
  194. package/dist/lib/sprint-logic.js.map +0 -1
  195. package/dist/lib/targets.js +0 -150
  196. package/dist/lib/targets.js.map +0 -1
  197. package/dist/lib/task-history.js +0 -15
  198. package/dist/lib/task-history.js.map +0 -1
  199. package/dist/lib/telemetry.js +0 -51
  200. package/dist/lib/telemetry.js.map +0 -1
  201. package/dist/lib/tool-result.js +0 -15
  202. package/dist/lib/tool-result.js.map +0 -1
  203. package/dist/lib/validate-plan-delegate.js +0 -106
  204. package/dist/lib/validate-plan-delegate.js.map +0 -1
  205. package/dist/lib/version-check.js +0 -89
  206. package/dist/lib/version-check.js.map +0 -1
  207. package/dist/lib/wave-scheduler.js +0 -95
  208. package/dist/lib/wave-scheduler.js.map +0 -1
  209. package/dist/session-factory.js +0 -19
  210. package/dist/session-factory.js.map +0 -1
  211. package/dist/spinner.js +0 -12
  212. package/dist/spinner.js.map +0 -1
  213. package/dist/tools/activate-sprint.js +0 -44
  214. package/dist/tools/activate-sprint.js.map +0 -1
  215. package/dist/tools/add-checklist-item.js +0 -44
  216. package/dist/tools/add-checklist-item.js.map +0 -1
  217. package/dist/tools/add-checklist.js +0 -63
  218. package/dist/tools/add-checklist.js.map +0 -1
  219. package/dist/tools/add-holiday.js +0 -41
  220. package/dist/tools/add-holiday.js.map +0 -1
  221. package/dist/tools/add-home-office.js +0 -31
  222. package/dist/tools/add-home-office.js.map +0 -1
  223. package/dist/tools/add-vacation.js +0 -39
  224. package/dist/tools/add-vacation.js.map +0 -1
  225. package/dist/tools/attach-pr.js +0 -97
  226. package/dist/tools/attach-pr.js.map +0 -1
  227. package/dist/tools/comment-task.js +0 -72
  228. package/dist/tools/comment-task.js.map +0 -1
  229. package/dist/tools/create-release.js +0 -46
  230. package/dist/tools/create-release.js.map +0 -1
  231. package/dist/tools/create-sprint.js +0 -66
  232. package/dist/tools/create-sprint.js.map +0 -1
  233. package/dist/tools/create-task.js +0 -174
  234. package/dist/tools/create-task.js.map +0 -1
  235. package/dist/tools/delegate-exec.js +0 -63
  236. package/dist/tools/delegate-exec.js.map +0 -1
  237. package/dist/tools/end-allocation.js +0 -38
  238. package/dist/tools/end-allocation.js.map +0 -1
  239. package/dist/tools/end-sprint.js +0 -37
  240. package/dist/tools/end-sprint.js.map +0 -1
  241. package/dist/tools/end-task-allocation.js +0 -60
  242. package/dist/tools/end-task-allocation.js.map +0 -1
  243. package/dist/tools/exec-status.js +0 -45
  244. package/dist/tools/exec-status.js.map +0 -1
  245. package/dist/tools/finalize-release.js +0 -45
  246. package/dist/tools/finalize-release.js.map +0 -1
  247. package/dist/tools/get-active-allocation.js +0 -69
  248. package/dist/tools/get-active-allocation.js.map +0 -1
  249. package/dist/tools/get-calendar.js +0 -40
  250. package/dist/tools/get-calendar.js.map +0 -1
  251. package/dist/tools/get-context.js +0 -48
  252. package/dist/tools/get-context.js.map +0 -1
  253. package/dist/tools/get-sprint.js +0 -38
  254. package/dist/tools/get-sprint.js.map +0 -1
  255. package/dist/tools/get-task.js +0 -146
  256. package/dist/tools/get-task.js.map +0 -1
  257. package/dist/tools/index.js +0 -92
  258. package/dist/tools/index.js.map +0 -1
  259. package/dist/tools/list-my-allocations.js +0 -71
  260. package/dist/tools/list-my-allocations.js.map +0 -1
  261. package/dist/tools/list-projects.js +0 -38
  262. package/dist/tools/list-projects.js.map +0 -1
  263. package/dist/tools/list-releases.js +0 -32
  264. package/dist/tools/list-releases.js.map +0 -1
  265. package/dist/tools/list-sprints.js +0 -30
  266. package/dist/tools/list-sprints.js.map +0 -1
  267. package/dist/tools/list-tasks.js +0 -95
  268. package/dist/tools/list-tasks.js.map +0 -1
  269. package/dist/tools/move-task.js +0 -82
  270. package/dist/tools/move-task.js.map +0 -1
  271. package/dist/tools/plan.js +0 -56
  272. package/dist/tools/plan.js.map +0 -1
  273. package/dist/tools/record-delivery.js +0 -100
  274. package/dist/tools/record-delivery.js.map +0 -1
  275. package/dist/tools/remove-checklist-item.js +0 -42
  276. package/dist/tools/remove-checklist-item.js.map +0 -1
  277. package/dist/tools/remove-checklist.js +0 -42
  278. package/dist/tools/remove-checklist.js.map +0 -1
  279. package/dist/tools/remove-holiday.js +0 -31
  280. package/dist/tools/remove-holiday.js.map +0 -1
  281. package/dist/tools/remove-home-office.js +0 -32
  282. package/dist/tools/remove-home-office.js.map +0 -1
  283. package/dist/tools/remove-vacation.js +0 -31
  284. package/dist/tools/remove-vacation.js.map +0 -1
  285. package/dist/tools/set-project.js +0 -52
  286. package/dist/tools/set-project.js.map +0 -1
  287. package/dist/tools/set-review.js +0 -132
  288. package/dist/tools/set-review.js.map +0 -1
  289. package/dist/tools/sprint-common.js +0 -13
  290. package/dist/tools/sprint-common.js.map +0 -1
  291. package/dist/tools/start-allocation.js +0 -32
  292. package/dist/tools/start-allocation.js.map +0 -1
  293. package/dist/tools/start-task-allocation.js +0 -83
  294. package/dist/tools/start-task-allocation.js.map +0 -1
  295. package/dist/tools/update-checklist-item.js +0 -51
  296. package/dist/tools/update-checklist-item.js.map +0 -1
  297. package/dist/tools/update-release.js +0 -58
  298. package/dist/tools/update-release.js.map +0 -1
  299. package/dist/tools/update-sprint.js +0 -56
  300. package/dist/tools/update-sprint.js.map +0 -1
  301. package/dist/tools/update-task.js +0 -183
  302. package/dist/tools/update-task.js.map +0 -1
  303. package/dist/tools/validate-plan.js +0 -58
  304. package/dist/tools/validate-plan.js.map +0 -1
  305. package/dist/version.js +0 -16
  306. 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