@noclaf/cli 0.4.14 → 0.4.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth.js +2 -1
- package/dist/auth.js.map +1 -1
- package/dist/brand.js +82 -0
- package/dist/brand.js.map +1 -0
- package/dist/cli/commands/auth.js +91 -58
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/init/auth-step.js +48 -0
- package/dist/cli/commands/init/auth-step.js.map +1 -0
- package/dist/cli/commands/init/clients-step.js +76 -0
- package/dist/cli/commands/init/clients-step.js.map +1 -0
- package/dist/cli/commands/init/context-step.js +66 -0
- package/dist/cli/commands/init/context-step.js.map +1 -0
- package/dist/cli/commands/init/index.js +67 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/project-step.js +105 -0
- package/dist/cli/commands/init/project-step.js.map +1 -0
- package/dist/cli/commands/init/provision-step.js +76 -0
- package/dist/cli/commands/init/provision-step.js.map +1 -0
- package/dist/cli/flows/clients.js +27 -17
- package/dist/cli/flows/clients.js.map +1 -1
- package/dist/cli.js +5 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.js +19 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +7 -8
- package/dist/constants.js.map +1 -1
- package/dist/lib/autopull.js +13 -0
- package/dist/lib/autopull.js.map +1 -0
- package/dist/lib/client-configs.js +37 -25
- package/dist/lib/client-configs.js.map +1 -1
- package/dist/lib/cowork-extension.js +42 -30
- package/dist/lib/cowork-extension.js.map +1 -1
- package/dist/lib/dependencies.js +83 -247
- package/dist/lib/dependencies.js.map +1 -1
- package/dist/lib/dependency-install.js +163 -0
- package/dist/lib/dependency-install.js.map +1 -0
- package/dist/lib/exec-delegate.js +2 -2
- package/dist/lib/exec-delegate.js.map +1 -1
- package/dist/lib/exec-engines.js +7 -6
- package/dist/lib/exec-engines.js.map +1 -1
- package/dist/lib/provision-apply.js +214 -0
- package/dist/lib/provision-apply.js.map +1 -0
- package/dist/lib/provision-collect.js +47 -0
- package/dist/lib/provision-collect.js.map +1 -0
- package/dist/lib/provision.js +8 -253
- package/dist/lib/provision.js.map +1 -1
- package/dist/lib/require-config.js +3 -2
- package/dist/lib/require-config.js.map +1 -1
- package/dist/lib/skills-cache.js +9 -8
- package/dist/lib/skills-cache.js.map +1 -1
- package/dist/lib/skills.js +30 -16
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/telemetry.js +2 -1
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/version-check.js +3 -2
- package/dist/lib/version-check.js.map +1 -1
- package/dist/mcp-server.js +107 -79
- package/dist/mcp-server.js.map +1 -1
- package/dist/tools/comment-task.js +32 -32
- package/dist/tools/comment-task.js.map +1 -1
- package/dist/tools/create-task.js +92 -101
- package/dist/tools/create-task.js.map +1 -1
- package/dist/tools/delegate-exec.js +4 -3
- package/dist/tools/delegate-exec.js.map +1 -1
- package/dist/tools/end-allocation.js +19 -32
- package/dist/tools/end-allocation.js.map +1 -1
- package/dist/tools/end-task-allocation.js +17 -26
- package/dist/tools/end-task-allocation.js.map +1 -1
- package/dist/tools/exec-status.js +4 -3
- package/dist/tools/exec-status.js.map +1 -1
- package/dist/tools/get-active-allocation.js +53 -60
- package/dist/tools/get-active-allocation.js.map +1 -1
- package/dist/tools/get-context.js +4 -3
- package/dist/tools/get-context.js.map +1 -1
- package/dist/tools/get-task.js +144 -142
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/list-my-allocations.js +35 -43
- package/dist/tools/list-my-allocations.js.map +1 -1
- package/dist/tools/list-projects.js +3 -2
- package/dist/tools/list-projects.js.map +1 -1
- package/dist/tools/list-tasks.js +117 -124
- package/dist/tools/list-tasks.js.map +1 -1
- package/dist/tools/move-task.js +37 -39
- package/dist/tools/move-task.js.map +1 -1
- package/dist/tools/plan.js +3 -2
- package/dist/tools/plan.js.map +1 -1
- package/dist/tools/record-delivery.js +4 -3
- package/dist/tools/record-delivery.js.map +1 -1
- package/dist/tools/set-project.js +9 -4
- package/dist/tools/set-project.js.map +1 -1
- package/dist/tools/start-allocation.js +16 -26
- package/dist/tools/start-allocation.js.map +1 -1
- package/dist/tools/start-task-allocation.js +72 -92
- package/dist/tools/start-task-allocation.js.map +1 -1
- package/dist/tools/update-task.js +149 -168
- package/dist/tools/update-task.js.map +1 -1
- package/dist/tools/validate-plan.js +3 -2
- package/dist/tools/validate-plan.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/init.js +0 -336
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/logo.js +0 -17
- package/dist/logo.js.map +0 -1
|
@@ -2,6 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { resolveProjectConfig, isErrorResult } from '../lib/require-config.js';
|
|
4
4
|
import { insertTaskHistory } from '../lib/task-history.js';
|
|
5
|
+
import { brand } from '../brand.js';
|
|
5
6
|
const TASK_STATUS = [
|
|
6
7
|
'backlog',
|
|
7
8
|
'todo',
|
|
@@ -31,7 +32,7 @@ const ArgsSchema = z
|
|
|
31
32
|
})
|
|
32
33
|
.strict();
|
|
33
34
|
export const definition = {
|
|
34
|
-
name:
|
|
35
|
+
name: `${brand.toolPrefix}create_task`,
|
|
35
36
|
description: 'Cria uma nova tarefa no projeto atual. Por padrão: status=todo, sprint=active, ' +
|
|
36
37
|
'type=task, assignee=você. Pra colocar no backlog fora de sprint, passe ' +
|
|
37
38
|
'status="backlog" e sprint="none". O reporter é sempre o usuário autenticado.',
|
|
@@ -58,114 +59,120 @@ export const definition = {
|
|
|
58
59
|
project_id: {
|
|
59
60
|
type: 'string',
|
|
60
61
|
format: 'uuid',
|
|
61
|
-
description:
|
|
62
|
+
description: `Override do projeto. Se omitido, usa o projeto ativo (${brand.toolPrefix}set_project) ou o default.`,
|
|
62
63
|
},
|
|
63
64
|
},
|
|
64
65
|
required: ['title'],
|
|
65
66
|
additionalProperties: false,
|
|
66
67
|
},
|
|
67
68
|
};
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
const SPRINT_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
70
|
+
/** Resolve assignees (default: o próprio usuário) e a lista deduplicada de repositórios a vincular. Pura. */
|
|
71
|
+
export function resolveTaskLinks(input, repositoryId, userId) {
|
|
72
|
+
const assigneeIds = input.assignee_user_ids ?? [userId];
|
|
73
|
+
const repoIds = [];
|
|
74
|
+
if (input.link_to_current_repository && repositoryId)
|
|
75
|
+
repoIds.push(repositoryId);
|
|
76
|
+
for (const r of input.additional_repository_ids ?? []) {
|
|
77
|
+
if (!repoIds.includes(r))
|
|
78
|
+
repoIds.push(r);
|
|
72
79
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
return { assigneeIds, repoIds };
|
|
81
|
+
}
|
|
82
|
+
/** Monta o payload de insert da task a partir do input + sprint já resolvida. Pura. */
|
|
83
|
+
export function buildTaskInsertPayload(input, projectId, reporterId, sprintId) {
|
|
84
|
+
return {
|
|
85
|
+
title: input.title,
|
|
86
|
+
description: input.description,
|
|
87
|
+
status: input.status,
|
|
88
|
+
priority: input.priority,
|
|
89
|
+
type: input.type,
|
|
90
|
+
project_id: projectId,
|
|
91
|
+
reporter_id: reporterId,
|
|
92
|
+
sprint_id: sprintId,
|
|
93
|
+
end_date: input.end_date ?? null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Monta o payload de resposta a partir da task criada + vínculos + warnings. Pura. */
|
|
97
|
+
export function buildCreateTaskResult(task, assigneeIds, labelIds, repoIds, warnings) {
|
|
98
|
+
return {
|
|
99
|
+
id: task.id,
|
|
100
|
+
key: task.key,
|
|
101
|
+
title: task.title,
|
|
102
|
+
status: task.status,
|
|
103
|
+
priority: task.priority,
|
|
104
|
+
type: task.type,
|
|
105
|
+
sprint_id: task.sprint_id,
|
|
106
|
+
end_date: task.end_date,
|
|
107
|
+
created_at: task.created_at,
|
|
108
|
+
linked: { assignee_user_ids: assigneeIds, label_ids: labelIds, repository_ids: repoIds },
|
|
109
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async function resolveSprintId(supabase, projectId, sprintInput) {
|
|
113
|
+
if (sprintInput === 'active') {
|
|
81
114
|
const sprintRes = await supabase
|
|
82
115
|
.from('sprints')
|
|
83
116
|
.select('id')
|
|
84
|
-
.eq('project_id',
|
|
117
|
+
.eq('project_id', projectId)
|
|
85
118
|
.eq('status', 'ativa')
|
|
86
119
|
.maybeSingle();
|
|
87
120
|
if (sprintRes.error)
|
|
88
121
|
return errorResult(`Erro ao buscar sprint ativa: ${sprintRes.error.message}`);
|
|
89
122
|
if (!sprintRes.data)
|
|
90
123
|
return errorResult('Não há sprint ativa no projeto.');
|
|
91
|
-
|
|
124
|
+
return sprintRes.data.id;
|
|
92
125
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const sprintRes = await supabase
|
|
98
|
-
.from('sprints')
|
|
99
|
-
.select('id, project_id')
|
|
100
|
-
.eq('id', input.sprint)
|
|
101
|
-
.maybeSingle();
|
|
102
|
-
if (sprintRes.error)
|
|
103
|
-
return errorResult(`Erro ao validar sprint: ${sprintRes.error.message}`);
|
|
104
|
-
if (!sprintRes.data || sprintRes.data.project_id !== cfg.project_id) {
|
|
105
|
-
return errorResult('Sprint informada não pertence ao projeto atual.');
|
|
106
|
-
}
|
|
107
|
-
sprintId = sprintRes.data.id;
|
|
126
|
+
if (sprintInput === 'none')
|
|
127
|
+
return null;
|
|
128
|
+
if (!SPRINT_UUID_RE.test(sprintInput)) {
|
|
129
|
+
return errorResult('Argumento "sprint" deve ser "active", "none" ou um UUID válido.');
|
|
108
130
|
}
|
|
109
|
-
|
|
131
|
+
const sprintRes = await supabase.from('sprints').select('id, project_id').eq('id', sprintInput).maybeSingle();
|
|
132
|
+
if (sprintRes.error)
|
|
133
|
+
return errorResult(`Erro ao validar sprint: ${sprintRes.error.message}`);
|
|
134
|
+
if (!sprintRes.data || sprintRes.data.project_id !== projectId)
|
|
135
|
+
return errorResult('Sprint informada não pertence ao projeto atual.');
|
|
136
|
+
return sprintRes.data.id;
|
|
137
|
+
}
|
|
138
|
+
async function insertTaskLinks(supabase, table, idField, label, taskId, ids) {
|
|
139
|
+
if (ids.length === 0)
|
|
140
|
+
return null;
|
|
141
|
+
const rows = ids.map((id) => ({ task_id: taskId, [idField]: id }));
|
|
142
|
+
const res = await supabase.from(table).insert(rows);
|
|
143
|
+
return res.error ? `Falha ao vincular ${label}: ${res.error.message}` : null;
|
|
144
|
+
}
|
|
145
|
+
/** Cria os vínculos secundários (assignees/labels/repos) em paralelo; retorna warnings de falhas parciais. */
|
|
146
|
+
async function linkSecondaryRecords(supabase, taskId, assigneeIds, labelIds, repoIds) {
|
|
147
|
+
const results = await Promise.all([
|
|
148
|
+
insertTaskLinks(supabase, 'task_assignees', 'user_id', 'assignees', taskId, assigneeIds),
|
|
149
|
+
insertTaskLinks(supabase, 'task_label_assignments', 'label_id', 'labels', taskId, labelIds),
|
|
150
|
+
insertTaskLinks(supabase, 'task_repositories', 'repository_id', 'repositories', taskId, repoIds),
|
|
151
|
+
]);
|
|
152
|
+
return results.filter((w) => w !== null);
|
|
153
|
+
}
|
|
154
|
+
export async function handler(args, ctx) {
|
|
155
|
+
const parsed = ArgsSchema.safeParse(args);
|
|
156
|
+
if (!parsed.success)
|
|
157
|
+
return errorResult(`Argumento inválido: ${parsed.error.message}`);
|
|
158
|
+
const input = parsed.data;
|
|
159
|
+
const cfg = resolveProjectConfig(ctx, input.project_id);
|
|
160
|
+
if (isErrorResult(cfg))
|
|
161
|
+
return cfg;
|
|
162
|
+
const { supabase } = ctx;
|
|
163
|
+
const sprintId = await resolveSprintId(supabase, cfg.project_id, input.sprint);
|
|
164
|
+
if (isErrorResult(sprintId))
|
|
165
|
+
return sprintId;
|
|
110
166
|
const insertRes = await supabase
|
|
111
167
|
.from('tasks')
|
|
112
|
-
.insert(
|
|
113
|
-
title: input.title,
|
|
114
|
-
description: input.description,
|
|
115
|
-
status: input.status,
|
|
116
|
-
priority: input.priority,
|
|
117
|
-
type: input.type,
|
|
118
|
-
project_id: cfg.project_id,
|
|
119
|
-
reporter_id: ctx.user.id,
|
|
120
|
-
sprint_id: sprintId,
|
|
121
|
-
end_date: input.end_date ?? null,
|
|
122
|
-
})
|
|
168
|
+
.insert(buildTaskInsertPayload(input, cfg.project_id, ctx.user.id, sprintId))
|
|
123
169
|
.select('id, key, title, status, priority, type, sprint_id, end_date, created_at')
|
|
124
170
|
.single();
|
|
125
171
|
if (insertRes.error)
|
|
126
172
|
return errorResult(`Erro ao criar tarefa: ${insertRes.error.message}`);
|
|
127
173
|
const task = insertRes.data;
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
const assigneeIds = input.assignee_user_ids ?? [ctx.user.id];
|
|
131
|
-
const repoIds = [];
|
|
132
|
-
if (input.link_to_current_repository && cfg.repository_id) {
|
|
133
|
-
repoIds.push(cfg.repository_id);
|
|
134
|
-
}
|
|
135
|
-
for (const r of input.additional_repository_ids ?? []) {
|
|
136
|
-
if (!repoIds.includes(r))
|
|
137
|
-
repoIds.push(r);
|
|
138
|
-
}
|
|
139
|
-
const secondaryOps = [];
|
|
140
|
-
if (assigneeIds.length > 0) {
|
|
141
|
-
secondaryOps.push((async () => {
|
|
142
|
-
const res = await supabase
|
|
143
|
-
.from('task_assignees')
|
|
144
|
-
.insert(assigneeIds.map((user_id) => ({ task_id: task.id, user_id })));
|
|
145
|
-
return { label: 'assignees', error: res.error?.message ?? null };
|
|
146
|
-
})());
|
|
147
|
-
}
|
|
148
|
-
if ((input.label_ids ?? []).length > 0) {
|
|
149
|
-
secondaryOps.push((async () => {
|
|
150
|
-
const res = await supabase
|
|
151
|
-
.from('task_label_assignments')
|
|
152
|
-
.insert(input.label_ids.map((label_id) => ({ task_id: task.id, label_id })));
|
|
153
|
-
return { label: 'labels', error: res.error?.message ?? null };
|
|
154
|
-
})());
|
|
155
|
-
}
|
|
156
|
-
if (repoIds.length > 0) {
|
|
157
|
-
secondaryOps.push((async () => {
|
|
158
|
-
const res = await supabase
|
|
159
|
-
.from('task_repositories')
|
|
160
|
-
.insert(repoIds.map((repository_id) => ({ task_id: task.id, repository_id })));
|
|
161
|
-
return { label: 'repositories', error: res.error?.message ?? null };
|
|
162
|
-
})());
|
|
163
|
-
}
|
|
164
|
-
const results = await Promise.all(secondaryOps);
|
|
165
|
-
for (const r of results) {
|
|
166
|
-
if (r.error)
|
|
167
|
-
warnings.push(`Falha ao vincular ${r.label}: ${r.error}`);
|
|
168
|
-
}
|
|
174
|
+
const { assigneeIds, repoIds } = resolveTaskLinks(input, cfg.repository_id, ctx.user.id);
|
|
175
|
+
const warnings = await linkSecondaryRecords(supabase, task.id, assigneeIds, input.label_ids ?? [], repoIds);
|
|
169
176
|
await insertTaskHistory(supabase, {
|
|
170
177
|
task_id: task.id,
|
|
171
178
|
user_id: ctx.user.id,
|
|
@@ -173,22 +180,6 @@ export async function handler(args, ctx) {
|
|
|
173
180
|
field: 'mcp',
|
|
174
181
|
new_value: task.title,
|
|
175
182
|
});
|
|
176
|
-
return jsonResult(
|
|
177
|
-
id: task.id,
|
|
178
|
-
key: task.key,
|
|
179
|
-
title: task.title,
|
|
180
|
-
status: task.status,
|
|
181
|
-
priority: task.priority,
|
|
182
|
-
type: task.type,
|
|
183
|
-
sprint_id: task.sprint_id,
|
|
184
|
-
end_date: task.end_date,
|
|
185
|
-
created_at: task.created_at,
|
|
186
|
-
linked: {
|
|
187
|
-
assignee_user_ids: assigneeIds,
|
|
188
|
-
label_ids: input.label_ids ?? [],
|
|
189
|
-
repository_ids: repoIds,
|
|
190
|
-
},
|
|
191
|
-
warnings: warnings.length > 0 ? warnings : undefined,
|
|
192
|
-
});
|
|
183
|
+
return jsonResult(buildCreateTaskResult(task, assigneeIds, input.label_ids ?? [], repoIds, warnings));
|
|
193
184
|
}
|
|
194
185
|
//# sourceMappingURL=create-task.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"create-task.js","sourceRoot":"","sources":["../../src/tools/create-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { existsSync } from 'node:fs';
|
|
|
3
3
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
4
4
|
import { startExec } from '../lib/exec-delegate.js';
|
|
5
5
|
import { ENGINES, DEFAULT_ENGINE } from '../lib/exec-engines.js';
|
|
6
|
+
import { brand } from '../brand.js';
|
|
6
7
|
const ArgsSchema = z
|
|
7
8
|
.object({
|
|
8
9
|
worktree: z.string().min(1),
|
|
@@ -11,11 +12,11 @@ const ArgsSchema = z
|
|
|
11
12
|
})
|
|
12
13
|
.strict();
|
|
13
14
|
export const definition = {
|
|
14
|
-
name:
|
|
15
|
+
name: `${brand.cliToolPrefix}delegate_exec`,
|
|
15
16
|
description: 'Delega a IMPLEMENTAÇÃO a um agente de execução novo (codex ou claude local, na assinatura — sem API) ' +
|
|
16
17
|
'num worktree já criado pelo /implement. Roda em background e, ao terminar, mede o resultado ' +
|
|
17
18
|
'(tamanho de arquivo/função, lint, build, testes). NÃO julga qualidade e NÃO commita — o ' +
|
|
18
|
-
|
|
19
|
+
`review fica com você (code-reviewer + harness). Consulte o resultado com \`${brand.cliToolPrefix}exec_status\`.`,
|
|
19
20
|
inputSchema: {
|
|
20
21
|
type: 'object',
|
|
21
22
|
properties: {
|
|
@@ -56,7 +57,7 @@ export async function handler(args, _ctx) {
|
|
|
56
57
|
state: job.state,
|
|
57
58
|
engine: job.engine,
|
|
58
59
|
worktree: job.worktree,
|
|
59
|
-
hint:
|
|
60
|
+
hint: `Consulte com \`${brand.cliToolPrefix}exec_status\` até state=done|failed.`,
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
63
|
//# sourceMappingURL=delegate-exec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-exec.js","sourceRoot":"","sources":["../../src/tools/delegate-exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"delegate-exec.js","sourceRoot":"","sources":["../../src/tools/delegate-exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,aAAa,eAAe;IAC3C,WAAW,EACT,uGAAuG;QACvG,8FAA8F;QAC9F,0FAA0F;QAC1F,8EAA8E,KAAK,CAAC,aAAa,gBAAgB;IACnH,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yEAAyE;aACvF;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,qFAAqF;oBACrF,uFAAuF;aAC1F;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC;gBAClB,WAAW,EAAE,uCAAuC,cAAc,GAAG;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;QACrC,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,6BAA6B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,kBAAkB,KAAK,CAAC,aAAa,sCAAsC;KAClF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
2
2
|
import { durationSeconds } from '../lib/duration.js';
|
|
3
|
+
import { brand } from '../brand.js';
|
|
3
4
|
export const definition = {
|
|
4
|
-
name:
|
|
5
|
+
name: `${brand.toolPrefix}end_allocation`,
|
|
5
6
|
description: '[ENCERRA O DIA] Bate ponto de SAÍDA do usuário e fecha qualquer task_allocation aberta. ' +
|
|
6
7
|
'⚠️ Use SOMENTE quando o usuário indicar explicitamente fim de expediente ' +
|
|
7
8
|
'("encerrar dia", "bati ponto", "saí"). Para parar APENAS o timer de uma task ' +
|
|
8
|
-
|
|
9
|
+
`sem encerrar o dia, use \`${brand.toolPrefix}end_task_allocation\`.`,
|
|
9
10
|
inputSchema: {
|
|
10
11
|
type: 'object',
|
|
11
12
|
properties: {},
|
|
12
13
|
additionalProperties: false,
|
|
13
14
|
},
|
|
14
15
|
};
|
|
16
|
+
/** Monta o payload de resposta do end_allocation. Pura. */
|
|
17
|
+
export function formatEndAllocationResult(closed, closedTaskAllocationsCount) {
|
|
18
|
+
return {
|
|
19
|
+
allocation_id: closed.id,
|
|
20
|
+
start_time: closed.start_time,
|
|
21
|
+
end_time: closed.end_time,
|
|
22
|
+
duration_seconds: durationSeconds(closed.start_time, closed.end_time),
|
|
23
|
+
closed_task_allocations: closedTaskAllocationsCount,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
15
26
|
export async function handler(_args, ctx) {
|
|
16
27
|
const { supabase } = ctx;
|
|
17
28
|
const now = new Date().toISOString();
|
|
18
|
-
const activeRes = await supabase
|
|
19
|
-
.from('allocations')
|
|
20
|
-
.select('id, start_time')
|
|
21
|
-
.eq('user_id', ctx.user.id)
|
|
22
|
-
.is('end_time', null)
|
|
23
|
-
.maybeSingle();
|
|
29
|
+
const activeRes = await supabase.from('allocations').select('id, start_time').eq('user_id', ctx.user.id).is('end_time', null).maybeSingle();
|
|
24
30
|
if (activeRes.error)
|
|
25
31
|
return errorResult(`Erro ao buscar alocação ativa: ${activeRes.error.message}`);
|
|
26
32
|
if (!activeRes.data)
|
|
@@ -28,32 +34,13 @@ export async function handler(_args, ctx) {
|
|
|
28
34
|
const allocationId = activeRes.data.id;
|
|
29
35
|
// Fecha task_allocations abertas dessa allocation (em paralelo com o close da allocation)
|
|
30
36
|
const [taskCloseRes, allocCloseRes] = await Promise.all([
|
|
31
|
-
supabase
|
|
32
|
-
|
|
33
|
-
.update({ end_time: now })
|
|
34
|
-
.eq('allocation_id', allocationId)
|
|
35
|
-
.is('end_time', null)
|
|
36
|
-
.select('id'),
|
|
37
|
-
supabase
|
|
38
|
-
.from('allocations')
|
|
39
|
-
.update({ end_time: now })
|
|
40
|
-
.eq('id', allocationId)
|
|
41
|
-
.select('id, start_time, end_time')
|
|
42
|
-
.single(),
|
|
37
|
+
supabase.from('task_allocations').update({ end_time: now }).eq('allocation_id', allocationId).is('end_time', null).select('id'),
|
|
38
|
+
supabase.from('allocations').update({ end_time: now }).eq('id', allocationId).select('id, start_time, end_time').single(),
|
|
43
39
|
]);
|
|
44
|
-
if (taskCloseRes.error)
|
|
40
|
+
if (taskCloseRes.error)
|
|
45
41
|
return errorResult(`Erro ao fechar task_allocations: ${taskCloseRes.error.message}`);
|
|
46
|
-
|
|
47
|
-
if (allocCloseRes.error) {
|
|
42
|
+
if (allocCloseRes.error)
|
|
48
43
|
return errorResult(`Erro ao encerrar alocação: ${allocCloseRes.error.message}`);
|
|
49
|
-
|
|
50
|
-
const closed = allocCloseRes.data;
|
|
51
|
-
return jsonResult({
|
|
52
|
-
allocation_id: closed.id,
|
|
53
|
-
start_time: closed.start_time,
|
|
54
|
-
end_time: closed.end_time,
|
|
55
|
-
duration_seconds: durationSeconds(closed.start_time, closed.end_time),
|
|
56
|
-
closed_task_allocations: (taskCloseRes.data ?? []).length,
|
|
57
|
-
});
|
|
44
|
+
return jsonResult(formatEndAllocationResult(allocCloseRes.data, (taskCloseRes.data ?? []).length));
|
|
58
45
|
}
|
|
59
46
|
//# sourceMappingURL=end-allocation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"end-allocation.js","sourceRoot":"","sources":["../../src/tools/end-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"end-allocation.js","sourceRoot":"","sources":["../../src/tools/end-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,gBAAgB;IACzC,WAAW,EACT,0FAA0F;QAC1F,2EAA2E;QAC3E,+EAA+E;QAC/E,6BAA6B,KAAK,CAAC,UAAU,wBAAwB;IACvE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,2DAA2D;AAC3D,MAAM,UAAU,yBAAyB,CACvC,MAAmE,EACnE,0BAAkC;IAElC,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,EAAE;QACxB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;QACrE,uBAAuB,EAAE,0BAA0B;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAc,EAAE,GAAgB;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5I,IAAI,SAAS,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,kCAAkC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrG,IAAI,CAAC,SAAS,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAEvC,0FAA0F;IAC1F,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/H,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,MAAM,EAAE;KAC1H,CAAC,CAAC;IACH,IAAI,YAAY,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,oCAAoC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7G,IAAI,aAAa,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,8BAA8B,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEzG,OAAO,UAAU,CAAC,yBAAyB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -1,51 +1,42 @@
|
|
|
1
1
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
2
2
|
import { durationSeconds } from '../lib/duration.js';
|
|
3
|
+
import { brand } from '../brand.js';
|
|
3
4
|
export const definition = {
|
|
4
|
-
name:
|
|
5
|
+
name: `${brand.toolPrefix}end_task_allocation`,
|
|
5
6
|
description: '[PARA TIMER DE TASK] Para a task_allocation ativa. A alocação principal (ponto do dia) ' +
|
|
6
7
|
'CONTINUA aberta. Use ao finalizar ou pausar uma task. ' +
|
|
7
|
-
|
|
8
|
+
`Para encerrar o dia inteiro, use \`${brand.toolPrefix}end_allocation\`.`,
|
|
8
9
|
inputSchema: {
|
|
9
10
|
type: 'object',
|
|
10
11
|
properties: {},
|
|
11
12
|
additionalProperties: false,
|
|
12
13
|
},
|
|
13
14
|
};
|
|
15
|
+
/** Monta o payload de resposta do end_task_allocation. Pura. */
|
|
16
|
+
export function formatEndTaskAllocationResult(closed, task) {
|
|
17
|
+
return {
|
|
18
|
+
task_allocation_id: closed.id,
|
|
19
|
+
task,
|
|
20
|
+
start_time: closed.start_time,
|
|
21
|
+
end_time: closed.end_time,
|
|
22
|
+
duration_seconds: durationSeconds(closed.start_time, closed.end_time),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
14
25
|
export async function handler(_args, ctx) {
|
|
15
26
|
const { supabase } = ctx;
|
|
16
27
|
const now = new Date().toISOString();
|
|
17
|
-
const activeRes = await supabase
|
|
18
|
-
.from('task_allocations')
|
|
19
|
-
.select('id, task_id, start_time')
|
|
20
|
-
.eq('user_id', ctx.user.id)
|
|
21
|
-
.is('end_time', null)
|
|
22
|
-
.maybeSingle();
|
|
28
|
+
const activeRes = await supabase.from('task_allocations').select('id, task_id, start_time').eq('user_id', ctx.user.id).is('end_time', null).maybeSingle();
|
|
23
29
|
if (activeRes.error)
|
|
24
30
|
return errorResult(`Erro ao buscar task_allocation ativa: ${activeRes.error.message}`);
|
|
25
31
|
if (!activeRes.data)
|
|
26
32
|
return errorResult('Não há task_allocation ativa.');
|
|
27
33
|
const active = activeRes.data;
|
|
28
|
-
const closeRes = await supabase
|
|
29
|
-
.from('task_allocations')
|
|
30
|
-
.update({ end_time: now })
|
|
31
|
-
.eq('id', active.id)
|
|
32
|
-
.select('id, start_time, end_time')
|
|
33
|
-
.single();
|
|
34
|
+
const closeRes = await supabase.from('task_allocations').update({ end_time: now }).eq('id', active.id).select('id, start_time, end_time').single();
|
|
34
35
|
if (closeRes.error)
|
|
35
36
|
return errorResult(`Erro ao parar task_allocation: ${closeRes.error.message}`);
|
|
36
37
|
// Busca info da task (best-effort)
|
|
37
|
-
const taskRes = await supabase
|
|
38
|
-
.from('tasks')
|
|
39
|
-
.select('id, key, title')
|
|
40
|
-
.eq('id', active.task_id)
|
|
41
|
-
.maybeSingle();
|
|
38
|
+
const taskRes = await supabase.from('tasks').select('id, key, title').eq('id', active.task_id).maybeSingle();
|
|
42
39
|
const task = taskRes.data ?? { id: active.task_id, key: null, title: null };
|
|
43
|
-
return jsonResult(
|
|
44
|
-
task_allocation_id: closeRes.data.id,
|
|
45
|
-
task,
|
|
46
|
-
start_time: closeRes.data.start_time,
|
|
47
|
-
end_time: closeRes.data.end_time,
|
|
48
|
-
duration_seconds: durationSeconds(closeRes.data.start_time, closeRes.data.end_time),
|
|
49
|
-
});
|
|
40
|
+
return jsonResult(formatEndTaskAllocationResult(closeRes.data, task));
|
|
50
41
|
}
|
|
51
42
|
//# sourceMappingURL=end-task-allocation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"end-task-allocation.js","sourceRoot":"","sources":["../../src/tools/end-task-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"end-task-allocation.js","sourceRoot":"","sources":["../../src/tools/end-task-allocation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,qBAAqB;IAC9C,WAAW,EACT,yFAAyF;QACzF,wDAAwD;QACxD,sCAAsC,KAAK,CAAC,UAAU,mBAAmB;IAC3E,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;QACd,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,gEAAgE;AAChE,MAAM,UAAU,6BAA6B,CAC3C,MAAmE,EACnE,IAA8D;IAE9D,OAAO;QACL,kBAAkB,EAAE,MAAM,CAAC,EAAE;QAC7B,IAAI;QACJ,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAc,EAAE,GAAgB;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1J,IAAI,SAAS,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,yCAAyC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5G,IAAI,CAAC,SAAS,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC,+BAA+B,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC;IAE9B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,MAAM,EAAE,CAAC;IACnJ,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,WAAW,CAAC,kCAAkC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnG,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7G,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE5E,OAAO,UAAU,CAAC,6BAA6B,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { jsonResult, errorResult } from '../lib/tool-result.js';
|
|
3
3
|
import { getJob } from '../lib/exec-delegate.js';
|
|
4
|
+
import { brand } from '../brand.js';
|
|
4
5
|
const ArgsSchema = z.object({ job_id: z.string().min(1) }).strict();
|
|
5
6
|
export const definition = {
|
|
6
|
-
name:
|
|
7
|
-
description:
|
|
7
|
+
name: `${brand.cliToolPrefix}exec_status`,
|
|
8
|
+
description: `Estado de uma execução delegada (\`${brand.cliToolPrefix}delegate_exec\`): running | done | failed, com o ` +
|
|
8
9
|
'resumo do agente, os arquivos alterados e os checks determinísticos (tamanho, lint, build, ' +
|
|
9
10
|
'testes). Use os checks como FATOS na sua revisão — não gaste ciclo revisando o mecânico.',
|
|
10
11
|
inputSchema: {
|
|
11
12
|
type: 'object',
|
|
12
13
|
properties: {
|
|
13
|
-
job_id: { type: 'string', description:
|
|
14
|
+
job_id: { type: 'string', description: `Id devolvido por \`${brand.cliToolPrefix}delegate_exec\`.` },
|
|
14
15
|
},
|
|
15
16
|
required: ['job_id'],
|
|
16
17
|
additionalProperties: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-status.js","sourceRoot":"","sources":["../../src/tools/exec-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"exec-status.js","sourceRoot":"","sources":["../../src/tools/exec-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEpE,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,GAAG,KAAK,CAAC,aAAa,aAAa;IACzC,WAAW,EACT,sCAAsC,KAAK,CAAC,aAAa,mDAAmD;QAC5G,6FAA6F;QAC7F,0FAA0F;IAC5F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,KAAK,CAAC,aAAa,kBAAkB,EAAE;SACrG;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa,EAAE,IAAiB;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO,UAAU,CAAC;QAChB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,QAAQ;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;AACL,CAAC"}
|