@wayai/cli 0.2.43 → 0.2.45

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 (44) hide show
  1. package/dist/commands/create-credential.d.ts +18 -0
  2. package/dist/commands/create-credential.js +162 -0
  3. package/dist/commands/create-credential.js.map +1 -0
  4. package/dist/commands/create-project.d.ts +14 -0
  5. package/dist/commands/create-project.js +50 -0
  6. package/dist/commands/create-project.js.map +1 -0
  7. package/dist/commands/init.js +65 -52
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/login.d.ts +1 -1
  10. package/dist/commands/login.js +29 -67
  11. package/dist/commands/login.js.map +1 -1
  12. package/dist/commands/push.d.ts +2 -1
  13. package/dist/commands/push.js +131 -43
  14. package/dist/commands/push.js.map +1 -1
  15. package/dist/commands/status.js +1 -1
  16. package/dist/commands/status.js.map +1 -1
  17. package/dist/index.d.ts +9 -7
  18. package/dist/index.js +43 -26
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/api-client.d.ts +43 -0
  21. package/dist/lib/api-client.js +24 -0
  22. package/dist/lib/api-client.js.map +1 -1
  23. package/dist/lib/auth.d.ts +24 -35
  24. package/dist/lib/auth.js +74 -121
  25. package/dist/lib/auth.js.map +1 -1
  26. package/dist/lib/config.d.ts +2 -6
  27. package/dist/lib/config.js +10 -1
  28. package/dist/lib/config.js.map +1 -1
  29. package/dist/lib/parser.d.ts +5 -1
  30. package/dist/lib/parser.js +14 -18
  31. package/dist/lib/parser.js.map +1 -1
  32. package/dist/lib/repo-config.d.ts +18 -0
  33. package/dist/lib/repo-config.js +75 -1
  34. package/dist/lib/repo-config.js.map +1 -1
  35. package/dist/lib/sentry.d.ts +3 -2
  36. package/dist/lib/sentry.js +14 -2
  37. package/dist/lib/sentry.js.map +1 -1
  38. package/dist/lib/utils.d.ts +20 -0
  39. package/dist/lib/utils.js +48 -0
  40. package/dist/lib/utils.js.map +1 -1
  41. package/dist/lib/workspace.d.ts +11 -0
  42. package/dist/lib/workspace.js +47 -0
  43. package/dist/lib/workspace.js.map +1 -1
  44. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ /**
2
+ * wayai create-credential — create an organization credential (API key, token, or basic auth)
3
+ *
4
+ * Usage:
5
+ * wayai create-credential --name "openai-key" --type "Bearer Token"
6
+ * wayai create-credential --name "my-api" --type "Basic Auth" --org <uuid>
7
+ * echo "$SECRET" | wayai create-credential --name "openai-key" --type "Bearer Token" --stdin
8
+ */
9
+ interface ParsedArgs {
10
+ name: string | undefined;
11
+ type: string | undefined;
12
+ orgId: string | undefined;
13
+ description: string | undefined;
14
+ stdin: boolean;
15
+ }
16
+ export declare function parseArgs(args: string[]): ParsedArgs;
17
+ export declare function createCredentialCommand(args: string[]): Promise<void>;
18
+ export {};
@@ -0,0 +1,162 @@
1
+ /**
2
+ * wayai create-credential — create an organization credential (API key, token, or basic auth)
3
+ *
4
+ * Usage:
5
+ * wayai create-credential --name "openai-key" --type "Bearer Token"
6
+ * wayai create-credential --name "my-api" --type "Basic Auth" --org <uuid>
7
+ * echo "$SECRET" | wayai create-credential --name "openai-key" --type "Bearer Token" --stdin
8
+ */
9
+ import * as readline from 'node:readline';
10
+ import { requireAuth } from '../lib/auth.js';
11
+ import { ApiClient } from '../lib/api-client.js';
12
+ import { prompt, resolveOrganizationId } from '../lib/utils.js';
13
+ const VALID_AUTH_TYPES = ['API Key', 'Bearer Token', 'Basic Auth'];
14
+ export function parseArgs(args) {
15
+ let name;
16
+ let type;
17
+ let orgId;
18
+ let description;
19
+ let stdin = false;
20
+ for (let i = 0; i < args.length; i++) {
21
+ if (args[i] === '--name' && args[i + 1]) {
22
+ name = args[++i];
23
+ }
24
+ else if (args[i] === '--type' && args[i + 1]) {
25
+ type = args[++i];
26
+ }
27
+ else if (args[i] === '--org' && args[i + 1]) {
28
+ orgId = args[++i];
29
+ }
30
+ else if (args[i] === '--description' && args[i + 1]) {
31
+ description = args[++i];
32
+ }
33
+ else if (args[i] === '--stdin') {
34
+ stdin = true;
35
+ }
36
+ }
37
+ return { name, type, orgId, description, stdin };
38
+ }
39
+ /** Read a line from stdin with masked output (shows * for each character). */
40
+ function promptSecret(question) {
41
+ return new Promise((resolve) => {
42
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
43
+ // Mute output by replacing _writeToOutput
44
+ const originalWrite = rl._writeToOutput;
45
+ let firstWrite = true;
46
+ rl._writeToOutput = function (s) {
47
+ if (firstWrite) {
48
+ // Let the prompt question through
49
+ originalWrite.call(rl, s);
50
+ firstWrite = false;
51
+ }
52
+ else {
53
+ // Replace typed characters with *
54
+ originalWrite.call(rl, '*'.repeat(s.replace(/[\r\n]/g, '').length));
55
+ }
56
+ };
57
+ rl.question(question, (answer) => {
58
+ // Restore and print newline
59
+ rl._writeToOutput = originalWrite;
60
+ process.stdout.write('\n');
61
+ rl.close();
62
+ resolve(answer);
63
+ });
64
+ });
65
+ }
66
+ /** Read all of stdin as a single string (for piped input). */
67
+ function readStdin() {
68
+ return new Promise((resolve, reject) => {
69
+ let data = '';
70
+ process.stdin.setEncoding('utf-8');
71
+ process.stdin.on('data', (chunk) => { data += chunk; });
72
+ process.stdin.on('end', () => resolve(data.trim()));
73
+ process.stdin.on('error', reject);
74
+ });
75
+ }
76
+ export async function createCredentialCommand(args) {
77
+ const parsed = parseArgs(args);
78
+ if (!parsed.name) {
79
+ console.error('Missing required flag: --name <credential-name>');
80
+ console.error('Usage: wayai create-credential --name "openai-key" --type "Bearer Token"');
81
+ process.exit(1);
82
+ }
83
+ if (!parsed.type) {
84
+ console.error('Missing required flag: --type <auth-type>');
85
+ console.error(`Supported types: ${VALID_AUTH_TYPES.join(', ')}`);
86
+ process.exit(1);
87
+ }
88
+ if (!VALID_AUTH_TYPES.includes(parsed.type)) {
89
+ console.error(`Invalid authentication type: "${parsed.type}"`);
90
+ console.error(`Supported types: ${VALID_AUTH_TYPES.join(', ')}`);
91
+ process.exit(1);
92
+ }
93
+ const authType = parsed.type;
94
+ const { config, accessToken } = await requireAuth();
95
+ const client = new ApiClient({ apiUrl: config.api_url, accessToken });
96
+ const { organizationId } = await resolveOrganizationId(client, parsed.orgId);
97
+ // Collect secret(s) based on auth type
98
+ const secrets = {};
99
+ if (parsed.stdin) {
100
+ if (process.stdin.isTTY) {
101
+ console.error('--stdin requires piped input. Example: echo "$SECRET" | wayai create-credential --name "key" --type "Bearer Token" --stdin');
102
+ process.exit(1);
103
+ }
104
+ const input = await readStdin();
105
+ if (!input) {
106
+ console.error('No input received from stdin.');
107
+ process.exit(1);
108
+ }
109
+ switch (authType) {
110
+ case 'Bearer Token':
111
+ secrets.access_token = input;
112
+ break;
113
+ case 'API Key':
114
+ secrets.api_key = input;
115
+ break;
116
+ case 'Basic Auth': {
117
+ const colonIdx = input.indexOf(':');
118
+ if (colonIdx === -1) {
119
+ console.error('Basic Auth stdin format: username:password');
120
+ process.exit(1);
121
+ }
122
+ secrets.username = input.slice(0, colonIdx);
123
+ secrets.password = input.slice(colonIdx + 1);
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ else {
129
+ // Interactive prompt with masked input
130
+ switch (authType) {
131
+ case 'Bearer Token':
132
+ secrets.access_token = await promptSecret('Enter access token: ');
133
+ break;
134
+ case 'API Key':
135
+ secrets.api_key = await promptSecret('Enter API key: ');
136
+ break;
137
+ case 'Basic Auth':
138
+ secrets.username = await prompt('Enter username: ');
139
+ secrets.password = await promptSecret('Enter password: ');
140
+ break;
141
+ }
142
+ // Validate secrets are not empty
143
+ for (const [key, value] of Object.entries(secrets)) {
144
+ if (!value) {
145
+ console.error(`${key} cannot be empty.`);
146
+ process.exit(1);
147
+ }
148
+ }
149
+ }
150
+ console.log(`Creating credential "${parsed.name}" (${authType})...`);
151
+ const result = await client.createOrgCredential({
152
+ organization_id: organizationId,
153
+ credential_display_name: parsed.name,
154
+ authentication_type: authType,
155
+ ...(parsed.description && { credential_description: parsed.description }),
156
+ ...secrets,
157
+ });
158
+ console.log(`\nCredential created: ${result.data.credential_display_name}`);
159
+ console.log(` ID: ${result.data.organization_credential_id}`);
160
+ console.log(` Type: ${result.data.authentication_type}`);
161
+ }
162
+ //# sourceMappingURL=create-credential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-credential.js","sourceRoot":"","sources":["../../src/commands/create-credential.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * wayai create-project — create a new project in an organization
3
+ *
4
+ * Usage:
5
+ * wayai create-project --name "My Project"
6
+ * wayai create-project --name "My Project" --org <uuid>
7
+ */
8
+ interface ParsedArgs {
9
+ name: string | undefined;
10
+ orgId: string | undefined;
11
+ }
12
+ export declare function parseArgs(args: string[]): ParsedArgs;
13
+ export declare function createProjectCommand(args: string[]): Promise<void>;
14
+ export {};
@@ -0,0 +1,50 @@
1
+ /**
2
+ * wayai create-project — create a new project in an organization
3
+ *
4
+ * Usage:
5
+ * wayai create-project --name "My Project"
6
+ * wayai create-project --name "My Project" --org <uuid>
7
+ */
8
+ import { requireAuth } from '../lib/auth.js';
9
+ import { ApiClient } from '../lib/api-client.js';
10
+ import { writePartialRepoConfig } from '../lib/repo-config.js';
11
+ import { resolveOrganizationId } from '../lib/utils.js';
12
+ export function parseArgs(args) {
13
+ let name;
14
+ let orgId;
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === '--name' && args[i + 1]) {
17
+ name = args[++i];
18
+ }
19
+ else if (args[i] === '--org' && args[i + 1]) {
20
+ orgId = args[++i];
21
+ }
22
+ }
23
+ return { name, orgId };
24
+ }
25
+ export async function createProjectCommand(args) {
26
+ const parsed = parseArgs(args);
27
+ if (!parsed.name) {
28
+ console.error('Missing required flag: --name <project-name>');
29
+ console.error('Usage: wayai create-project --name "My Project" [--org <uuid>]');
30
+ process.exit(1);
31
+ }
32
+ const { config, accessToken } = await requireAuth();
33
+ const client = new ApiClient({ apiUrl: config.api_url, accessToken });
34
+ const { organizationId, organizationName } = await resolveOrganizationId(client, parsed.orgId);
35
+ console.log(`Creating project "${parsed.name}"...`);
36
+ const result = await client.createProject(organizationId, parsed.name);
37
+ const project = result.data[0];
38
+ // Update .wayai.yaml with the new project (preserve existing org info, clear hub)
39
+ const configPath = writePartialRepoConfig({
40
+ organization_id: organizationId,
41
+ organization_name: organizationName,
42
+ project_id: project.project_id,
43
+ project_name: project.project_name,
44
+ });
45
+ console.log(`\nProject created: ${project.project_name}`);
46
+ console.log(` ID: ${project.project_id}`);
47
+ console.log(`\nWrote ${configPath}`);
48
+ console.log('Create hub files in workspace/ and run `wayai push` to create a hub.');
49
+ }
50
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/commands/create-project.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,IAAwB,CAAC;IAC7B,IAAI,KAAyB,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAc;IACvD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,kFAAkF;IAClF,MAAM,UAAU,GAAG,sBAAsB,CAAC;QACxC,eAAe,EAAE,cAAc;QAC/B,iBAAiB,EAAE,gBAAgB;QACnC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;AACtF,CAAC"}
@@ -4,22 +4,12 @@
4
4
  * Interactive mode: prompts user to pick org → project → hub
5
5
  * Direct mode: --hub <uuid> resolves org/project info from the API
6
6
  */
7
- import * as readline from 'node:readline';
8
7
  import { requireAuth } from '../lib/auth.js';
9
8
  import { ApiClient } from '../lib/api-client.js';
10
- import { readRepoConfig, writeRepoConfig } from '../lib/repo-config.js';
9
+ import { readRepoConfig, readPartialRepoConfig, writeRepoConfig, writePartialRepoConfig } from '../lib/repo-config.js';
11
10
  import { refreshScaffold } from '../lib/scaffold.js';
12
11
  import { findGitRoot } from '../lib/workspace.js';
13
- const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
14
- function prompt(question) {
15
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
16
- return new Promise((resolve) => {
17
- rl.question(question, (answer) => {
18
- rl.close();
19
- resolve(answer.trim());
20
- });
21
- });
22
- }
12
+ import { UUID_RE, prompt } from '../lib/utils.js';
23
13
  export function parseArgs(args) {
24
14
  let hubId;
25
15
  let autoConfirm = false;
@@ -37,9 +27,12 @@ export function parseArgs(args) {
37
27
  export async function initCommand(args) {
38
28
  const { hubId: directHubId, autoConfirm } = parseArgs(args);
39
29
  // Warn if .wayai.yaml already exists
40
- const existing = readRepoConfig();
30
+ const existing = readRepoConfig() ?? readPartialRepoConfig();
41
31
  if (existing) {
42
- console.log(`Current scope: ${existing.hub_name || existing.hub_id} in ${existing.organization_name || existing.organization_id}`);
32
+ const scopeLabel = existing.hub_id
33
+ ? `${existing.hub_name || existing.hub_id} in ${existing.organization_name || existing.organization_id}`
34
+ : `${existing.project_name || existing.project_id} in ${existing.organization_name || existing.organization_id} (no hub)`;
35
+ console.log(`Current scope: ${scopeLabel}`);
43
36
  if (!autoConfirm) {
44
37
  const answer = await prompt('Overwrite? [y/N]: ');
45
38
  if (answer.toLowerCase() !== 'y') {
@@ -74,7 +67,11 @@ export async function initCommand(args) {
74
67
  console.warn(`Warning: failed to download scaffold files: ${err instanceof Error ? err.message : String(err)}`);
75
68
  }
76
69
  }
77
- console.log('Run `wayai pull` to fetch hub configuration.');
70
+ // Check if a hub was selected (full config) or just org+project (partial config)
71
+ const finalConfig = readRepoConfig();
72
+ if (finalConfig) {
73
+ console.log('Run `wayai pull` to fetch hub configuration.');
74
+ }
78
75
  }
79
76
  async function initDirect(client, hubId) {
80
77
  if (!UUID_RE.test(hubId)) {
@@ -137,68 +134,84 @@ async function initInteractive(client) {
137
134
  }
138
135
  selectedOrg = organizations[orgIdx];
139
136
  }
140
- // Step 2: Fetch all hubs and group by project
141
- console.log('Fetching hubs...');
142
- const { hubs } = await client.listHubs(selectedOrg.id);
143
- // Filter to preview hubs only (production hubs aren't tracked in repos)
144
- const previewHubs = hubs.filter((h) => h.hub_environment === 'preview');
145
- if (previewHubs.length === 0) {
146
- console.error('No preview hubs found. Create one in the WayAI platform first.');
137
+ // Step 2: Fetch projects directly (not derived from hubs supports empty projects)
138
+ console.log('Fetching projects...');
139
+ const { data: projectList } = await client.listProjects(selectedOrg.id);
140
+ if (projectList.length === 0) {
141
+ console.error('No projects found. Create one with `wayai create-project --name "..."` first.');
147
142
  process.exit(1);
148
143
  }
149
- // Group by project
150
- const projectMap = new Map();
151
- for (const hub of previewHubs) {
152
- let project = projectMap.get(hub.project_id);
153
- if (!project) {
154
- project = { id: hub.project_id, name: hub.project_name, hubs: [] };
155
- projectMap.set(hub.project_id, project);
156
- }
157
- project.hubs.push(hub);
158
- }
159
- const projects = Array.from(projectMap.values());
160
- // Step 3: Pick project (skip if only one)
161
144
  let selectedProject;
162
- if (projects.length === 1) {
163
- selectedProject = projects[0];
145
+ if (projectList.length === 1) {
146
+ selectedProject = { id: projectList[0].project_id, name: projectList[0].project_name };
164
147
  console.log(`Project: ${selectedProject.name}`);
165
148
  }
166
149
  else {
167
150
  console.log('\nProjects:');
168
- for (let i = 0; i < projects.length; i++) {
169
- console.log(` ${i + 1}. ${projects[i].name} (${projects[i].hubs.length} hub${projects[i].hubs.length !== 1 ? 's' : ''})`);
151
+ for (let i = 0; i < projectList.length; i++) {
152
+ console.log(` ${i + 1}. ${projectList[i].project_name}`);
170
153
  }
171
- const projAnswer = await prompt(`\nSelect project [1-${projects.length}]: `);
154
+ const projAnswer = await prompt(`\nSelect project [1-${projectList.length}]: `);
172
155
  const projIdx = parseInt(projAnswer, 10) - 1;
173
- if (isNaN(projIdx) || projIdx < 0 || projIdx >= projects.length) {
156
+ if (isNaN(projIdx) || projIdx < 0 || projIdx >= projectList.length) {
174
157
  console.error('Invalid selection.');
175
158
  process.exit(1);
176
159
  }
177
- selectedProject = projects[projIdx];
160
+ selectedProject = { id: projectList[projIdx].project_id, name: projectList[projIdx].project_name };
161
+ }
162
+ // Step 3: Fetch hubs for the selected project
163
+ console.log('Fetching hubs...');
164
+ const { hubs } = await client.listHubs(selectedOrg.id, selectedProject.id);
165
+ const previewHubs = hubs.filter((h) => h.hub_environment === 'preview');
166
+ // Step 4: Pick hub (or skip to create later via push)
167
+ if (previewHubs.length === 0) {
168
+ // No hubs — write partial config (org + project only)
169
+ const configPath = writePartialRepoConfig({
170
+ organization_id: selectedOrg.id,
171
+ organization_name: selectedOrg.name,
172
+ project_id: selectedProject.id,
173
+ project_name: selectedProject.name,
174
+ });
175
+ console.log(`\nWrote ${configPath} (no hub selected)`);
176
+ console.log('Create hub files in workspace/<project>/<hub>/hub.yaml and run `wayai push` to create the hub.');
177
+ return;
178
178
  }
179
- // Step 4: Pick hub
180
- const hubList = selectedProject.hubs;
181
179
  let selectedHub;
182
- if (hubList.length === 1) {
183
- selectedHub = hubList[0];
180
+ if (previewHubs.length === 1) {
181
+ // Auto-select single hub
182
+ selectedHub = previewHubs[0];
184
183
  console.log(`Hub: ${selectedHub.hub_name}`);
185
184
  }
186
185
  else {
186
+ // Show hubs with option 0 to skip
187
187
  console.log('\nHubs:');
188
- for (let i = 0; i < hubList.length; i++) {
189
- const h = hubList[i];
188
+ console.log(' 0. (new hub create via push later)');
189
+ for (let i = 0; i < previewHubs.length; i++) {
190
+ const h = previewHubs[i];
190
191
  const label = h.preview_label ? ` (${h.preview_label})` : h.branch_name ? ` [${h.branch_name}]` : '';
191
192
  console.log(` ${i + 1}. ${h.hub_name}${label}`);
192
193
  }
193
- const hubAnswer = await prompt(`\nSelect hub [1-${hubList.length}]: `);
194
- const hubIdx = parseInt(hubAnswer, 10) - 1;
195
- if (isNaN(hubIdx) || hubIdx < 0 || hubIdx >= hubList.length) {
194
+ const hubAnswer = await prompt(`\nSelect hub [0-${previewHubs.length}]: `);
195
+ const hubIdx = parseInt(hubAnswer, 10);
196
+ if (isNaN(hubIdx) || hubIdx < 0 || hubIdx > previewHubs.length) {
196
197
  console.error('Invalid selection.');
197
198
  process.exit(1);
198
199
  }
199
- selectedHub = hubList[hubIdx];
200
+ if (hubIdx === 0) {
201
+ // Skip hub — write partial config
202
+ const configPath = writePartialRepoConfig({
203
+ organization_id: selectedOrg.id,
204
+ organization_name: selectedOrg.name,
205
+ project_id: selectedProject.id,
206
+ project_name: selectedProject.name,
207
+ });
208
+ console.log(`\nWrote ${configPath} (no hub selected)`);
209
+ console.log('Create hub files in workspace/<project>/<hub>/hub.yaml and run `wayai push` to create the hub.');
210
+ return;
211
+ }
212
+ selectedHub = previewHubs[hubIdx - 1];
200
213
  }
201
- // Step 5: Write .wayai.yaml
214
+ // Step 5: Write .wayai.yaml with full config
202
215
  const configPath = writeRepoConfig({
203
216
  organization_id: selectedOrg.id,
204
217
  organization_name: selectedOrg.name,
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * wayai login — OAuth browser flow (default) or --token fallback
2
+ * wayai login — WorkOS browser flow (default) or --token fallback
3
3
  */
4
4
  export declare function parseApiUrl(args: string[]): string;
5
5
  export declare function loginCommand(args: string[]): Promise<void>;
@@ -1,9 +1,9 @@
1
1
  /**
2
- * wayai login — OAuth browser flow (default) or --token fallback
2
+ * wayai login — WorkOS browser flow (default) or --token fallback
3
3
  */
4
4
  import * as readline from 'node:readline';
5
- import { generatePKCE, findAvailablePort, isPortAvailable, startCallbackServer, registerOAuthClient, exchangeCodeForTokens, exchangeMcpToken, fetchAuthConfig, } from '../lib/auth.js';
6
- import { readConfig, writeConfig } from '../lib/config.js';
5
+ import { generateState, findAvailablePort, startCallbackServer, fetchLoginUrl, exchangeCodeForToken, validateToken, } from '../lib/auth.js';
6
+ import { writeConfig } from '../lib/config.js';
7
7
  function prompt(question, defaultValue) {
8
8
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
9
9
  const display = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;
@@ -29,100 +29,63 @@ export async function loginCommand(args) {
29
29
  await loginWithToken(apiUrl);
30
30
  }
31
31
  else {
32
- await loginWithOAuth(apiUrl);
32
+ await loginWithBrowser(apiUrl);
33
33
  }
34
34
  }
35
- async function loginWithOAuth(apiUrl) {
35
+ async function loginWithBrowser(apiUrl) {
36
36
  console.log('\nConnecting to WayAI...');
37
- let supabaseUrl;
37
+ // Find an available port for the callback server
38
+ const port = await findAvailablePort();
39
+ const redirectUri = `http://127.0.0.1:${port}/callback`;
40
+ const state = generateState();
41
+ // Get the WorkOS login URL from the backend
42
+ let loginUrl;
38
43
  try {
39
- const authConfig = await fetchAuthConfig(apiUrl);
40
- supabaseUrl = authConfig.supabase_url;
44
+ loginUrl = await fetchLoginUrl(apiUrl, redirectUri, state);
41
45
  }
42
46
  catch (err) {
43
47
  console.error(`Failed to connect to ${apiUrl}: ${err instanceof Error ? err.message : String(err)}`);
44
48
  process.exit(1);
45
49
  }
46
- console.log('Starting OAuth login...');
47
- const { codeVerifier, codeChallenge } = generatePKCE();
48
- // Try to reuse the stored DCR client (same port → same redirect_uri → same client_id)
49
- const { clientId, redirectUri } = await resolveOAuthClient(supabaseUrl);
50
- // Build OAuth 2.1 authorize URL (Supabase as authorization server)
51
- const authParams = new URLSearchParams({
52
- client_id: clientId,
53
- response_type: 'code',
54
- redirect_uri: redirectUri,
55
- code_challenge: codeChallenge,
56
- code_challenge_method: 'S256',
57
- scope: 'openid email profile',
58
- });
59
- const authUrl = `${supabaseUrl}/auth/v1/oauth/authorize?${authParams.toString()}`;
50
+ // Start callback server before opening browser
51
+ const callbackPromise = startCallbackServer(port, state);
60
52
  // Try to open browser
61
- const openBrowser = await tryOpenBrowser(authUrl);
62
- if (!openBrowser) {
63
- console.log(`\nOpen this URL in your browser to log in:\n\n ${authUrl}\n`);
53
+ const openedBrowser = await tryOpenBrowser(loginUrl);
54
+ if (!openedBrowser) {
55
+ console.log(`\nOpen this URL in your browser to log in:\n\n ${loginUrl}\n`);
64
56
  }
65
57
  else {
66
58
  console.log('Opening browser for login...');
67
59
  }
68
60
  try {
69
- const callbackPort = parseInt(new URL(redirectUri).port, 10);
70
- const callbackPromise = startCallbackServer(callbackPort);
71
61
  const { code } = await callbackPromise;
72
- console.log('Exchanging authorization code for tokens...');
73
- const { accessToken, refreshToken } = await exchangeCodeForTokens(supabaseUrl, code, codeVerifier, clientId, redirectUri);
62
+ console.log('Exchanging authorization code...');
63
+ const result = await exchangeCodeForToken(apiUrl, code, redirectUri);
74
64
  writeConfig({
75
65
  api_url: apiUrl,
76
- supabase_url: supabaseUrl,
77
- client_id: clientId,
78
- redirect_uri: redirectUri,
79
- refresh_token: refreshToken,
80
- auth_method: 'oauth',
66
+ token: result.token,
81
67
  });
82
- // Suppress unused variable token is validated by exchange
83
- void accessToken;
84
- console.log('\nLogin successful! Configuration saved to ~/.wayai/config.json');
68
+ console.log(`\nLogin successful! Logged in as ${result.email}`);
69
+ console.log('Configuration saved to ~/.wayai/config.json');
85
70
  }
86
71
  catch (err) {
87
72
  console.error(`\nLogin failed: ${err instanceof Error ? err.message : String(err)}`);
88
73
  process.exit(1);
89
74
  }
90
75
  }
91
- async function resolveOAuthClient(supabaseUrl) {
92
- const existingConfig = readConfig();
93
- if (existingConfig?.client_id &&
94
- existingConfig?.redirect_uri &&
95
- existingConfig?.supabase_url === supabaseUrl) {
96
- const storedUrl = new URL(existingConfig.redirect_uri);
97
- const storedPort = parseInt(storedUrl.port, 10);
98
- if (storedPort && await isPortAvailable(storedPort)) {
99
- return { clientId: existingConfig.client_id, redirectUri: existingConfig.redirect_uri };
100
- }
101
- }
102
- const port = await findAvailablePort();
103
- const redirectUri = `http://127.0.0.1:${port}/callback`;
104
- try {
105
- const clientId = await registerOAuthClient(supabaseUrl, redirectUri);
106
- return { clientId, redirectUri };
107
- }
108
- catch (err) {
109
- console.error(`Failed to register OAuth client: ${err instanceof Error ? err.message : String(err)}`);
110
- process.exit(1);
111
- }
112
- }
113
76
  async function loginWithToken(apiUrl) {
114
- const mcpToken = await prompt('MCP Token (way_...)');
115
- if (!mcpToken) {
116
- console.error('MCP token is required.');
77
+ const token = await prompt('MCP Token (way_...)');
78
+ if (!token) {
79
+ console.error('Token is required.');
117
80
  process.exit(1);
118
81
  }
119
- if (!mcpToken.startsWith('way_')) {
120
- console.error('Invalid token format. MCP tokens start with "way_".');
82
+ if (!token.startsWith('way_')) {
83
+ console.error('Invalid token format. Tokens start with "way_".');
121
84
  process.exit(1);
122
85
  }
123
86
  console.log('\nValidating token...');
124
87
  try {
125
- await exchangeMcpToken(apiUrl, mcpToken);
88
+ await validateToken(apiUrl, token);
126
89
  }
127
90
  catch (err) {
128
91
  console.error(`Token validation failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -130,8 +93,7 @@ async function loginWithToken(apiUrl) {
130
93
  }
131
94
  writeConfig({
132
95
  api_url: apiUrl,
133
- mcp_token: mcpToken,
134
- auth_method: 'token',
96
+ token,
135
97
  });
136
98
  console.log('\nLogin successful! Configuration saved to ~/.wayai/config.json');
137
99
  }