@functional-systems/lambdadb-cli 0.1.6 → 0.1.7-dev.24
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/CHANGELOG.md +22 -0
- package/CONTRIBUTING.md +29 -0
- package/DESIGN.md +9 -3
- package/ONBOARDING.md +417 -0
- package/README.md +390 -138
- package/dist/account.d.ts +50 -0
- package/dist/account.js +301 -0
- package/dist/account.js.map +1 -0
- package/dist/agent-config.d.ts +4 -3
- package/dist/agent-config.js +12 -5
- package/dist/agent-config.js.map +1 -1
- package/dist/agents.d.ts +3 -3
- package/dist/agents.js +8 -8
- package/dist/agents.js.map +1 -1
- package/dist/cli.js +44 -6
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -4
- package/dist/config.js +43 -6
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +29 -0
- package/dist/credentials.js +116 -0
- package/dist/credentials.js.map +1 -0
- package/dist/device-auth.d.ts +16 -0
- package/dist/device-auth.js +160 -0
- package/dist/device-auth.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.js +35 -1
- package/dist/errors.js.map +1 -1
- package/dist/init.d.ts +5 -2
- package/dist/init.js +50 -31
- package/dist/init.js.map +1 -1
- package/dist/mcp.js +8 -1
- package/dist/mcp.js.map +1 -1
- package/dist/projects.d.ts +29 -0
- package/dist/projects.js +323 -0
- package/dist/projects.js.map +1 -0
- package/package.json +7 -2
- package/skills/lambdadb/SKILL.md +9 -6
- package/src/account.ts +351 -0
- package/src/agent-config.ts +14 -8
- package/src/agents.ts +8 -8
- package/src/cli.ts +46 -6
- package/src/config.ts +43 -10
- package/src/credentials.ts +138 -0
- package/src/device-auth.ts +200 -0
- package/src/errors.ts +31 -2
- package/src/init.ts +42 -29
- package/src/mcp.ts +7 -1
- package/src/projects.ts +439 -0
package/dist/projects.js
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
3
|
+
import { accountPath, loadAccount, login, management, parseOrganization, readOptional, withManagementLock, writeMetadata, } from './account.js';
|
|
4
|
+
import { configPath, endpoint, fileIdentity, saveSettings } from './config.js';
|
|
5
|
+
import { CredentialVault, credentialReference } from './credentials.js';
|
|
6
|
+
import { openBrowser, projectAuthorization } from './device-auth.js';
|
|
7
|
+
import { InputError, ManagementError } from './errors.js';
|
|
8
|
+
export function uuid(value, label) {
|
|
9
|
+
if (!value || !/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(value))
|
|
10
|
+
throw new InputError(`${label} must be an explicit UUID. Run orgs list or projects list to find it.`);
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
export async function organizations(options, output) {
|
|
14
|
+
const api = await management(options, output), response = await api.request('organizations');
|
|
15
|
+
if (!Array.isArray(response.organizations))
|
|
16
|
+
throw new InputError('Invalid Organization list response.');
|
|
17
|
+
return response.organizations.map((v) => parseOrganization(v, api.account));
|
|
18
|
+
}
|
|
19
|
+
export async function projects(options, org, output) {
|
|
20
|
+
uuid(org, 'Organization');
|
|
21
|
+
return listProjects(await management(options, output), org);
|
|
22
|
+
}
|
|
23
|
+
async function listProjects(api, org) {
|
|
24
|
+
const response = await api.request('projects', 'GET', undefined, org);
|
|
25
|
+
if (!Array.isArray(response.projects))
|
|
26
|
+
throw new InputError('Invalid project list response.');
|
|
27
|
+
return response.projects.map((value) => {
|
|
28
|
+
const p = value;
|
|
29
|
+
uuid(p.id, 'Project');
|
|
30
|
+
if (typeof p.name !== 'string' ||
|
|
31
|
+
!/^[a-zA-Z0-9_-]+$/.test(p.name) ||
|
|
32
|
+
typeof p.status !== 'string' ||
|
|
33
|
+
p.organization_id !== org)
|
|
34
|
+
throw new InputError('Invalid project identity in response.');
|
|
35
|
+
return {
|
|
36
|
+
id: p.id,
|
|
37
|
+
name: p.name,
|
|
38
|
+
status: p.status,
|
|
39
|
+
organization_id: p.organization_id,
|
|
40
|
+
...(typeof p.base_url === 'string' ? { base_url: endpoint(p.base_url) } : {}),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function createProject(options, input, output) {
|
|
45
|
+
if (!!input.org === !!input.defaultOrg)
|
|
46
|
+
throw new InputError('Choose exactly one of --org UUID or --default-org.');
|
|
47
|
+
if (input.org)
|
|
48
|
+
uuid(input.org, 'Organization');
|
|
49
|
+
if (!/^[a-zA-Z0-9_-]{3,45}$/.test(input.name) || !input.region)
|
|
50
|
+
throw new InputError('Project name must contain 3–45 letters, digits, underscores or hyphens; --region is required.');
|
|
51
|
+
const api = await management(options, output);
|
|
52
|
+
const result = await api.request('projects', 'POST', {
|
|
53
|
+
name: input.name,
|
|
54
|
+
cloud_provider: 'aws',
|
|
55
|
+
region: input.region,
|
|
56
|
+
default_organization: !!input.defaultOrg,
|
|
57
|
+
}, input.org);
|
|
58
|
+
try {
|
|
59
|
+
uuid(result.id, 'Created project');
|
|
60
|
+
uuid(result.organization_id, 'Organization');
|
|
61
|
+
if (typeof result.status !== 'string')
|
|
62
|
+
throw new Error();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
throw new ManagementError('write_outcome_unknown', undefined);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
id: result.id,
|
|
69
|
+
organization_id: result.organization_id,
|
|
70
|
+
name: input.name,
|
|
71
|
+
status: result.status,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const connectionsPath = async (options) => `${await fileIdentity(configPath(options))}.connections.json`;
|
|
75
|
+
async function connections(options) {
|
|
76
|
+
const path = await connectionsPath(options), before = await readOptional(path);
|
|
77
|
+
let items = [];
|
|
78
|
+
if (before) {
|
|
79
|
+
try {
|
|
80
|
+
items = JSON.parse(before);
|
|
81
|
+
if (!Array.isArray(items))
|
|
82
|
+
throw new Error();
|
|
83
|
+
for (const item of items) {
|
|
84
|
+
if (Object.keys(item).some((k) => !['account', 'org', 'projectId', 'settings', 'pendingKeyName'].includes(k)) ||
|
|
85
|
+
typeof item.account !== 'string')
|
|
86
|
+
throw new Error();
|
|
87
|
+
uuid(item.org, 'Organization');
|
|
88
|
+
uuid(item.projectId, 'Project');
|
|
89
|
+
if (item.pendingKeyName !== undefined &&
|
|
90
|
+
(typeof item.pendingKeyName !== 'string' ||
|
|
91
|
+
!/^lambdadb-cli-[0-9a-f-]{36}$/.test(item.pendingKeyName)))
|
|
92
|
+
throw new Error();
|
|
93
|
+
if (item.settings) {
|
|
94
|
+
const s = item.settings;
|
|
95
|
+
credentialReference(s.credentialStore, s.credentialId);
|
|
96
|
+
endpoint(s.endpoint);
|
|
97
|
+
if (Object.keys(s).some((k) => ![
|
|
98
|
+
'endpoint',
|
|
99
|
+
'project',
|
|
100
|
+
'apiKeyEnv',
|
|
101
|
+
'credentialStore',
|
|
102
|
+
'credentialId',
|
|
103
|
+
'credentialKeyId',
|
|
104
|
+
'credentialKeyName',
|
|
105
|
+
].includes(k)) ||
|
|
106
|
+
!/^[a-zA-Z0-9_-]+$/.test(s.project))
|
|
107
|
+
throw new Error();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new InputError('Invalid saved project connections. Restore the file; never store keys in metadata.');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return { path, before, items };
|
|
116
|
+
}
|
|
117
|
+
export async function useProject(options, org, projectId, issueKey, output, vault = new CredentialVault(), client) {
|
|
118
|
+
uuid(org, 'Organization');
|
|
119
|
+
uuid(projectId, 'Project');
|
|
120
|
+
return withManagementLock(options, async () => {
|
|
121
|
+
const api = client ?? (await management(options, output));
|
|
122
|
+
const project = (await listProjects(api, org)).find((p) => p.id === projectId);
|
|
123
|
+
const orgResponse = await api.request('organizations');
|
|
124
|
+
const orgs = Array.isArray(orgResponse.organizations)
|
|
125
|
+
? orgResponse.organizations.map((v) => parseOrganization(v, api.account))
|
|
126
|
+
: [];
|
|
127
|
+
const organization = orgs.find((o) => o.id === org);
|
|
128
|
+
if (!organization)
|
|
129
|
+
throw new InputError('The Organization is not available to this account.');
|
|
130
|
+
if (!project)
|
|
131
|
+
throw new InputError('The project is not available in this Organization.');
|
|
132
|
+
if (project.status !== 'ACTIVE')
|
|
133
|
+
throw new InputError(`Project is ${project.status}. Resume with projects use after it is ACTIVE; do not create a replacement.`);
|
|
134
|
+
const cache = await connections(options), account = `${api.account.apiUrl}/${api.account.memberId}`;
|
|
135
|
+
let item = cache.items.find((c) => c.account === account && c.org === org && c.projectId === projectId);
|
|
136
|
+
const original = configPath(options), destination = await fileIdentity(original), before = await readOptional(destination);
|
|
137
|
+
output.diagnostic(`CLI settings: ${destination}; saved project references: ${cache.path}.`);
|
|
138
|
+
if (item?.pendingKeyName)
|
|
139
|
+
output.diagnostic(`Previous delivery was uncertain: inspect/revoke ${item.pendingKeyName} in Console before replacing it.`);
|
|
140
|
+
let selected = item?.settings;
|
|
141
|
+
if (!selected || issueKey) {
|
|
142
|
+
if (organization.role === 'member')
|
|
143
|
+
throw new InputError('Only an Organization owner or admin can issue a project key. Use a saved connection or obtain a key from your admin for environment setup.');
|
|
144
|
+
if (!issueKey)
|
|
145
|
+
throw new InputError(`No reusable connection. ${item?.pendingKeyName ? `Inspect/revoke ${item.pendingKeyName} in Console first. ` : ''}Run projects use --org ${org} --project-id ${projectId} --issue-key to explicitly issue a project key.`);
|
|
146
|
+
const store = await vault.select(options.credentialStore ?? api.account.credentialStore);
|
|
147
|
+
output.diagnostic(`Project credential store: ${store}. The key retains existing API permissions, including writes; MCP write-tool visibility is configured separately.`);
|
|
148
|
+
if (store === 'keyutils')
|
|
149
|
+
output.diagnostic('Kernel credentials can expire or disappear after reboot. Metadata is retained; replacement requires explicit key issuance.');
|
|
150
|
+
const requestId = randomUUID(), keyName = `lambdadb-cli-${requestId}`;
|
|
151
|
+
output.diagnostic(`Issuing ${keyName}. If delivery fails, inspect it in Console; no request will be retried automatically.`);
|
|
152
|
+
if (!item) {
|
|
153
|
+
item = { account, org, projectId };
|
|
154
|
+
cache.items.push(item);
|
|
155
|
+
}
|
|
156
|
+
item.pendingKeyName = keyName;
|
|
157
|
+
await writeMetadata(cache.path, cache.items, cache.before);
|
|
158
|
+
const pending = await readOptional(cache.path);
|
|
159
|
+
const response = await api.request('connect', 'POST', {
|
|
160
|
+
organization_id: org,
|
|
161
|
+
project_id: projectId,
|
|
162
|
+
request_id: requestId,
|
|
163
|
+
});
|
|
164
|
+
let granted;
|
|
165
|
+
try {
|
|
166
|
+
granted = projectAuthorization(response, output, keyName);
|
|
167
|
+
if (granted.project !== project.name)
|
|
168
|
+
throw new Error();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
throw new ManagementError('issuance_unconfirmed', undefined, { pendingKeyName: keyName });
|
|
172
|
+
}
|
|
173
|
+
selected = {
|
|
174
|
+
endpoint: granted.endpoint,
|
|
175
|
+
project: granted.project,
|
|
176
|
+
apiKeyEnv: 'LAMBDADB_API_KEY',
|
|
177
|
+
credentialStore: store,
|
|
178
|
+
credentialId: randomUUID(),
|
|
179
|
+
credentialKeyId: granted.credentialKeyId,
|
|
180
|
+
credentialKeyName: keyName,
|
|
181
|
+
};
|
|
182
|
+
const target = { ...selected, ...credentialReference(selected.credentialStore, selected.credentialId) };
|
|
183
|
+
await vault.save(target, granted.apiKey);
|
|
184
|
+
try {
|
|
185
|
+
item.settings = selected;
|
|
186
|
+
delete item.pendingKeyName;
|
|
187
|
+
await writeMetadata(cache.path, cache.items, pending);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
await vault.remove(target).catch(() => { });
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
if (selected.project !== project.name)
|
|
196
|
+
throw new InputError('Saved project identity changed. Reconnect explicitly.');
|
|
197
|
+
await vault.read({
|
|
198
|
+
...selected,
|
|
199
|
+
...credentialReference(selected.credentialStore, selected.credentialId),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if ((await fileIdentity(original)) !== destination || (await readOptional(destination)) !== before)
|
|
203
|
+
throw new InputError('CLI settings changed. The connection is cached; rerun projects use without --issue-key.');
|
|
204
|
+
await saveSettings({ ...options, ...selected, config: destination });
|
|
205
|
+
output.diagnostic('CLI project selected. Existing agent entries remain pinned; rerun init to update their connection.');
|
|
206
|
+
return selected;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
async function choose(items, label, ask, prompt) {
|
|
210
|
+
if (!items.length)
|
|
211
|
+
throw new InputError('No choices are available.');
|
|
212
|
+
// eslint-disable-next-line no-control-regex -- Keep item names from adding fake choices or terminal escapes.
|
|
213
|
+
const labels = items.map((item, i) => `${i + 1}. ${label(item).replace(/[\x00-\x1f\x7f]/g, ' ')}`);
|
|
214
|
+
const answer = await ask(`${prompt}\n${labels.join('\n')}\nChoose a number`, '1');
|
|
215
|
+
const index = Number(answer) - 1;
|
|
216
|
+
if (!Number.isInteger(index) || index < 0 || index >= items.length)
|
|
217
|
+
throw new InputError('Choose one of the listed numbers.');
|
|
218
|
+
const choice = items[index];
|
|
219
|
+
if (choice === undefined)
|
|
220
|
+
throw new InputError('Choose one of the listed numbers.');
|
|
221
|
+
return choice;
|
|
222
|
+
}
|
|
223
|
+
export async function terminalSetup(options, output, ask) {
|
|
224
|
+
if (!(await readOptional(await accountPath(options))))
|
|
225
|
+
await login(options, output);
|
|
226
|
+
else {
|
|
227
|
+
try {
|
|
228
|
+
await loadAccount(options);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
if ((await ask('Login is unavailable or expired. Authorize login again? Type yes', 'no')) !== 'yes')
|
|
232
|
+
throw new InputError('Run login to renew account access.');
|
|
233
|
+
await login(options, output);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
let orgs = await organizations(options, output);
|
|
237
|
+
let org = orgs.length
|
|
238
|
+
? await choose(orgs, (o) => `${o.name} (${o.role}, ${o.plan}, projects ${o.projects_count}/${o.max_projects})`, ask, 'Organization')
|
|
239
|
+
: undefined;
|
|
240
|
+
let available = org ? await projects(options, org.id, output) : [];
|
|
241
|
+
let project;
|
|
242
|
+
for (;;) {
|
|
243
|
+
const atLimit = org && org.projects_count >= org.max_projects;
|
|
244
|
+
const action = await ask(atLimit && org
|
|
245
|
+
? `Project limit reached (${org.projects_count}/${org.max_projects}). Enter use, billing, or cancel`
|
|
246
|
+
: `Enter use for an existing project${available.length ? '' : ' (none yet)'}, create, or cancel`, available.length ? 'use' : atLimit ? 'billing' : 'create');
|
|
247
|
+
if (action === 'cancel')
|
|
248
|
+
throw new InputError('Setup canceled. Saved login and project connections remain available.');
|
|
249
|
+
if (action === 'billing' && org) {
|
|
250
|
+
output.diagnostic(`${org.can_upgrade ? 'Review your plan or request a limit increase' : 'Ask the Organization owner to activate billing'}: ${org.billing_url}`);
|
|
251
|
+
if (org.can_upgrade && (await ask('Open billing in your browser? Type yes', 'no')) === 'yes')
|
|
252
|
+
openBrowser(org.billing_url, output);
|
|
253
|
+
if ((await ask('After billing is updated, type retry to recheck limits, or cancel', 'cancel')) !== 'retry')
|
|
254
|
+
throw new InputError('Rerun init --connect when ready. No project was created.');
|
|
255
|
+
const id = org.id;
|
|
256
|
+
orgs = await organizations(options, output);
|
|
257
|
+
org = orgs.find((o) => o.id === id);
|
|
258
|
+
if (!org)
|
|
259
|
+
throw new InputError('Organization access changed. Rerun init to select another Organization.');
|
|
260
|
+
available = await projects(options, org.id, output);
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (action === 'use') {
|
|
264
|
+
project = await choose(available, (p) => `${p.name} (${p.status})`, ask, 'Project');
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
if (action !== 'create' || atLimit)
|
|
268
|
+
throw new InputError('Choose one of the displayed actions.');
|
|
269
|
+
if (org?.role === 'member')
|
|
270
|
+
throw new InputError('An owner or admin must connect the new project. Choose an existing saved connection or ask your admin for a project key.');
|
|
271
|
+
const api = await management(options, output), response = await api.request('regions');
|
|
272
|
+
const regions = response.regions;
|
|
273
|
+
if (!Array.isArray(regions))
|
|
274
|
+
throw new InputError('Invalid region list.');
|
|
275
|
+
const region = await choose(regions.filter((r) => r.is_open && r.cloud_provider === 'aws'), (r) => `${r.name} (${r.region})`, ask, 'Region');
|
|
276
|
+
const name = await ask('Project name');
|
|
277
|
+
output.diagnostic(`Create ${name ?? ''} in ${org?.name ?? 'your default Organization'} (${region.region}).`);
|
|
278
|
+
if ((await ask('Create this project? Type yes', 'no')) !== 'yes')
|
|
279
|
+
throw new InputError('No project was requested.');
|
|
280
|
+
const created = await createProject(options, { org: org?.id, defaultOrg: !org, name: name ?? '', region: region.region }, output);
|
|
281
|
+
project = created;
|
|
282
|
+
const deadline = Date.now() + 10 * 60_000;
|
|
283
|
+
while (project.status !== 'ACTIVE' && Date.now() < deadline) {
|
|
284
|
+
output.diagnostic('Project is provisioning. Waiting; interruption is safe. Rerun init to select this project.');
|
|
285
|
+
await delay(5000, undefined, { signal: options.signal });
|
|
286
|
+
const found = (await projects(options, created.organization_id, output)).find((p) => p.id === created.id);
|
|
287
|
+
if (!found)
|
|
288
|
+
throw new InputError('Created project was not listed. Check Console before creating another.');
|
|
289
|
+
project = found;
|
|
290
|
+
}
|
|
291
|
+
if (project.status !== 'ACTIVE')
|
|
292
|
+
throw new InputError('Provisioning is still pending. Rerun init --connect later and select the existing project.');
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
const a = await loadAccount(options), cache = await connections(options);
|
|
296
|
+
const saved = cache.items.find((c) => c.account === `${a.apiUrl}/${a.memberId}` &&
|
|
297
|
+
c.projectId === project.id &&
|
|
298
|
+
c.org === project.organization_id);
|
|
299
|
+
let issue = !saved?.settings;
|
|
300
|
+
if (saved?.settings) {
|
|
301
|
+
try {
|
|
302
|
+
await new CredentialVault().read({
|
|
303
|
+
...saved.settings,
|
|
304
|
+
...credentialReference(saved.settings.credentialStore, saved.settings.credentialId),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
output.diagnostic('The saved project credential is unavailable. Review its named key in Console before replacement.');
|
|
309
|
+
issue = true;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
if (issue) {
|
|
313
|
+
if (org?.role === 'member')
|
|
314
|
+
throw new InputError('An owner or admin must issue this project key. Obtain a key from your admin for environment setup.');
|
|
315
|
+
if (saved?.pendingKeyName)
|
|
316
|
+
output.diagnostic(`Inspect/revoke ${saved.pendingKeyName} in Console before replacing the uncertain connection.`);
|
|
317
|
+
if ((await ask('Issue a new project key and store it in your OS credential store? Type yes', 'no')) !==
|
|
318
|
+
'yes')
|
|
319
|
+
throw new InputError('No project key was requested.');
|
|
320
|
+
}
|
|
321
|
+
return useProject(options, project.organization_id, project.id, issue, output);
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@functional-systems/lambdadb-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7-dev.24",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Project-scoped LambdaDB command-line tools",
|
|
6
6
|
"type": "module",
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"src",
|
|
13
13
|
"README.md",
|
|
14
14
|
"DESIGN.md",
|
|
15
|
+
"ONBOARDING.md",
|
|
15
16
|
"CONTRIBUTING.md",
|
|
16
17
|
"examples",
|
|
17
18
|
"skills",
|
|
@@ -54,5 +55,9 @@
|
|
|
54
55
|
"bugs": {
|
|
55
56
|
"url": "https://github.com/lambdadb/lambdadb-cli/issues"
|
|
56
57
|
},
|
|
57
|
-
"license": "Apache-2.0"
|
|
58
|
+
"license": "Apache-2.0",
|
|
59
|
+
"optionalDependencies": {
|
|
60
|
+
"@napi-rs/keyring": "2.1.2"
|
|
61
|
+
},
|
|
62
|
+
"gitHead": "0aa76042beee4d294553d927a22c71586636c6d0"
|
|
58
63
|
}
|
package/skills/lambdadb/SKILL.md
CHANGED
|
@@ -23,12 +23,15 @@ file and run `lambdadb query --collection NAME --ref branch:main --file FILE --j
|
|
|
23
23
|
The query body follows the LambdaDB API, not SQL. Consult
|
|
24
24
|
https://docs.lambdadb.ai for field-specific query syntax.
|
|
25
25
|
|
|
26
|
-
Credentials come
|
|
27
|
-
launch environment. Never print keys or put them in files,
|
|
28
|
-
generated examples. If MCP cannot start, check
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
26
|
+
Credentials come from a saved OS credential reference or the selected environment
|
|
27
|
+
variable in the agent's launch environment. Never print keys or put them in files,
|
|
28
|
+
arguments, generated examples or chat. If MCP cannot start, check whether its
|
|
29
|
+
configured OS store is unlocked and accessible to the same user, or whether the
|
|
30
|
+
selected environment variable is available. Do not silently reconnect or issue a
|
|
31
|
+
new key. Kernel keyutils credentials can disappear after reboot/expiry without
|
|
32
|
+
revoking the server key. `lambdadb doctor` verifies authentication and
|
|
33
|
+
collection-list access only. The user can explicitly run `lambdadb init --connect`
|
|
34
|
+
for Console signup/login and CLI approval, followed by terminal project selection.
|
|
32
35
|
|
|
33
36
|
MCP exposes read tools by default. Write tools require explicit setup opt-in;
|
|
34
37
|
their availability does not authorize creating collections or changing data.
|