@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/lib/token-store.js
DELETED
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import * as os from 'node:os';
|
|
4
|
-
export function identifyTokenType(token) {
|
|
5
|
-
if (token.startsWith('way_'))
|
|
6
|
-
return 'way_token';
|
|
7
|
-
if (token.startsWith('eyJ'))
|
|
8
|
-
return 'jwt';
|
|
9
|
-
return 'unknown';
|
|
10
|
-
}
|
|
11
|
-
const KEYRING_SERVICE = 'wayai';
|
|
12
|
-
const KEY_WAY_TOKEN = 'way_token';
|
|
13
|
-
const KEY_OAUTH_ACCESS = 'oauth_access_token';
|
|
14
|
-
const KEY_OAUTH_REFRESH = 'oauth_refresh_token';
|
|
15
|
-
// Resolved per-call (not at module load) so tests can redirect via $HOME and
|
|
16
|
-
// production code picks up any runtime HOME changes (e.g., su -).
|
|
17
|
-
function configDir() { return path.join(os.homedir(), '.wayai'); }
|
|
18
|
-
function configPath() { return path.join(configDir(), 'config.json'); }
|
|
19
|
-
let keyringCache;
|
|
20
|
-
// Cross-platform manual cleanup hint. @napi-rs/keyring targets macOS Keychain,
|
|
21
|
-
// libsecret on Linux, and Windows Credential Manager — the shell command to
|
|
22
|
-
// evict a stuck entry differs per OS, so we tailor the message rather than
|
|
23
|
-
// printing a macOS-only `security` invocation to Linux/Windows users.
|
|
24
|
-
function manualCleanupCommand(account) {
|
|
25
|
-
if (process.platform === 'darwin') {
|
|
26
|
-
return `security delete-generic-password -s ${KEYRING_SERVICE} -a ${account}`;
|
|
27
|
-
}
|
|
28
|
-
if (process.platform === 'win32') {
|
|
29
|
-
return `cmdkey /delete:${KEYRING_SERVICE}/${account}`;
|
|
30
|
-
}
|
|
31
|
-
if (process.platform === 'linux') {
|
|
32
|
-
return `secret-tool clear service ${KEYRING_SERVICE} account ${account}`;
|
|
33
|
-
}
|
|
34
|
-
return `(remove the entry with service="${KEYRING_SERVICE}" account="${account}" from your OS credential store)`;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* A keyring slot was deleted but a subsequent getPassword still returned a
|
|
38
|
-
* value — the underlying secret store accepted the delete call without
|
|
39
|
-
* actually removing the entry. Typically a macOS Keychain ACL surviving
|
|
40
|
-
* from a prior login. Until the slot is cleared, writes to other slots
|
|
41
|
-
* cannot reliably override what reads pick up first.
|
|
42
|
-
*/
|
|
43
|
-
export class StaleKeyringSlotError extends Error {
|
|
44
|
-
account;
|
|
45
|
-
constructor(account) {
|
|
46
|
-
super(`Stale credential remains in OS keyring slot "${account}" after delete. ` +
|
|
47
|
-
`This usually means a prior login left an ACL the current process can't override. ` +
|
|
48
|
-
`Clean it up manually and retry:\n` +
|
|
49
|
-
` ${manualCleanupCommand(account)}`);
|
|
50
|
-
this.account = account;
|
|
51
|
-
this.name = 'StaleKeyringSlotError';
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async function clearSlot(keyring, account) {
|
|
55
|
-
await keyring.deletePassword(KEYRING_SERVICE, account);
|
|
56
|
-
// A throw from getPassword (locked keychain, libsecret hiccup) means we
|
|
57
|
-
// cannot confirm the slot is empty — treat the same as "stale entry
|
|
58
|
-
// survived" so callers throw StaleKeyringSlotError rather than degrading
|
|
59
|
-
// to file fallback (which would write OAuth alongside a possibly-stuck
|
|
60
|
-
// way_, reproducing the masked-credential bug this helper exists to stop).
|
|
61
|
-
try {
|
|
62
|
-
return (await keyring.getPassword(KEYRING_SERVICE, account)) === null;
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
async function getKeyring() {
|
|
69
|
-
if (keyringCache !== undefined)
|
|
70
|
-
return keyringCache;
|
|
71
|
-
try {
|
|
72
|
-
const mod = await import('@napi-rs/keyring');
|
|
73
|
-
const Entry = mod.Entry;
|
|
74
|
-
keyringCache = {
|
|
75
|
-
async getPassword(service, account) {
|
|
76
|
-
try {
|
|
77
|
-
return new Entry(service, account).getPassword();
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
async setPassword(service, account, password) {
|
|
84
|
-
new Entry(service, account).setPassword(password);
|
|
85
|
-
},
|
|
86
|
-
async deletePassword(service, account) {
|
|
87
|
-
try {
|
|
88
|
-
return new Entry(service, account).deletePassword();
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
keyringCache = null;
|
|
98
|
-
}
|
|
99
|
-
return keyringCache;
|
|
100
|
-
}
|
|
101
|
-
function readLegacyConfigFile() {
|
|
102
|
-
if (!fs.existsSync(configPath()))
|
|
103
|
-
return null;
|
|
104
|
-
try {
|
|
105
|
-
return JSON.parse(fs.readFileSync(configPath(), 'utf-8'));
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function stripTokensFromFile() {
|
|
112
|
-
const legacy = readLegacyConfigFile();
|
|
113
|
-
if (!legacy)
|
|
114
|
-
return;
|
|
115
|
-
// token_expires_at is a timestamp, not a secret — keep it as metadata so the
|
|
116
|
-
// refresh path can decide when to refresh without reading the keyring.
|
|
117
|
-
const cleaned = {};
|
|
118
|
-
for (const [k, v] of Object.entries(legacy)) {
|
|
119
|
-
if (k === 'token' || k === 'access_token' || k === 'refresh_token')
|
|
120
|
-
continue;
|
|
121
|
-
cleaned[k] = v;
|
|
122
|
-
}
|
|
123
|
-
fs.writeFileSync(configPath(), JSON.stringify(cleaned, null, 2) + '\n', { mode: 0o600 });
|
|
124
|
-
}
|
|
125
|
-
export async function migrateLegacyTokens() {
|
|
126
|
-
const legacy = readLegacyConfigFile();
|
|
127
|
-
if (!legacy)
|
|
128
|
-
return null;
|
|
129
|
-
if (!legacy.token && !legacy.access_token)
|
|
130
|
-
return null;
|
|
131
|
-
const keyring = await getKeyring();
|
|
132
|
-
if (legacy.token) {
|
|
133
|
-
if (keyring) {
|
|
134
|
-
try {
|
|
135
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_WAY_TOKEN, legacy.token);
|
|
136
|
-
// Strip failure leaves plaintext on disk until the next CLI invocation
|
|
137
|
-
// re-attempts — keyring write was successful, so functionally OK.
|
|
138
|
-
try {
|
|
139
|
-
stripTokensFromFile();
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
console.warn(`wayai: failed to strip legacy token from ~/.wayai/config.json (${err.message}); will retry next run.`);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
// Keyring write failed (locked keychain, etc.); leave the legacy file
|
|
147
|
-
// intact so the file-fallback read keeps working and the next CLI run
|
|
148
|
-
// can retry the migration.
|
|
149
|
-
console.warn(`wayai: keyring migration failed (${err.message}); continuing with file-backed token.`);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return { kind: 'way', token: legacy.token };
|
|
153
|
-
}
|
|
154
|
-
if (legacy.access_token) {
|
|
155
|
-
if (keyring) {
|
|
156
|
-
try {
|
|
157
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_OAUTH_ACCESS, legacy.access_token);
|
|
158
|
-
if (legacy.refresh_token) {
|
|
159
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_OAUTH_REFRESH, legacy.refresh_token);
|
|
160
|
-
}
|
|
161
|
-
try {
|
|
162
|
-
stripTokensFromFile();
|
|
163
|
-
}
|
|
164
|
-
catch (err) {
|
|
165
|
-
console.warn(`wayai: failed to strip legacy tokens from ~/.wayai/config.json (${err.message}); will retry next run.`);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch (err) {
|
|
169
|
-
console.warn(`wayai: keyring migration failed (${err.message}); continuing with file-backed tokens.`);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return {
|
|
173
|
-
kind: 'oauth',
|
|
174
|
-
access_token: legacy.access_token,
|
|
175
|
-
refresh_token: legacy.refresh_token,
|
|
176
|
-
expires_at: legacy.token_expires_at,
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
export async function getToken() {
|
|
182
|
-
// Env override has highest precedence — supports CI, container, op-run injection.
|
|
183
|
-
const envToken = process.env.WAYAI_TOKEN;
|
|
184
|
-
if (envToken) {
|
|
185
|
-
if (identifyTokenType(envToken) === 'way_token') {
|
|
186
|
-
return { kind: 'way', token: envToken };
|
|
187
|
-
}
|
|
188
|
-
return { kind: 'oauth', access_token: envToken };
|
|
189
|
-
}
|
|
190
|
-
const keyring = await getKeyring();
|
|
191
|
-
if (keyring) {
|
|
192
|
-
const wayToken = await keyring.getPassword(KEYRING_SERVICE, KEY_WAY_TOKEN);
|
|
193
|
-
if (wayToken)
|
|
194
|
-
return { kind: 'way', token: wayToken };
|
|
195
|
-
const accessToken = await keyring.getPassword(KEYRING_SERVICE, KEY_OAUTH_ACCESS);
|
|
196
|
-
if (accessToken) {
|
|
197
|
-
const refreshToken = await keyring.getPassword(KEYRING_SERVICE, KEY_OAUTH_REFRESH);
|
|
198
|
-
const expiresAt = readMetadataExpiresAt();
|
|
199
|
-
return {
|
|
200
|
-
kind: 'oauth',
|
|
201
|
-
access_token: accessToken,
|
|
202
|
-
refresh_token: refreshToken ?? undefined,
|
|
203
|
-
expires_at: expiresAt ?? undefined,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
const legacy = readLegacyConfigFile();
|
|
208
|
-
if (!legacy)
|
|
209
|
-
return null;
|
|
210
|
-
if (legacy.token)
|
|
211
|
-
return { kind: 'way', token: legacy.token };
|
|
212
|
-
if (legacy.access_token) {
|
|
213
|
-
return {
|
|
214
|
-
kind: 'oauth',
|
|
215
|
-
access_token: legacy.access_token,
|
|
216
|
-
refresh_token: legacy.refresh_token,
|
|
217
|
-
expires_at: legacy.token_expires_at,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
return null;
|
|
221
|
-
}
|
|
222
|
-
export async function setWayToken(token) {
|
|
223
|
-
const keyring = await getKeyring();
|
|
224
|
-
if (keyring) {
|
|
225
|
-
try {
|
|
226
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_WAY_TOKEN, token);
|
|
227
|
-
clearMetadataExpiresAt();
|
|
228
|
-
// Read precedence favors way_ over OAuth, so a leftover OAuth credential
|
|
229
|
-
// won't shadow this token — but `wayai logout` then misses it. Warn so
|
|
230
|
-
// the user can sweep it manually. Slots are independent — parallelize.
|
|
231
|
-
const [accessCleared, refreshCleared] = await Promise.all([
|
|
232
|
-
clearSlot(keyring, KEY_OAUTH_ACCESS),
|
|
233
|
-
clearSlot(keyring, KEY_OAUTH_REFRESH),
|
|
234
|
-
]);
|
|
235
|
-
const stuck = [
|
|
236
|
-
accessCleared ? null : KEY_OAUTH_ACCESS,
|
|
237
|
-
refreshCleared ? null : KEY_OAUTH_REFRESH,
|
|
238
|
-
].filter((a) => a !== null);
|
|
239
|
-
if (stuck.length > 0) {
|
|
240
|
-
console.warn([
|
|
241
|
-
`wayai: stale OAuth credential persists in OS keyring after delete. Commands work, but \`wayai logout\` won't fully clear. Manually:`,
|
|
242
|
-
...stuck.map((a) => ` ${manualCleanupCommand(a)}`),
|
|
243
|
-
].join('\n'));
|
|
244
|
-
}
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
catch (err) {
|
|
248
|
-
// Runtime keyring failure (locked keychain, broken libsecret session, etc.) —
|
|
249
|
-
// degrade to file storage. Visible warning so users notice the downgrade.
|
|
250
|
-
console.warn(`wayai: keyring write failed (${err.message}); falling back to file storage.`);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
writeFileFallback({ token });
|
|
254
|
-
}
|
|
255
|
-
export async function setOAuthTokens(access_token, refresh_token, expires_at) {
|
|
256
|
-
const keyring = await getKeyring();
|
|
257
|
-
if (keyring) {
|
|
258
|
-
try {
|
|
259
|
-
// way_ wins the read race, so a leftover way_ would silently mask the
|
|
260
|
-
// OAuth tokens we're about to write — every subsequent API call would
|
|
261
|
-
// send the dead way_ and the backend would reject it. Verify the slot
|
|
262
|
-
// is actually empty after deletePassword and fail loudly otherwise.
|
|
263
|
-
if (!(await clearSlot(keyring, KEY_WAY_TOKEN))) {
|
|
264
|
-
throw new StaleKeyringSlotError(KEY_WAY_TOKEN);
|
|
265
|
-
}
|
|
266
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_OAUTH_ACCESS, access_token);
|
|
267
|
-
if (refresh_token) {
|
|
268
|
-
await keyring.setPassword(KEYRING_SERVICE, KEY_OAUTH_REFRESH, refresh_token);
|
|
269
|
-
}
|
|
270
|
-
writeMetadataExpiresAt(expires_at);
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
catch (err) {
|
|
274
|
-
// StaleKeyringSlotError propagates — file fallback can't help because
|
|
275
|
-
// the next read still hits the stuck keyring slot first.
|
|
276
|
-
if (err instanceof StaleKeyringSlotError)
|
|
277
|
-
throw err;
|
|
278
|
-
console.warn(`wayai: keyring write failed (${err.message}); falling back to file storage.`);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
writeFileFallback({ access_token, refresh_token, token_expires_at: expires_at });
|
|
282
|
-
}
|
|
283
|
-
export async function clearTokens() {
|
|
284
|
-
const keyring = await getKeyring();
|
|
285
|
-
if (keyring) {
|
|
286
|
-
// Slots are independent — run all three in parallel (3 keyring RPCs vs 6).
|
|
287
|
-
const slots = [KEY_WAY_TOKEN, KEY_OAUTH_ACCESS, KEY_OAUTH_REFRESH];
|
|
288
|
-
const cleared = await Promise.all(slots.map((account) => clearSlot(keyring, account)));
|
|
289
|
-
for (const [i, ok] of cleared.entries()) {
|
|
290
|
-
if (!ok) {
|
|
291
|
-
const account = slots[i];
|
|
292
|
-
console.warn(`wayai: could not clear keyring slot "${account}". Subsequent commands may still pick the stale token. Manually:\n` +
|
|
293
|
-
` ${manualCleanupCommand(account)}`);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
if (fs.existsSync(configPath())) {
|
|
298
|
-
fs.unlinkSync(configPath());
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
function readMetadataExpiresAt() {
|
|
302
|
-
const legacy = readLegacyConfigFile();
|
|
303
|
-
return legacy?.token_expires_at ?? null;
|
|
304
|
-
}
|
|
305
|
-
function writeMetadataExpiresAt(expires_at) {
|
|
306
|
-
const existing = readLegacyConfigFile() ?? {};
|
|
307
|
-
delete existing.token;
|
|
308
|
-
delete existing.access_token;
|
|
309
|
-
delete existing.refresh_token;
|
|
310
|
-
existing.token_expires_at = expires_at;
|
|
311
|
-
ensureConfigDir();
|
|
312
|
-
fs.writeFileSync(configPath(), JSON.stringify(existing, null, 2) + '\n', { mode: 0o600 });
|
|
313
|
-
}
|
|
314
|
-
function clearMetadataExpiresAt() {
|
|
315
|
-
const existing = readLegacyConfigFile();
|
|
316
|
-
if (!existing)
|
|
317
|
-
return;
|
|
318
|
-
// Strip any orphan token fields from prior file-fallback sessions while we're
|
|
319
|
-
// here — keeps the metadata file token-free once keyring is in use.
|
|
320
|
-
delete existing.token;
|
|
321
|
-
delete existing.access_token;
|
|
322
|
-
delete existing.refresh_token;
|
|
323
|
-
delete existing.token_expires_at;
|
|
324
|
-
ensureConfigDir();
|
|
325
|
-
fs.writeFileSync(configPath(), JSON.stringify(existing, null, 2) + '\n', { mode: 0o600 });
|
|
326
|
-
}
|
|
327
|
-
function ensureConfigDir() {
|
|
328
|
-
if (!fs.existsSync(configDir())) {
|
|
329
|
-
fs.mkdirSync(configDir(), { recursive: true });
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
function writeFileFallback(tokens) {
|
|
333
|
-
const existing = readLegacyConfigFile() ?? {};
|
|
334
|
-
// Strip ALL token fields before merging — without this, a mode switch in the
|
|
335
|
-
// no-keyring path (way → OAuth or vice versa) would leave the old mode's
|
|
336
|
-
// fields on disk and `getToken` would return the stale value because the
|
|
337
|
-
// file-fallback read checks `token` before `access_token`.
|
|
338
|
-
delete existing.token;
|
|
339
|
-
delete existing.access_token;
|
|
340
|
-
delete existing.refresh_token;
|
|
341
|
-
delete existing.token_expires_at;
|
|
342
|
-
Object.assign(existing, tokens);
|
|
343
|
-
ensureConfigDir();
|
|
344
|
-
fs.writeFileSync(configPath(), JSON.stringify(existing, null, 2) + '\n', { mode: 0o600 });
|
|
345
|
-
}
|
|
346
|
-
/** Test hook — production code must not call this. */
|
|
347
|
-
export function __setKeyringForTesting(binding) {
|
|
348
|
-
keyringCache = binding;
|
|
349
|
-
}
|
|
350
|
-
/** Test hook — production code must not call this. */
|
|
351
|
-
export function __resetKeyringForTesting() {
|
|
352
|
-
keyringCache = undefined;
|
|
353
|
-
}
|
|
354
|
-
//# sourceMappingURL=token-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared types for the CLI — imported from @wayai/shared/contracts
|
|
3
|
-
*/
|
|
4
|
-
export type { HubAsCodeKanbanFollowup, HubAsCodeKanbanStatus, HubAsCodePayload, HubAsCodeAgent, HubAsCodeCustomTool, HubAsCodeState, HubAsCodeTeam, HubAsCodeResource, HubAsCodeResourceFile, HubAsCodeAgentResource, HubAsCodeOutboundContact, HubAsCodeOutboundList, HubAsCodeOutboundSchedule, HubAsCodeEval, CiDiffResponse, CiLookupResponse, CiOrganizationsResponse, CiCreateOrganizationResponse, CiHubListItem, CiHubListResponse, CiSyncResponse, CiSyncMcpResponse, OrgResourcesPayload, OrgAsCodeResource, OrgAsCodeResourceFolder, CiOrgResourcesPushResponse, } from '@wayai/shared/contracts/ci';
|
|
5
|
-
/** Mirrors SyncSkillsResultItem from @wayai/shared/contracts/setup/resources */
|
|
6
|
-
export interface SyncSkillsResultItem {
|
|
7
|
-
connection_id: string;
|
|
8
|
-
connection_name: string;
|
|
9
|
-
uploaded: number;
|
|
10
|
-
failed: number;
|
|
11
|
-
errors: string[];
|
|
12
|
-
}
|
|
13
|
-
/** Mirrors SyncSkillsResponse from @wayai/shared/contracts/setup/resources */
|
|
14
|
-
export interface SyncSkillsResponse {
|
|
15
|
-
success: true;
|
|
16
|
-
message: string;
|
|
17
|
-
results: SyncSkillsResultItem[];
|
|
18
|
-
}
|
package/dist/lib/types.js
DELETED
package/dist/lib/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/lib/utils.d.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared utility functions
|
|
3
|
-
*/
|
|
4
|
-
export declare const UUID_RE: RegExp;
|
|
5
|
-
/**
|
|
6
|
-
* Prompt the user for free-text input.
|
|
7
|
-
*/
|
|
8
|
-
export declare function prompt(question: string): Promise<string>;
|
|
9
|
-
/**
|
|
10
|
-
* Prompt the user for yes/no confirmation. Returns true if they answer 'y'.
|
|
11
|
-
*/
|
|
12
|
-
export declare function confirm(question: string): Promise<boolean>;
|
|
13
|
-
/** Prompt for a secret, masking typed characters with `*`. */
|
|
14
|
-
export declare function promptSecret(question: string): Promise<string>;
|
|
15
|
-
/** Read all of stdin as a single trimmed string (for piped input). */
|
|
16
|
-
export declare function readStdin(): Promise<string>;
|
|
17
|
-
/**
|
|
18
|
-
* Kebab-case slug for hub folders and skill names.
|
|
19
|
-
*
|
|
20
|
-
* MIRROR of the canonical `@wayai/shared` `slugifyKebab(input, 64)`. The CLI
|
|
21
|
-
* can't import the shared runtime (it's never published — see the drift-guard
|
|
22
|
-
* test no-shared-runtime-import.test.ts), so this is duplicated and pinned by
|
|
23
|
-
* that test against `slugifySkillName`. Uses NFKD (not NFD) so ligatures and
|
|
24
|
-
* full-width chars fold toward ASCII identically to the platform — keep these
|
|
25
|
-
* exact steps in lockstep with slugifyKebab or pushed slugs diverge from the UI.
|
|
26
|
-
*/
|
|
27
|
-
export declare function slugify(input: string): string;
|
|
28
|
-
/**
|
|
29
|
-
* Resolve the hub YAML path in a folder: tries hub.yaml first, falls back to wayai.yaml.
|
|
30
|
-
* Returns the full path if found, null otherwise.
|
|
31
|
-
*/
|
|
32
|
-
export declare function resolveHubYamlPath(hubFolder: string): string | null;
|
|
33
|
-
/**
|
|
34
|
-
* Try to detect hub_id from hub.yaml (or wayai.yaml) in the current working directory.
|
|
35
|
-
* Returns null if no config file exists or it lacks hub_id.
|
|
36
|
-
*/
|
|
37
|
-
export declare function detectHubFromCwd(): Promise<{
|
|
38
|
-
hubId: string;
|
|
39
|
-
hubFolder: string;
|
|
40
|
-
} | null>;
|
|
41
|
-
/**
|
|
42
|
-
* Parse a shorthand period string (e.g. "7d", "4w", "3m", "1y") into
|
|
43
|
-
* { start, end, periodicity } for analytics queries.
|
|
44
|
-
*/
|
|
45
|
-
export declare function parsePeriod(period: string): {
|
|
46
|
-
start: string;
|
|
47
|
-
end: string;
|
|
48
|
-
periodicity: string;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Parse --from/--to date strings into ISO format.
|
|
52
|
-
* Accepts YYYY-MM-DD or full ISO datetime. Appends time suffix if needed.
|
|
53
|
-
*/
|
|
54
|
-
export declare function parseDateArg(date: string, position: 'from' | 'to'): string;
|
|
55
|
-
/**
|
|
56
|
-
* Resolve organization_id from: --org flag → .wayai.yaml → single-org auto-select.
|
|
57
|
-
* Returns { organizationId, organizationName } or exits with an error.
|
|
58
|
-
*/
|
|
59
|
-
export declare function resolveOrganizationId(client: {
|
|
60
|
-
organizations(): Promise<{
|
|
61
|
-
organizations: Array<{
|
|
62
|
-
id: string;
|
|
63
|
-
name: string;
|
|
64
|
-
}>;
|
|
65
|
-
}>;
|
|
66
|
-
}, orgIdFlag?: string): Promise<{
|
|
67
|
-
organizationId: string;
|
|
68
|
-
organizationName?: string;
|
|
69
|
-
}>;
|
|
70
|
-
export declare function parsePositiveIntFlag(name: string, raw: string | undefined): number;
|
|
71
|
-
/**
|
|
72
|
-
* Low-level predicate: true when `--help`/`-h` appears anywhere in args.
|
|
73
|
-
*
|
|
74
|
-
* The match is deliberately broad (and so fail-safe — printing help is
|
|
75
|
-
* non-destructive). The one realistic command that takes a free-text value that
|
|
76
|
-
* could *equal* `--help` is `report` (`report create --description "--help"`),
|
|
77
|
-
* and that command owns its help handling so it's excluded from interception by
|
|
78
|
-
* `shouldInterceptHelp` — its own parser sees the value verbatim. Used both to
|
|
79
|
-
* gate that interception and to skip the update check on any help invocation.
|
|
80
|
-
*/
|
|
81
|
-
export declare function wantsHelp(args: string[]): boolean;
|
|
82
|
-
/**
|
|
83
|
-
* Whether the top-level entry should short-circuit to the GLOBAL help BEFORE
|
|
84
|
-
* dispatching `command`. This stops side-effecting subcommands (e.g.
|
|
85
|
-
* `run-eval`, which would otherwise create + run a billable eval session) from
|
|
86
|
-
* executing on a `--help`/`-h` request.
|
|
87
|
-
*
|
|
88
|
-
* Returns false — i.e. falls through to the command's own handler — for:
|
|
89
|
-
* - the top-level `help` slot (handled by the dispatch switch itself),
|
|
90
|
-
* - an absent command, and
|
|
91
|
-
* - commands in `ownHelpCommands` (e.g. `eval`, `admin`, `report`), which
|
|
92
|
-
* render their own richer command-specific help; intercepting them here would
|
|
93
|
-
* downgrade that to the global help.
|
|
94
|
-
*/
|
|
95
|
-
export declare function shouldInterceptHelp(command: string | undefined, args: string[], ownHelpCommands: ReadonlySet<string>): boolean;
|
|
96
|
-
/** Returns true if `latest` is a newer semver than `current` */
|
|
97
|
-
export declare function isNewerVersion(latest: string, current: string): boolean;
|