@wayai/cli 0.3.40 → 0.3.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +16920 -310
- package/dist/index.js.map +1 -1
- package/package.json +6 -4
- package/dist/commands/admin.d.ts +0 -1
- package/dist/commands/admin.js +0 -913
- package/dist/commands/admin.js.map +0 -1
- package/dist/commands/analytics.d.ts +0 -34
- package/dist/commands/analytics.js +0 -605
- package/dist/commands/analytics.js.map +0 -1
- package/dist/commands/conversations.d.ts +0 -14
- package/dist/commands/conversations.js +0 -292
- package/dist/commands/conversations.js.map +0 -1
- package/dist/commands/create-credential.d.ts +0 -20
- package/dist/commands/create-credential.js +0 -146
- package/dist/commands/create-credential.js.map +0 -1
- package/dist/commands/delete-history.d.ts +0 -15
- package/dist/commands/delete-history.js +0 -56
- package/dist/commands/delete-history.js.map +0 -1
- package/dist/commands/eval-capture.d.ts +0 -1
- package/dist/commands/eval-capture.js +0 -135
- package/dist/commands/eval-capture.js.map +0 -1
- package/dist/commands/eval-results.d.ts +0 -10
- package/dist/commands/eval-results.js +0 -168
- package/dist/commands/eval-results.js.map +0 -1
- package/dist/commands/eval.d.ts +0 -1
- package/dist/commands/eval.js +0 -49
- package/dist/commands/eval.js.map +0 -1
- package/dist/commands/evals.d.ts +0 -21
- package/dist/commands/evals.js +0 -120
- package/dist/commands/evals.js.map +0 -1
- package/dist/commands/init.d.ts +0 -16
- package/dist/commands/init.js +0 -191
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts +0 -13
- package/dist/commands/list.js +0 -70
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/login.d.ts +0 -8
- package/dist/commands/login.js +0 -145
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -1
- package/dist/commands/logout.js +0 -19
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/migrate.d.ts +0 -12
- package/dist/commands/migrate.js +0 -106
- package/dist/commands/migrate.js.map +0 -1
- package/dist/commands/observability.d.ts +0 -14
- package/dist/commands/observability.js +0 -124
- package/dist/commands/observability.js.map +0 -1
- package/dist/commands/org.d.ts +0 -19
- package/dist/commands/org.js +0 -186
- package/dist/commands/org.js.map +0 -1
- package/dist/commands/pull.d.ts +0 -31
- package/dist/commands/pull.js +0 -210
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -25
- package/dist/commands/push.js +0 -472
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/report-create.d.ts +0 -18
- package/dist/commands/report-create.js +0 -143
- package/dist/commands/report-create.js.map +0 -1
- package/dist/commands/report.d.ts +0 -16
- package/dist/commands/report.js +0 -252
- package/dist/commands/report.js.map +0 -1
- package/dist/commands/run-eval.d.ts +0 -15
- package/dist/commands/run-eval.js +0 -187
- package/dist/commands/run-eval.js.map +0 -1
- package/dist/commands/send-message.d.ts +0 -11
- package/dist/commands/send-message.js +0 -63
- package/dist/commands/send-message.js.map +0 -1
- package/dist/commands/status.d.ts +0 -17
- package/dist/commands/status.js +0 -205
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/sync-mcp.d.ts +0 -16
- package/dist/commands/sync-mcp.js +0 -51
- package/dist/commands/sync-mcp.js.map +0 -1
- package/dist/commands/sync-skills.d.ts +0 -10
- package/dist/commands/sync-skills.js +0 -49
- package/dist/commands/sync-skills.js.map +0 -1
- package/dist/commands/unlock.d.ts +0 -1
- package/dist/commands/unlock.js +0 -13
- package/dist/commands/unlock.js.map +0 -1
- package/dist/commands/update-credential.d.ts +0 -29
- package/dist/commands/update-credential.js +0 -156
- package/dist/commands/update-credential.js.map +0 -1
- package/dist/commands/update.d.ts +0 -6
- package/dist/commands/update.js +0 -36
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/use.d.ts +0 -1
- package/dist/commands/use.js +0 -56
- package/dist/commands/use.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -11
- package/dist/commands/whoami.js +0 -30
- package/dist/commands/whoami.js.map +0 -1
- package/dist/index.d.ts +0 -28
- package/dist/lib/analytics-constants.d.ts +0 -6
- package/dist/lib/analytics-constants.js +0 -14
- package/dist/lib/analytics-constants.js.map +0 -1
- package/dist/lib/api-client.d.ts +0 -568
- package/dist/lib/api-client.js +0 -445
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/auth.d.ts +0 -50
- package/dist/lib/auth.js +0 -230
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/config.d.ts +0 -34
- package/dist/lib/config.js +0 -69
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/credential-utils.d.ts +0 -36
- package/dist/lib/credential-utils.js +0 -88
- package/dist/lib/credential-utils.js.map +0 -1
- package/dist/lib/diff-display.d.ts +0 -8
- package/dist/lib/diff-display.js +0 -37
- package/dist/lib/diff-display.js.map +0 -1
- package/dist/lib/eval-format.d.ts +0 -29
- package/dist/lib/eval-format.js +0 -44
- package/dist/lib/eval-format.js.map +0 -1
- package/dist/lib/hub-lock.d.ts +0 -7
- package/dist/lib/hub-lock.js +0 -116
- package/dist/lib/hub-lock.js.map +0 -1
- package/dist/lib/layout.d.ts +0 -79
- package/dist/lib/layout.js +0 -133
- package/dist/lib/layout.js.map +0 -1
- package/dist/lib/org-workspace.d.ts +0 -22
- package/dist/lib/org-workspace.js +0 -106
- package/dist/lib/org-workspace.js.map +0 -1
- package/dist/lib/parser.d.ts +0 -16
- package/dist/lib/parser.js +0 -306
- package/dist/lib/parser.js.map +0 -1
- package/dist/lib/repo-config.d.ts +0 -23
- package/dist/lib/repo-config.js +0 -91
- package/dist/lib/repo-config.js.map +0 -1
- package/dist/lib/report-edit-args.d.ts +0 -27
- package/dist/lib/report-edit-args.js +0 -56
- package/dist/lib/report-edit-args.js.map +0 -1
- package/dist/lib/report-inbox.d.ts +0 -19
- package/dist/lib/report-inbox.js +0 -73
- package/dist/lib/report-inbox.js.map +0 -1
- package/dist/lib/resource-files.d.ts +0 -29
- package/dist/lib/resource-files.js +0 -156
- package/dist/lib/resource-files.js.map +0 -1
- package/dist/lib/sentry.d.ts +0 -38
- package/dist/lib/sentry.js +0 -168
- package/dist/lib/sentry.js.map +0 -1
- package/dist/lib/skill-version.d.ts +0 -9
- package/dist/lib/skill-version.js +0 -53
- package/dist/lib/skill-version.js.map +0 -1
- package/dist/lib/sql-output.d.ts +0 -17
- package/dist/lib/sql-output.js +0 -48
- package/dist/lib/sql-output.js.map +0 -1
- package/dist/lib/token-store.d.ts +0 -37
- package/dist/lib/token-store.js +0 -354
- package/dist/lib/token-store.js.map +0 -1
- package/dist/lib/types.d.ts +0 -18
- package/dist/lib/types.js +0 -5
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -97
- package/dist/lib/utils.js +0 -288
- package/dist/lib/utils.js.map +0 -1
- package/dist/lib/version-cache.d.ts +0 -10
- package/dist/lib/version-cache.js +0 -34
- package/dist/lib/version-cache.js.map +0 -1
- package/dist/lib/workspace.d.ts +0 -112
- package/dist/lib/workspace.js +0 -387
- package/dist/lib/workspace.js.map +0 -1
- package/dist/lib/yaml-writer.d.ts +0 -18
- package/dist/lib/yaml-writer.js +0 -283
- package/dist/lib/yaml-writer.js.map +0 -1
package/dist/commands/push.js
DELETED
|
@@ -1,472 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* wayai push [--hub <id|name>] [-y] — parse local files, diff remote, sync to preview
|
|
3
|
-
*
|
|
4
|
-
* The hub is derived from the workspace:
|
|
5
|
-
* - cwd is inside a hub folder → use that hub
|
|
6
|
-
* - exactly one hub in the hubs dir → use it
|
|
7
|
-
* - multiple hubs → require `--hub <uuid|folder-name>` to disambiguate
|
|
8
|
-
*
|
|
9
|
-
* If a hub folder has hub.yaml without a `hub_id`, push creates the hub on the
|
|
10
|
-
* platform first, then pushes its config.
|
|
11
|
-
*/
|
|
12
|
-
import * as fs from 'node:fs';
|
|
13
|
-
import * as path from 'node:path';
|
|
14
|
-
import * as yaml from 'js-yaml';
|
|
15
|
-
import { requireAuth } from '../lib/auth.js';
|
|
16
|
-
import { ApiClient } from '../lib/api-client.js';
|
|
17
|
-
import { parseHubFolder } from '../lib/parser.js';
|
|
18
|
-
import { writeHubFolder } from '../lib/yaml-writer.js';
|
|
19
|
-
import { downloadBinaryResourceFiles } from './pull.js';
|
|
20
|
-
import { printDiff } from '../lib/diff-display.js';
|
|
21
|
-
import { confirm, slugify, resolveHubYamlPath, UUID_RE } from '../lib/utils.js';
|
|
22
|
-
import { autoRenameHubFolder, scanWorkspaceHubs, scanNewHubs, detectWorkspace, findGitRoot, findEnclosingHubFolder, } from '../lib/workspace.js';
|
|
23
|
-
import { resolveLayout, warnLayoutOnce, hubsDirLabel } from '../lib/layout.js';
|
|
24
|
-
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
25
|
-
import { assertHubMatchesLock, assertNoLockBlocksHubCreation, autoLockIfUnlocked } from '../lib/hub-lock.js';
|
|
26
|
-
function parseArgs(args) {
|
|
27
|
-
let autoConfirm = false;
|
|
28
|
-
let hubSelector;
|
|
29
|
-
for (let i = 0; i < args.length; i++) {
|
|
30
|
-
const arg = args[i];
|
|
31
|
-
if (arg === '--yes' || arg === '-y') {
|
|
32
|
-
autoConfirm = true;
|
|
33
|
-
}
|
|
34
|
-
else if (arg === '--hub' && args[i + 1]) {
|
|
35
|
-
hubSelector = args[++i];
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return { autoConfirm, hubSelector };
|
|
39
|
-
}
|
|
40
|
-
export function printSyncResult(result) {
|
|
41
|
-
console.log(`\nSync complete. Preview hub: ${result.preview_hub_id}`);
|
|
42
|
-
const c = result.changes;
|
|
43
|
-
const parts = [];
|
|
44
|
-
if (c.hub_updated)
|
|
45
|
-
parts.push('hub updated');
|
|
46
|
-
if (c.connections_created > 0)
|
|
47
|
-
parts.push(`${c.connections_created} connection(s) created`);
|
|
48
|
-
if (c.connections_updated > 0)
|
|
49
|
-
parts.push(`${c.connections_updated} connection(s) updated`);
|
|
50
|
-
if (c.connections_deleted > 0)
|
|
51
|
-
parts.push(`${c.connections_deleted} connection(s) deleted`);
|
|
52
|
-
if (c.agents_created > 0)
|
|
53
|
-
parts.push(`${c.agents_created} agent(s) created`);
|
|
54
|
-
if (c.agents_updated > 0)
|
|
55
|
-
parts.push(`${c.agents_updated} agent(s) updated`);
|
|
56
|
-
if (c.agents_deleted > 0)
|
|
57
|
-
parts.push(`${c.agents_deleted} agent(s) deleted`);
|
|
58
|
-
if (c.tools_created > 0)
|
|
59
|
-
parts.push(`${c.tools_created} tool(s) created`);
|
|
60
|
-
if (c.tools_updated > 0)
|
|
61
|
-
parts.push(`${c.tools_updated} tool(s) updated`);
|
|
62
|
-
if (c.tools_deleted > 0)
|
|
63
|
-
parts.push(`${c.tools_deleted} tool(s) deleted`);
|
|
64
|
-
if (c.states_created > 0)
|
|
65
|
-
parts.push(`${c.states_created} state(s) created`);
|
|
66
|
-
if (c.states_updated > 0)
|
|
67
|
-
parts.push(`${c.states_updated} state(s) updated`);
|
|
68
|
-
if (c.states_deleted > 0)
|
|
69
|
-
parts.push(`${c.states_deleted} state(s) deleted`);
|
|
70
|
-
if (c.teams_created > 0)
|
|
71
|
-
parts.push(`${c.teams_created} team(s) created`);
|
|
72
|
-
if (c.teams_updated > 0)
|
|
73
|
-
parts.push(`${c.teams_updated} team(s) updated`);
|
|
74
|
-
if (c.teams_deleted > 0)
|
|
75
|
-
parts.push(`${c.teams_deleted} team(s) deleted`);
|
|
76
|
-
if (c.resources_created > 0)
|
|
77
|
-
parts.push(`${c.resources_created} resource(s) created`);
|
|
78
|
-
if (c.resources_updated > 0)
|
|
79
|
-
parts.push(`${c.resources_updated} resource(s) updated`);
|
|
80
|
-
if (c.resources_deleted > 0)
|
|
81
|
-
parts.push(`${c.resources_deleted} resource(s) deleted`);
|
|
82
|
-
if (c.resource_files_uploaded > 0)
|
|
83
|
-
parts.push(`${c.resource_files_uploaded} resource file(s) uploaded`);
|
|
84
|
-
if (c.resource_files_deleted > 0)
|
|
85
|
-
parts.push(`${c.resource_files_deleted} resource file(s) deleted`);
|
|
86
|
-
if (c.resource_links_created > 0)
|
|
87
|
-
parts.push(`${c.resource_links_created} resource link(s) created`);
|
|
88
|
-
if (c.resource_links_updated > 0)
|
|
89
|
-
parts.push(`${c.resource_links_updated} resource link(s) updated`);
|
|
90
|
-
if (c.resource_links_deleted > 0)
|
|
91
|
-
parts.push(`${c.resource_links_deleted} resource link(s) deleted`);
|
|
92
|
-
if (c.outbound_contacts_created > 0)
|
|
93
|
-
parts.push(`${c.outbound_contacts_created} outbound contact(s) created`);
|
|
94
|
-
if (c.outbound_contacts_updated > 0)
|
|
95
|
-
parts.push(`${c.outbound_contacts_updated} outbound contact(s) updated`);
|
|
96
|
-
if (c.outbound_contacts_deleted > 0)
|
|
97
|
-
parts.push(`${c.outbound_contacts_deleted} outbound contact(s) deleted`);
|
|
98
|
-
if (c.outbound_lists_created > 0)
|
|
99
|
-
parts.push(`${c.outbound_lists_created} outbound list(s) created`);
|
|
100
|
-
if (c.outbound_lists_updated > 0)
|
|
101
|
-
parts.push(`${c.outbound_lists_updated} outbound list(s) updated`);
|
|
102
|
-
if (c.outbound_lists_deleted > 0)
|
|
103
|
-
parts.push(`${c.outbound_lists_deleted} outbound list(s) deleted`);
|
|
104
|
-
if (c.outbound_schedules_created > 0)
|
|
105
|
-
parts.push(`${c.outbound_schedules_created} outbound schedule(s) created`);
|
|
106
|
-
if (c.outbound_schedules_updated > 0)
|
|
107
|
-
parts.push(`${c.outbound_schedules_updated} outbound schedule(s) updated`);
|
|
108
|
-
if (c.outbound_schedules_deleted > 0)
|
|
109
|
-
parts.push(`${c.outbound_schedules_deleted} outbound schedule(s) deleted`);
|
|
110
|
-
if (parts.length > 0) {
|
|
111
|
-
console.log(`Changes: ${parts.join(', ')}`);
|
|
112
|
-
}
|
|
113
|
-
if (result.errors && result.errors.length > 0) {
|
|
114
|
-
printWarnings(result.errors);
|
|
115
|
-
}
|
|
116
|
-
if (result.warnings && result.warnings.length > 0) {
|
|
117
|
-
printWarnings(result.warnings.map((w) => w.message));
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/** Render a yellow-highlighted "Warnings (N)" block. Shared by push + sync output. */
|
|
121
|
-
export function printWarnings(warnings) {
|
|
122
|
-
if (warnings.length === 0)
|
|
123
|
-
return;
|
|
124
|
-
console.log(`\n\x1b[33mWarnings (${warnings.length}):\x1b[0m`);
|
|
125
|
-
for (const w of warnings) {
|
|
126
|
-
console.log(` \x1b[33m! ${w}\x1b[0m`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Auto-rename agent .yaml and .md files when agents have been renamed (matched by ID).
|
|
131
|
-
* Compares local agent names against remote agent names via pull,
|
|
132
|
-
* then renames old-slug.yaml → new-slug.yaml and old-slug.md → new-slug.md.
|
|
133
|
-
* Handles slug swaps via temp files.
|
|
134
|
-
* Also updates explicit `instructions` paths in the hub YAML to match.
|
|
135
|
-
*/
|
|
136
|
-
export async function autoRenameAgentFiles(client, hubId, hubFolder, organizationId) {
|
|
137
|
-
// Collect agents with IDs from per-agent YAML files or main YAML
|
|
138
|
-
const agentsDir = path.join(hubFolder, 'agents');
|
|
139
|
-
let agentsWithIds = [];
|
|
140
|
-
// Try per-agent YAML files first
|
|
141
|
-
if (fs.existsSync(agentsDir)) {
|
|
142
|
-
const yamlFiles = fs.readdirSync(agentsDir).filter((f) => f.endsWith('.yaml'));
|
|
143
|
-
for (const file of yamlFiles) {
|
|
144
|
-
try {
|
|
145
|
-
const content = fs.readFileSync(path.join(agentsDir, file), 'utf-8');
|
|
146
|
-
const agent = yaml.load(content);
|
|
147
|
-
if (agent?.id && agent.name) {
|
|
148
|
-
agentsWithIds.push({ id: agent.id, name: agent.name });
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
console.warn(` Warning: could not parse agents/${file}, skipping`);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Fall back to inline agents from main YAML
|
|
157
|
-
if (agentsWithIds.length === 0) {
|
|
158
|
-
const yamlPath = resolveHubYamlPath(hubFolder);
|
|
159
|
-
if (!yamlPath)
|
|
160
|
-
return;
|
|
161
|
-
const yamlContent = fs.readFileSync(yamlPath, 'utf-8');
|
|
162
|
-
const config = yaml.load(yamlContent);
|
|
163
|
-
agentsWithIds = (config.agents || []).filter((a) => !!a.id && !!a.name);
|
|
164
|
-
}
|
|
165
|
-
if (agentsWithIds.length === 0)
|
|
166
|
-
return;
|
|
167
|
-
// Fetch remote state to detect renames (extra round-trip, only when agents have IDs)
|
|
168
|
-
console.log('Checking for agent renames...');
|
|
169
|
-
let remote;
|
|
170
|
-
try {
|
|
171
|
-
remote = await client.pull(hubId, organizationId);
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
console.warn(` Warning: could not fetch remote state for auto-rename (${err instanceof Error ? err.message : String(err)}). File renames skipped.`);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
// Build remote agent id → name map
|
|
178
|
-
const remoteAgentNames = new Map();
|
|
179
|
-
for (const agent of remote.agents || []) {
|
|
180
|
-
if (agent.id) {
|
|
181
|
-
remoteAgentNames.set(agent.id, agent.name);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
// Collect renames needed (old slug → new slug)
|
|
185
|
-
const renames = [];
|
|
186
|
-
for (const agent of agentsWithIds) {
|
|
187
|
-
const remoteName = remoteAgentNames.get(agent.id);
|
|
188
|
-
if (!remoteName || remoteName === agent.name)
|
|
189
|
-
continue;
|
|
190
|
-
const oldSlug = slugify(remoteName);
|
|
191
|
-
const newSlug = slugify(agent.name);
|
|
192
|
-
if (oldSlug !== newSlug) {
|
|
193
|
-
renames.push({ oldSlug, newSlug });
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
if (renames.length === 0)
|
|
197
|
-
return;
|
|
198
|
-
if (!fs.existsSync(agentsDir))
|
|
199
|
-
return;
|
|
200
|
-
// Clean up orphaned temp files from a previous interrupted rename
|
|
201
|
-
for (const file of fs.readdirSync(agentsDir)) {
|
|
202
|
-
if (file.startsWith('__rename_temp_') && (file.endsWith('.md') || file.endsWith('.yaml'))) {
|
|
203
|
-
console.warn(` Warning: removing orphaned temp file agents/${file}`);
|
|
204
|
-
fs.unlinkSync(path.join(agentsDir, file));
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// Helper to rename a file if it exists (for both .yaml and .md extensions)
|
|
208
|
-
const renameFileIfExists = (dir, oldName, newName) => {
|
|
209
|
-
const oldPath = path.join(dir, oldName);
|
|
210
|
-
const newPath = path.join(dir, newName);
|
|
211
|
-
if (!fs.existsSync(oldPath))
|
|
212
|
-
return false;
|
|
213
|
-
fs.renameSync(oldPath, newPath);
|
|
214
|
-
return true;
|
|
215
|
-
};
|
|
216
|
-
// Detect slug swaps: if newSlug matches another rename's oldSlug
|
|
217
|
-
const oldSlugs = new Set(renames.map((r) => r.oldSlug));
|
|
218
|
-
const newSlugs = new Set(renames.map((r) => r.newSlug));
|
|
219
|
-
const hasConflicts = renames.some((r) => oldSlugs.has(r.newSlug)) || newSlugs.size !== renames.length;
|
|
220
|
-
// Track which renames actually completed (file existed and was moved)
|
|
221
|
-
const completedRenames = [];
|
|
222
|
-
const extensions = ['.yaml', '.md'];
|
|
223
|
-
if (hasConflicts) {
|
|
224
|
-
// Rename through temp files to avoid collisions
|
|
225
|
-
const tempRenames = [];
|
|
226
|
-
for (const { oldSlug, newSlug } of renames) {
|
|
227
|
-
const tempName = `__rename_temp_${oldSlug}_${Date.now()}`;
|
|
228
|
-
tempRenames.push({ oldSlug, tempName, newSlug });
|
|
229
|
-
}
|
|
230
|
-
// Step 1: old → temp (both extensions)
|
|
231
|
-
for (const { oldSlug, tempName } of tempRenames) {
|
|
232
|
-
for (const ext of extensions) {
|
|
233
|
-
renameFileIfExists(agentsDir, `${oldSlug}${ext}`, `${tempName}${ext}`);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
// Step 2: temp → new (both extensions)
|
|
237
|
-
for (const { oldSlug, tempName, newSlug } of tempRenames) {
|
|
238
|
-
let anyRenamed = false;
|
|
239
|
-
for (const ext of extensions) {
|
|
240
|
-
if (renameFileIfExists(agentsDir, `${tempName}${ext}`, `${newSlug}${ext}`)) {
|
|
241
|
-
anyRenamed = true;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
if (anyRenamed) {
|
|
245
|
-
completedRenames.push({ oldSlug, newSlug });
|
|
246
|
-
console.log(` Renamed agents/${oldSlug}.* → agents/${newSlug}.*`);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
// No conflicts — direct renames
|
|
252
|
-
for (const { oldSlug, newSlug } of renames) {
|
|
253
|
-
// Check if any file with old slug exists
|
|
254
|
-
const hasOldFile = extensions.some((ext) => fs.existsSync(path.join(agentsDir, `${oldSlug}${ext}`)));
|
|
255
|
-
if (!hasOldFile)
|
|
256
|
-
continue;
|
|
257
|
-
// Check for target conflicts
|
|
258
|
-
const hasNewFile = extensions.some((ext) => fs.existsSync(path.join(agentsDir, `${newSlug}${ext}`)));
|
|
259
|
-
if (hasNewFile) {
|
|
260
|
-
console.warn(` Warning: skipping rename agents/${oldSlug}.* → agents/${newSlug}.* (target already exists)`);
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
|
-
for (const ext of extensions) {
|
|
264
|
-
renameFileIfExists(agentsDir, `${oldSlug}${ext}`, `${newSlug}${ext}`);
|
|
265
|
-
}
|
|
266
|
-
completedRenames.push({ oldSlug, newSlug });
|
|
267
|
-
console.log(` Renamed agents/${oldSlug}.* → agents/${newSlug}.*`);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
if (completedRenames.length === 0)
|
|
271
|
-
return;
|
|
272
|
-
// Update explicit instructions paths in hub YAML for completed renames only.
|
|
273
|
-
const mainYamlPath = resolveHubYamlPath(hubFolder);
|
|
274
|
-
if (mainYamlPath) {
|
|
275
|
-
const mainYamlContent = fs.readFileSync(mainYamlPath, 'utf-8');
|
|
276
|
-
const substitutionMap = new Map();
|
|
277
|
-
for (const { oldSlug, newSlug } of completedRenames) {
|
|
278
|
-
substitutionMap.set(`agents/${oldSlug}.md`, `agents/${newSlug}.md`);
|
|
279
|
-
}
|
|
280
|
-
const escapedKeys = Array.from(substitutionMap.keys())
|
|
281
|
-
.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
282
|
-
const updatedYaml = mainYamlContent.replace(new RegExp(`(instructions:\\s+)(${escapedKeys.join('|')})`, 'g'), (_match, prefix, pathMatch) => `${prefix}${substitutionMap.get(pathMatch) ?? pathMatch}`);
|
|
283
|
-
if (updatedYaml !== mainYamlContent) {
|
|
284
|
-
fs.writeFileSync(mainYamlPath, updatedYaml, 'utf-8');
|
|
285
|
-
console.log(` Updated instructions paths in ${path.basename(mainYamlPath)}`);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
/** Pull remote config after push, sync local files, and rename hub folder if needed. */
|
|
290
|
-
async function syncAfterPush(client, hubId, hubFolder, organizationId) {
|
|
291
|
-
try {
|
|
292
|
-
const remoteConfig = await client.pull(hubId, organizationId);
|
|
293
|
-
writeHubFolder(hubFolder, remoteConfig);
|
|
294
|
-
await downloadBinaryResourceFiles(hubFolder, remoteConfig);
|
|
295
|
-
console.log('Local files synced with server.');
|
|
296
|
-
const finalFolder = autoRenameHubFolder(hubFolder, remoteConfig.hub.name, remoteConfig.hub_environment, hubId, remoteConfig.preview_label, remoteConfig.branch_name);
|
|
297
|
-
if (finalFolder !== hubFolder) {
|
|
298
|
-
console.log(`Hub folder is now ${finalFolder}`);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
catch (err) {
|
|
302
|
-
console.warn(`Warning: could not sync local files after push (${err instanceof Error ? err.message : String(err)})`);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
async function pushSingleHub(client, hubId, hubFolder, autoConfirm, organizationId, opts) {
|
|
306
|
-
if (!opts?.skipAgentRename) {
|
|
307
|
-
// Auto-rename agent .md files if agents were renamed (before parsing)
|
|
308
|
-
await autoRenameAgentFiles(client, hubId, hubFolder, organizationId);
|
|
309
|
-
}
|
|
310
|
-
console.log('Parsing local configuration...');
|
|
311
|
-
const localConfig = parseHubFolder(hubFolder);
|
|
312
|
-
console.log('Computing diff...');
|
|
313
|
-
const diffResult = await client.diff(hubId, localConfig, 'push', organizationId);
|
|
314
|
-
// Render diff-time warnings (e.g. native/delegation tools dropped due to
|
|
315
|
-
// missing connections) before any short-circuit. Without this, a push where
|
|
316
|
-
// every change was silently dropped would just say "No changes to push". See
|
|
317
|
-
// gh #1538.
|
|
318
|
-
printWarnings(diffResult.warnings);
|
|
319
|
-
if (!diffResult.has_changes) {
|
|
320
|
-
// Still rename folder if hub name changed (content matches but folder slug is stale)
|
|
321
|
-
const finalFolder = autoRenameHubFolder(hubFolder, localConfig.hub.name, localConfig.hub_environment, hubId, localConfig.preview_label, localConfig.branch_name);
|
|
322
|
-
if (finalFolder === hubFolder) {
|
|
323
|
-
console.log('No changes to push.');
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
console.log('No changes to push; folder renamed.');
|
|
327
|
-
}
|
|
328
|
-
autoLockIfUnlocked(hubId);
|
|
329
|
-
return true;
|
|
330
|
-
}
|
|
331
|
-
console.log('\nChanges to push:');
|
|
332
|
-
printDiff(diffResult.summary);
|
|
333
|
-
if (!autoConfirm) {
|
|
334
|
-
const ok = await confirm('Push these changes?');
|
|
335
|
-
if (!ok) {
|
|
336
|
-
console.log('Cancelled.');
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
console.log('Pushing changes...');
|
|
341
|
-
const result = await client.push(hubId, localConfig, organizationId);
|
|
342
|
-
printSyncResult(result);
|
|
343
|
-
await syncAfterPush(client, hubId, hubFolder, organizationId);
|
|
344
|
-
autoLockIfUnlocked(hubId);
|
|
345
|
-
return true;
|
|
346
|
-
}
|
|
347
|
-
function resolveWorkspaceDir() {
|
|
348
|
-
const workspace = detectWorkspace();
|
|
349
|
-
if (workspace)
|
|
350
|
-
return workspace.workspaceDir;
|
|
351
|
-
const gitRoot = findGitRoot();
|
|
352
|
-
if (!gitRoot) {
|
|
353
|
-
console.error('Not inside a git repository.');
|
|
354
|
-
process.exit(1);
|
|
355
|
-
}
|
|
356
|
-
return resolveLayout(gitRoot).hubsDir;
|
|
357
|
-
}
|
|
358
|
-
function selectExistingHub(workspaceDir, allHubs, selector, wsLabel) {
|
|
359
|
-
if (selector) {
|
|
360
|
-
const match = allHubs.find((h) => h.hubId === selector || path.basename(h.hubFolder) === selector);
|
|
361
|
-
if (!match) {
|
|
362
|
-
console.error(`No hub matching --hub ${selector} found in ${wsLabel}/.`);
|
|
363
|
-
process.exit(1);
|
|
364
|
-
}
|
|
365
|
-
return match;
|
|
366
|
-
}
|
|
367
|
-
const enclosing = findEnclosingHubFolder(workspaceDir);
|
|
368
|
-
if (enclosing)
|
|
369
|
-
return enclosing;
|
|
370
|
-
if (allHubs.length === 1)
|
|
371
|
-
return allHubs[0];
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
374
|
-
function selectNewHub(newHubs, selector) {
|
|
375
|
-
if (selector) {
|
|
376
|
-
const match = newHubs.find((h) => path.basename(h.hubFolder) === selector);
|
|
377
|
-
if (!match)
|
|
378
|
-
return null;
|
|
379
|
-
return match;
|
|
380
|
-
}
|
|
381
|
-
// Try cwd
|
|
382
|
-
const cwd = process.cwd();
|
|
383
|
-
const cwdMatch = newHubs.find((h) => path.resolve(h.hubFolder) === path.resolve(cwd));
|
|
384
|
-
if (cwdMatch)
|
|
385
|
-
return cwdMatch;
|
|
386
|
-
if (newHubs.length === 1)
|
|
387
|
-
return newHubs[0];
|
|
388
|
-
return null;
|
|
389
|
-
}
|
|
390
|
-
export async function pushCommand(args) {
|
|
391
|
-
const { autoConfirm, hubSelector } = parseArgs(args);
|
|
392
|
-
const repoConfig = requireRepoConfig();
|
|
393
|
-
const { organization_id: organizationId } = repoConfig;
|
|
394
|
-
const { config, accessToken } = await requireAuth();
|
|
395
|
-
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
396
|
-
const workspaceDir = resolveWorkspaceDir();
|
|
397
|
-
const gitRoot = findGitRoot();
|
|
398
|
-
const wsLabel = hubsDirLabel(gitRoot);
|
|
399
|
-
if (gitRoot)
|
|
400
|
-
warnLayoutOnce(gitRoot);
|
|
401
|
-
if (!fs.existsSync(workspaceDir)) {
|
|
402
|
-
console.error(`No ${wsLabel}/ directory found. Run \`wayai pull\` first or create hub files in ${wsLabel}/<hub>/hub.yaml.`);
|
|
403
|
-
process.exit(1);
|
|
404
|
-
}
|
|
405
|
-
// Scan once and reuse — both existing- and new-hub flows share these arrays
|
|
406
|
-
const existingHubs = scanWorkspaceHubs(workspaceDir);
|
|
407
|
-
const newHubs = scanNewHubs(workspaceDir);
|
|
408
|
-
// Existing hub flow first — prefer hubs that already have hub_id
|
|
409
|
-
const existing = selectExistingHub(workspaceDir, existingHubs, hubSelector, wsLabel);
|
|
410
|
-
if (existing) {
|
|
411
|
-
assertHubMatchesLock(existing.hubId, path.basename(existing.hubFolder));
|
|
412
|
-
await pushSingleHub(client, existing.hubId, existing.hubFolder, autoConfirm, organizationId);
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
// No existing hub matched — try the new-hub flow
|
|
416
|
-
const newHub = selectNewHub(newHubs, hubSelector);
|
|
417
|
-
if (!newHub) {
|
|
418
|
-
if (existingHubs.length === 0 && newHubs.length === 0) {
|
|
419
|
-
console.error(`No hub folders found. Create hub files in ${wsLabel}/<hub>/hub.yaml with \`hub: { name: ... }\` and run \`wayai push\`.`);
|
|
420
|
-
process.exit(1);
|
|
421
|
-
}
|
|
422
|
-
console.error(`Multiple hub folders found in ${wsLabel}/. Pass --hub <uuid|folder-name> to choose, or run from inside a hub folder:`);
|
|
423
|
-
for (const h of existingHubs) {
|
|
424
|
-
console.error(` ${path.basename(h.hubFolder)} (${h.hubId})`);
|
|
425
|
-
}
|
|
426
|
-
for (const h of newHubs) {
|
|
427
|
-
console.error(` ${path.basename(h.hubFolder)} (new — "${h.hubName}")`);
|
|
428
|
-
}
|
|
429
|
-
process.exit(1);
|
|
430
|
-
}
|
|
431
|
-
assertNoLockBlocksHubCreation(newHub.hubName);
|
|
432
|
-
const hubType = newHub.hubType || 'chat';
|
|
433
|
-
console.log(`\nNew hub detected: "${newHub.hubName}" (${hubType})`);
|
|
434
|
-
if (!autoConfirm) {
|
|
435
|
-
const ok = await confirm('Create this hub on the platform?');
|
|
436
|
-
if (!ok) {
|
|
437
|
-
console.log('Cancelled.');
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
const hubYamlPath = resolveHubYamlPath(newHub.hubFolder);
|
|
442
|
-
if (!hubYamlPath) {
|
|
443
|
-
console.error(`hub.yaml not found in ${newHub.hubFolder}. Cannot proceed with hub creation.`);
|
|
444
|
-
process.exit(1);
|
|
445
|
-
}
|
|
446
|
-
console.log('Creating hub...');
|
|
447
|
-
const createResult = await client.createHub(organizationId, newHub.hubName, hubType);
|
|
448
|
-
const createdHub = createResult.data[0];
|
|
449
|
-
const hubId = createdHub.hub_id;
|
|
450
|
-
if (!UUID_RE.test(hubId)) {
|
|
451
|
-
console.error(`Invalid hub_id received from server: ${hubId}`);
|
|
452
|
-
process.exit(1);
|
|
453
|
-
}
|
|
454
|
-
console.log(`Hub created: ${createdHub.hub_name} (${hubId})`);
|
|
455
|
-
// Update hub.yaml with hub_id and hub_environment
|
|
456
|
-
const content = fs.readFileSync(hubYamlPath, 'utf-8');
|
|
457
|
-
const hasVersion = content.match(/^version:\s/m);
|
|
458
|
-
let updated;
|
|
459
|
-
if (hasVersion) {
|
|
460
|
-
updated = content.replace(/^(version:\s.*\n)/m, `$1hub_id: "${hubId}"\nhub_environment: preview\n`);
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
updated = `version: 1\nhub_id: "${hubId}"\nhub_environment: preview\n${content}`;
|
|
464
|
-
}
|
|
465
|
-
fs.writeFileSync(hubYamlPath, updated, 'utf-8');
|
|
466
|
-
// Auto-lock only after hub.yaml is persisted, so a write failure can't
|
|
467
|
-
// leave a lock pointing at a hub with no local files.
|
|
468
|
-
autoLockIfUnlocked(hubId);
|
|
469
|
-
// Push the new hub (skip autoRenameAgentFiles — no remote agents exist)
|
|
470
|
-
await pushSingleHub(client, hubId, newHub.hubFolder, autoConfirm, organizationId, { skipAgentRename: true });
|
|
471
|
-
}
|
|
472
|
-
//# sourceMappingURL=push.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* wayai report create — submit a platform bug report to the triage queue.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* wayai report create --title "Title" --description "Description"
|
|
6
|
-
* wayai report create -t "Title" -d "Description" --hub <uuid> --error "Error msg"
|
|
7
|
-
*
|
|
8
|
-
* Auto-captures hub/org context from .wayai.yaml if present.
|
|
9
|
-
*
|
|
10
|
-
* The report lands in the platform_report queue (status=pending). A Claude
|
|
11
|
-
* Code Desktop routine triages on a 15-min cadence: groups by root cause,
|
|
12
|
-
* dismisses noise, escalates actionable clusters by opening one GitHub issue
|
|
13
|
-
* per group. You'll receive a follow-up email on escalation, on resolution
|
|
14
|
-
* (fix shipped), or on dismissal (polite-no with the reason). If your report
|
|
15
|
-
* is silently grouped as a duplicate of another, you won't get a separate
|
|
16
|
-
* email — you'll only hear from us when the underlying issue is resolved.
|
|
17
|
-
*/
|
|
18
|
-
export declare function reportCreateCommand(args: string[]): Promise<void>;
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* wayai report create — submit a platform bug report to the triage queue.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* wayai report create --title "Title" --description "Description"
|
|
6
|
-
* wayai report create -t "Title" -d "Description" --hub <uuid> --error "Error msg"
|
|
7
|
-
*
|
|
8
|
-
* Auto-captures hub/org context from .wayai.yaml if present.
|
|
9
|
-
*
|
|
10
|
-
* The report lands in the platform_report queue (status=pending). A Claude
|
|
11
|
-
* Code Desktop routine triages on a 15-min cadence: groups by root cause,
|
|
12
|
-
* dismisses noise, escalates actionable clusters by opening one GitHub issue
|
|
13
|
-
* per group. You'll receive a follow-up email on escalation, on resolution
|
|
14
|
-
* (fix shipped), or on dismissal (polite-no with the reason). If your report
|
|
15
|
-
* is silently grouped as a duplicate of another, you won't get a separate
|
|
16
|
-
* email — you'll only hear from us when the underlying issue is resolved.
|
|
17
|
-
*/
|
|
18
|
-
import { readFileSync } from 'node:fs';
|
|
19
|
-
import { dirname, join } from 'node:path';
|
|
20
|
-
import { fileURLToPath } from 'node:url';
|
|
21
|
-
import { requireAuth } from '../lib/auth.js';
|
|
22
|
-
import { readRepoConfig } from '../lib/repo-config.js';
|
|
23
|
-
import { ApiClient, ApiError } from '../lib/api-client.js';
|
|
24
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
25
|
-
function getCliVersion() {
|
|
26
|
-
try {
|
|
27
|
-
const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf-8'));
|
|
28
|
-
return `cli@${pkg.version}`;
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return 'cli@unknown';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export async function reportCreateCommand(args) {
|
|
35
|
-
// Parse args
|
|
36
|
-
let title;
|
|
37
|
-
let description;
|
|
38
|
-
let source;
|
|
39
|
-
let classification;
|
|
40
|
-
let dedupKey;
|
|
41
|
-
let hubId;
|
|
42
|
-
let conversationId;
|
|
43
|
-
let errorMessage;
|
|
44
|
-
let steps;
|
|
45
|
-
let context;
|
|
46
|
-
for (let i = 0; i < args.length; i++) {
|
|
47
|
-
const arg = args[i];
|
|
48
|
-
if (arg === '--title' || arg === '-t') {
|
|
49
|
-
title = args[++i];
|
|
50
|
-
}
|
|
51
|
-
else if (arg === '--description' || arg === '-d') {
|
|
52
|
-
description = args[++i];
|
|
53
|
-
}
|
|
54
|
-
else if (arg === '--source') {
|
|
55
|
-
source = args[++i];
|
|
56
|
-
}
|
|
57
|
-
else if (arg === '--classification') {
|
|
58
|
-
classification = args[++i];
|
|
59
|
-
}
|
|
60
|
-
else if (arg === '--dedup-key') {
|
|
61
|
-
dedupKey = args[++i];
|
|
62
|
-
}
|
|
63
|
-
else if (arg === '--hub') {
|
|
64
|
-
hubId = args[++i];
|
|
65
|
-
}
|
|
66
|
-
else if (arg === '--conversation') {
|
|
67
|
-
conversationId = args[++i];
|
|
68
|
-
}
|
|
69
|
-
else if (arg === '--error' || arg === '-e') {
|
|
70
|
-
errorMessage = args[++i];
|
|
71
|
-
}
|
|
72
|
-
else if (arg === '--steps' || arg === '-s') {
|
|
73
|
-
steps = args[++i];
|
|
74
|
-
}
|
|
75
|
-
else if (arg === '--context') {
|
|
76
|
-
context = args[++i];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (!title || !description) {
|
|
80
|
-
console.error('Usage: wayai report create --title "Title" --description "Description"');
|
|
81
|
-
console.error('');
|
|
82
|
-
console.error('Required:');
|
|
83
|
-
console.error(' -t, --title <text> Bug title');
|
|
84
|
-
console.error(' -d, --description <text> Detailed description');
|
|
85
|
-
console.error('');
|
|
86
|
-
console.error('Optional:');
|
|
87
|
-
console.error(' --source <value> Origin: cli (default) | review | security_audit');
|
|
88
|
-
console.error(' --classification <value> Nature: bug (default) | flaky_test | security');
|
|
89
|
-
console.error(' --dedup-key <text> Stable dedup key (e.g. "<file>::<test>")');
|
|
90
|
-
console.error(' --hub <uuid> Hub ID (optional context for the bug report)');
|
|
91
|
-
console.error(' --conversation <uuid> Conversation ID');
|
|
92
|
-
console.error(' -e, --error <text> Error message or stack trace');
|
|
93
|
-
console.error(' -s, --steps <text> Steps to reproduce');
|
|
94
|
-
console.error(' --context <text> Additional context');
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
const { config, accessToken } = await requireAuth();
|
|
98
|
-
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
99
|
-
// Auto-capture from .wayai.yaml (optional — don't fail if missing)
|
|
100
|
-
const repoConfig = readRepoConfig();
|
|
101
|
-
const organizationId = repoConfig?.organization_id;
|
|
102
|
-
try {
|
|
103
|
-
const result = await client.submitReport({
|
|
104
|
-
title,
|
|
105
|
-
description,
|
|
106
|
-
source,
|
|
107
|
-
classification,
|
|
108
|
-
dedup_key: dedupKey,
|
|
109
|
-
organization_id: organizationId,
|
|
110
|
-
hub_id: hubId,
|
|
111
|
-
conversation_id: conversationId,
|
|
112
|
-
error_message: errorMessage,
|
|
113
|
-
steps_to_reproduce: steps,
|
|
114
|
-
additional_context: context,
|
|
115
|
-
client_version: getCliVersion(),
|
|
116
|
-
});
|
|
117
|
-
if (result.created) {
|
|
118
|
-
console.log(`Report submitted: ${result.report_id}`);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
console.log(`Report merged with existing: ${result.report_id}`);
|
|
122
|
-
}
|
|
123
|
-
console.log('A WayAI engineer (or one of our AI agents) will triage your report.');
|
|
124
|
-
console.log('You\'ll get an email on escalation, resolution, or dismissal — if your');
|
|
125
|
-
console.log('report is silently grouped as a duplicate, you won\'t get a separate email.');
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
if (err instanceof ApiError) {
|
|
129
|
-
if (err.status === 429) {
|
|
130
|
-
console.error('Rate limit exceeded. Please try again later.');
|
|
131
|
-
}
|
|
132
|
-
else if (err.status === 503) {
|
|
133
|
-
console.error('Report submission is not currently available.');
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
console.error(`Failed to submit report: ${err.message}`);
|
|
137
|
-
}
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
140
|
-
throw err;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=report-create.js.map
|