@vendoai/vendo 0.4.0
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/LICENSE +202 -0
- package/README.md +28 -0
- package/bin/vendo.mjs +4 -0
- package/dist/ai-sdk.d.ts +35 -0
- package/dist/ai-sdk.js +62 -0
- package/dist/auth-presets/auth-js.d.ts +14 -0
- package/dist/auth-presets/auth-js.js +91 -0
- package/dist/auth-presets/auth0.d.ts +23 -0
- package/dist/auth-presets/auth0.js +98 -0
- package/dist/auth-presets/clerk.d.ts +23 -0
- package/dist/auth-presets/clerk.js +65 -0
- package/dist/auth-presets/conformance.d.ts +42 -0
- package/dist/auth-presets/conformance.js +139 -0
- package/dist/auth-presets/identity.d.ts +56 -0
- package/dist/auth-presets/identity.js +152 -0
- package/dist/auth-presets/index.d.ts +14 -0
- package/dist/auth-presets/index.js +12 -0
- package/dist/auth-presets/jwt.d.ts +16 -0
- package/dist/auth-presets/jwt.js +54 -0
- package/dist/auth-presets/shared.d.ts +35 -0
- package/dist/auth-presets/shared.js +1 -0
- package/dist/auth-presets/supabase.d.ts +42 -0
- package/dist/auth-presets/supabase.js +229 -0
- package/dist/byo-approvals.d.ts +37 -0
- package/dist/byo-approvals.js +189 -0
- package/dist/capability-misses.d.ts +38 -0
- package/dist/capability-misses.js +172 -0
- package/dist/catalog.d.ts +19 -0
- package/dist/catalog.js +152 -0
- package/dist/cli/cloud/args.d.ts +3 -0
- package/dist/cli/cloud/args.js +32 -0
- package/dist/cli/cloud/auth.d.ts +17 -0
- package/dist/cli/cloud/auth.js +123 -0
- package/dist/cli/cloud/client.d.ts +28 -0
- package/dist/cli/cloud/client.js +133 -0
- package/dist/cli/cloud/command.d.ts +22 -0
- package/dist/cli/cloud/command.js +73 -0
- package/dist/cli/cloud/deploy.d.ts +26 -0
- package/dist/cli/cloud/deploy.js +187 -0
- package/dist/cli/cloud/device-login.d.ts +32 -0
- package/dist/cli/cloud/device-login.js +259 -0
- package/dist/cli/cloud/index.d.ts +5 -0
- package/dist/cli/cloud/index.js +59 -0
- package/dist/cli/cloud/keys.d.ts +2 -0
- package/dist/cli/cloud/keys.js +31 -0
- package/dist/cli/cloud/members.d.ts +3 -0
- package/dist/cli/cloud/members.js +25 -0
- package/dist/cli/cloud/output.d.ts +4 -0
- package/dist/cli/cloud/output.js +12 -0
- package/dist/cli/cloud/pending-claim.d.ts +29 -0
- package/dist/cli/cloud/pending-claim.js +38 -0
- package/dist/cli/cloud/read.d.ts +3 -0
- package/dist/cli/cloud/read.js +12 -0
- package/dist/cli/cloud/services.d.ts +2 -0
- package/dist/cli/cloud/services.js +9 -0
- package/dist/cli/cloud/session.d.ts +13 -0
- package/dist/cli/cloud/session.js +41 -0
- package/dist/cli/cloud-init.d.ts +60 -0
- package/dist/cli/cloud-init.js +149 -0
- package/dist/cli/dep-versions.d.ts +26 -0
- package/dist/cli/dep-versions.js +77 -0
- package/dist/cli/doctor-codes.d.ts +58 -0
- package/dist/cli/doctor-codes.js +60 -0
- package/dist/cli/doctor-live.d.ts +67 -0
- package/dist/cli/doctor-live.js +169 -0
- package/dist/cli/doctor.d.ts +52 -0
- package/dist/cli/doctor.js +467 -0
- package/dist/cli/eject.d.ts +29 -0
- package/dist/cli/eject.js +141 -0
- package/dist/cli/extract/apply.d.ts +26 -0
- package/dist/cli/extract/apply.js +123 -0
- package/dist/cli/extract/claude-cli-harness.d.ts +18 -0
- package/dist/cli/extract/claude-cli-harness.js +132 -0
- package/dist/cli/extract/claude-harness.d.ts +14 -0
- package/dist/cli/extract/claude-harness.js +127 -0
- package/dist/cli/extract/codex-cli-harness.d.ts +31 -0
- package/dist/cli/extract/codex-cli-harness.js +154 -0
- package/dist/cli/extract/delegate.d.ts +21 -0
- package/dist/cli/extract/delegate.js +77 -0
- package/dist/cli/extract/extraction.d.ts +65 -0
- package/dist/cli/extract/extraction.js +300 -0
- package/dist/cli/extract/gateway-fuel.d.ts +69 -0
- package/dist/cli/extract/gateway-fuel.js +69 -0
- package/dist/cli/extract/harness.d.ts +114 -0
- package/dist/cli/extract/harness.js +84 -0
- package/dist/cli/extract/index.d.ts +9 -0
- package/dist/cli/extract/index.js +9 -0
- package/dist/cli/extract/npx-engine-harness.d.ts +73 -0
- package/dist/cli/extract/npx-engine-harness.js +225 -0
- package/dist/cli/extract/stages.d.ts +149 -0
- package/dist/cli/extract/stages.js +398 -0
- package/dist/cli/framework.d.ts +8 -0
- package/dist/cli/framework.js +36 -0
- package/dist/cli/init-auth.d.ts +67 -0
- package/dist/cli/init-auth.js +142 -0
- package/dist/cli/init-scaffolds.d.ts +28 -0
- package/dist/cli/init-scaffolds.js +235 -0
- package/dist/cli/init.d.ts +115 -0
- package/dist/cli/init.js +1008 -0
- package/dist/cli/mcp/index.d.ts +7 -0
- package/dist/cli/mcp/index.js +59 -0
- package/dist/cli/mcp/registry.d.ts +9 -0
- package/dist/cli/mcp/registry.js +117 -0
- package/dist/cli/mcp/server-json.d.ts +12 -0
- package/dist/cli/mcp/server-json.js +65 -0
- package/dist/cli/mcp/server.schema.json +574 -0
- package/dist/cli/mcp/verify-domain.d.ts +11 -0
- package/dist/cli/mcp/verify-domain.js +48 -0
- package/dist/cli/playground/app/embed-entry.d.ts +20 -0
- package/dist/cli/playground/app/embed-entry.js +46 -0
- package/dist/cli/playground/app/fake-client.d.ts +3 -0
- package/dist/cli/playground/app/fake-client.js +215 -0
- package/dist/cli/playground/app/fixtures.d.ts +47 -0
- package/dist/cli/playground/app/fixtures.js +472 -0
- package/dist/cli/playground/app/main.d.ts +1 -0
- package/dist/cli/playground/app/main.js +108 -0
- package/dist/cli/playground/app/scenario-mount.d.ts +13 -0
- package/dist/cli/playground/app/scenario-mount.js +48 -0
- package/dist/cli/playground/app/scenarios.d.ts +25 -0
- package/dist/cli/playground/app/scenarios.js +152 -0
- package/dist/cli/playground/app/theme-editor.d.ts +13 -0
- package/dist/cli/playground/app/theme-editor.js +149 -0
- package/dist/cli/playground/app/theme-state.d.ts +29 -0
- package/dist/cli/playground/app/theme-state.js +151 -0
- package/dist/cli/playground/bundle.gen.d.ts +2 -0
- package/dist/cli/playground/bundle.gen.js +2 -0
- package/dist/cli/playground/embed-bundle.gen.d.ts +2 -0
- package/dist/cli/playground/embed-bundle.gen.js +2 -0
- package/dist/cli/playground.d.ts +33 -0
- package/dist/cli/playground.js +120 -0
- package/dist/cli/pretty.d.ts +48 -0
- package/dist/cli/pretty.js +330 -0
- package/dist/cli/refine.d.ts +43 -0
- package/dist/cli/refine.js +181 -0
- package/dist/cli/semantics.d.ts +31 -0
- package/dist/cli/semantics.js +122 -0
- package/dist/cli/shared.d.ts +68 -0
- package/dist/cli/shared.js +184 -0
- package/dist/cli/sync.d.ts +36 -0
- package/dist/cli/sync.js +202 -0
- package/dist/cli/theme/color.d.ts +15 -0
- package/dist/cli/theme/color.js +188 -0
- package/dist/cli/theme/css-vars.d.ts +13 -0
- package/dist/cli/theme/css-vars.js +40 -0
- package/dist/cli/theme/entry-candidates.d.ts +5 -0
- package/dist/cli/theme/entry-candidates.js +22 -0
- package/dist/cli/theme/extract-theme.d.ts +184 -0
- package/dist/cli/theme/extract-theme.js +358 -0
- package/dist/cli/theme/walk.d.ts +2 -0
- package/dist/cli/theme/walk.js +24 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +333 -0
- package/dist/cloud-apps.d.ts +17 -0
- package/dist/cloud-apps.js +46 -0
- package/dist/cloud-console.d.ts +32 -0
- package/dist/cloud-console.js +72 -0
- package/dist/cloud-tools.d.ts +23 -0
- package/dist/cloud-tools.js +196 -0
- package/dist/connections.d.ts +71 -0
- package/dist/connections.js +192 -0
- package/dist/deployment-identity.d.ts +12 -0
- package/dist/deployment-identity.js +69 -0
- package/dist/dev-creds/model.d.ts +65 -0
- package/dist/dev-creds/model.js +159 -0
- package/dist/dev-creds/resolve.d.ts +36 -0
- package/dist/dev-creds/resolve.js +57 -0
- package/dist/hosted-store.d.ts +52 -0
- package/dist/hosted-store.js +322 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +1 -0
- package/dist/mastra.d.ts +46 -0
- package/dist/mastra.js +88 -0
- package/dist/react.d.ts +10 -0
- package/dist/react.js +32 -0
- package/dist/refine.d.ts +244 -0
- package/dist/refine.js +599 -0
- package/dist/remixable.d.ts +18 -0
- package/dist/remixable.js +42 -0
- package/dist/runtime-capture.d.ts +18 -0
- package/dist/runtime-capture.js +111 -0
- package/dist/sandbox-wire.d.ts +101 -0
- package/dist/sandbox-wire.js +101 -0
- package/dist/sandbox.d.ts +38 -0
- package/dist/sandbox.js +389 -0
- package/dist/server.d.ts +216 -0
- package/dist/server.js +1320 -0
- package/dist/sync-impact.d.ts +14 -0
- package/dist/sync-impact.js +75 -0
- package/dist/turn-liveness.d.ts +33 -0
- package/dist/turn-liveness.js +105 -0
- package/dist/wire/approvals.d.ts +10 -0
- package/dist/wire/approvals.js +59 -0
- package/dist/wire/apps.d.ts +5 -0
- package/dist/wire/apps.js +155 -0
- package/dist/wire/automations.d.ts +5 -0
- package/dist/wire/automations.js +57 -0
- package/dist/wire/box.d.ts +3 -0
- package/dist/wire/box.js +268 -0
- package/dist/wire/connections.d.ts +5 -0
- package/dist/wire/connections.js +47 -0
- package/dist/wire/context.d.ts +22 -0
- package/dist/wire/context.js +190 -0
- package/dist/wire/doctor.d.ts +19 -0
- package/dist/wire/doctor.js +116 -0
- package/dist/wire/misc.d.ts +18 -0
- package/dist/wire/misc.js +227 -0
- package/dist/wire/shared.d.ts +158 -0
- package/dist/wire/shared.js +134 -0
- package/dist/wire/threads.d.ts +3 -0
- package/dist/wire/threads.js +68 -0
- package/package.json +151 -0
- package/skills/vendo-setup/SKILL.md +128 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { describeDevCredential, resolveDevCredential, } from "../dev-creds/resolve.js";
|
|
3
|
+
import { isVendoKey } from "./cloud/client.js";
|
|
4
|
+
import { detectPackageManager } from "./shared.js";
|
|
5
|
+
const DOCTOR_PROBE_PROMPT = "This is a Vendo doctor health check. Reply in one short sentence confirming you can respond.";
|
|
6
|
+
/** POST one seeded turn to the live wire and stream the reply — mirrors the
|
|
7
|
+
* init finale's route (`POST {base}/threads`, UI-message SSE frames). Exit 0
|
|
8
|
+
* means a user would have gotten an answer: a non-empty text reply arrived. */
|
|
9
|
+
export async function liveModelTurn(options) {
|
|
10
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
11
|
+
const env = options.env ?? process.env;
|
|
12
|
+
const resolve = options.resolveCredential ?? resolveDevCredential;
|
|
13
|
+
const credential = await resolve({ env });
|
|
14
|
+
const rung = credential.rung;
|
|
15
|
+
const label = describeDevCredential(credential);
|
|
16
|
+
const started = Date.now();
|
|
17
|
+
const done = (partial) => ({
|
|
18
|
+
attempted: true,
|
|
19
|
+
rung,
|
|
20
|
+
credential: label,
|
|
21
|
+
elapsedMs: Date.now() - started,
|
|
22
|
+
...partial,
|
|
23
|
+
});
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 90_000);
|
|
26
|
+
try {
|
|
27
|
+
const response = await fetchImpl(`${options.base}/threads`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { "content-type": "application/json", accept: "text/event-stream" },
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
message: {
|
|
32
|
+
id: `msg_doctor_${Date.now()}`,
|
|
33
|
+
role: "user",
|
|
34
|
+
parts: [{ type: "text", text: DOCTOR_PROBE_PROMPT }],
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
signal: controller.signal,
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok || response.body === null) {
|
|
40
|
+
return done({ ok: false, error: `the wire returned ${response.status} with no stream` });
|
|
41
|
+
}
|
|
42
|
+
const reply = await readTurnStream(response.body, options.onDelta);
|
|
43
|
+
if (reply.error !== undefined)
|
|
44
|
+
return done({ ok: false, error: reply.error, reply: reply.text || undefined });
|
|
45
|
+
if (reply.text.trim().length === 0)
|
|
46
|
+
return done({ ok: false, error: "no reply text arrived" });
|
|
47
|
+
return done({ ok: true, reply: reply.text });
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const message = error instanceof Error
|
|
51
|
+
? (error.name === "AbortError" ? "the turn timed out" : error.message)
|
|
52
|
+
: "unknown error";
|
|
53
|
+
return done({ ok: false, error: message });
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
clearTimeout(timeout);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function readTurnStream(body, onDelta) {
|
|
60
|
+
const reader = body.getReader();
|
|
61
|
+
const decoder = new TextDecoder();
|
|
62
|
+
let buffer = "";
|
|
63
|
+
let text = "";
|
|
64
|
+
let error;
|
|
65
|
+
for (;;) {
|
|
66
|
+
const chunk = await reader.read();
|
|
67
|
+
if (chunk.done)
|
|
68
|
+
break;
|
|
69
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
70
|
+
for (;;) {
|
|
71
|
+
const frameEnd = buffer.indexOf("\n\n");
|
|
72
|
+
if (frameEnd === -1)
|
|
73
|
+
break;
|
|
74
|
+
const frame = buffer.slice(0, frameEnd);
|
|
75
|
+
buffer = buffer.slice(frameEnd + 2);
|
|
76
|
+
if (!frame.startsWith("data: ") || frame === "data: [DONE]")
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
const part = JSON.parse(frame.slice("data: ".length));
|
|
80
|
+
if (part.type === "text-delta" && typeof part.delta === "string") {
|
|
81
|
+
text += part.delta;
|
|
82
|
+
onDelta?.(part.delta);
|
|
83
|
+
}
|
|
84
|
+
else if (part.type === "error") {
|
|
85
|
+
error = "the turn returned an error frame";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// skip malformed frame
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return error === undefined ? { text } : { text, error };
|
|
94
|
+
}
|
|
95
|
+
/* ------------------------------------------------------------------------ *
|
|
96
|
+
* VENDO_API_KEY local shape check + what Cloud unlocks.
|
|
97
|
+
* ------------------------------------------------------------------------ */
|
|
98
|
+
/** Human-facing list of what a Cloud key unlocks over OSS single-player. Shown
|
|
99
|
+
* whether or not a key is present, so a keyless dev sees the offer. */
|
|
100
|
+
export const CLOUD_UNLOCKS = [
|
|
101
|
+
"a free dev-mode starter model allowance (keyless first turns)",
|
|
102
|
+
"team sharing and org governance (roles, SSO)",
|
|
103
|
+
"hosted deploys of your enabled automations",
|
|
104
|
+
"registry publishing and hosted infrastructure defaults like the managed MCP broker",
|
|
105
|
+
];
|
|
106
|
+
/** Check VENDO_API_KEY presence and shape locally; always surface what Cloud
|
|
107
|
+
* unlocks. Key problems surface on the first real service call — there is no
|
|
108
|
+
* validate endpoint. */
|
|
109
|
+
export async function cloudDoctor(options = {}) {
|
|
110
|
+
const env = options.env ?? process.env;
|
|
111
|
+
const key = env["VENDO_API_KEY"];
|
|
112
|
+
if (key === undefined || key.trim().length === 0) {
|
|
113
|
+
return { present: false, ok: false, unlocks: CLOUD_UNLOCKS };
|
|
114
|
+
}
|
|
115
|
+
if (!isVendoKey(key)) {
|
|
116
|
+
return { present: true, ok: false, unlocks: CLOUD_UNLOCKS, error: "VENDO_API_KEY is malformed (expected vnd_ + 40 hex chars)" };
|
|
117
|
+
}
|
|
118
|
+
return { present: true, ok: true, unlocks: CLOUD_UNLOCKS };
|
|
119
|
+
}
|
|
120
|
+
function defaultSpawnDev(packageManager, root) {
|
|
121
|
+
return spawn(packageManager, ["run", "dev"], { cwd: root, stdio: ["ignore", "pipe", "pipe"] });
|
|
122
|
+
}
|
|
123
|
+
async function waitForStatus(statusUrl, fetchImpl, timeoutMs) {
|
|
124
|
+
const deadline = Date.now() + timeoutMs;
|
|
125
|
+
while (Date.now() < deadline) {
|
|
126
|
+
try {
|
|
127
|
+
const response = await fetchImpl(`${statusUrl}/status`);
|
|
128
|
+
if (response.ok)
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// not up yet
|
|
133
|
+
}
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 750));
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
/** Spawn `run dev` and wait for the wire to answer. Caller stop()s it. */
|
|
139
|
+
export async function startDevServerForProbe(options) {
|
|
140
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
141
|
+
const packageManager = await detectPackageManager(options.root);
|
|
142
|
+
const child = (options.spawnDev ?? defaultSpawnDev)(packageManager, options.root);
|
|
143
|
+
const log = [];
|
|
144
|
+
const record = (data) => {
|
|
145
|
+
log.push(data.toString());
|
|
146
|
+
if (log.length > 200)
|
|
147
|
+
log.shift();
|
|
148
|
+
};
|
|
149
|
+
child.stdout?.on("data", record);
|
|
150
|
+
child.stderr?.on("data", record);
|
|
151
|
+
// A spawn failure (e.g. lockfile-derived package manager missing from PATH →
|
|
152
|
+
// ENOENT) emits 'error'; without a listener that crashes the whole process.
|
|
153
|
+
// Record it and short-circuit the status wait so the caller degrades to the
|
|
154
|
+
// "could not start" warning instead.
|
|
155
|
+
let failSpawn = () => { };
|
|
156
|
+
const spawnFailed = new Promise((resolve) => { failSpawn = () => resolve(false); });
|
|
157
|
+
child.on("error", (error) => {
|
|
158
|
+
log.push(`spawn error: ${error.message}\n`);
|
|
159
|
+
failSpawn();
|
|
160
|
+
});
|
|
161
|
+
const stop = () => { child.kill("SIGTERM"); };
|
|
162
|
+
const up = await Promise.race([
|
|
163
|
+
waitForStatus(options.statusUrl, fetchImpl, options.timeoutMs ?? 120_000),
|
|
164
|
+
spawnFailed,
|
|
165
|
+
]);
|
|
166
|
+
if (!up)
|
|
167
|
+
stop();
|
|
168
|
+
return { ok: up, stop, log };
|
|
169
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CloudDoctorResult, type LiveTurnResult } from "./doctor-live.js";
|
|
2
|
+
import { type Output } from "./shared.js";
|
|
3
|
+
export interface DoctorOptions {
|
|
4
|
+
targetDir: string;
|
|
5
|
+
url?: string;
|
|
6
|
+
fetchImpl?: typeof fetch;
|
|
7
|
+
output?: Output;
|
|
8
|
+
/** Machine-readable single-object output (design §5). */
|
|
9
|
+
json?: boolean;
|
|
10
|
+
/** Auto-confirm the dev-server-probe consent — works non-interactively
|
|
11
|
+
* (piped stdio / CI); --json runs never start the server. */
|
|
12
|
+
yes?: boolean;
|
|
13
|
+
env?: Record<string, string | undefined>;
|
|
14
|
+
telemetry?: {
|
|
15
|
+
home?: string;
|
|
16
|
+
env?: Record<string, string | undefined>;
|
|
17
|
+
posthogKey?: string;
|
|
18
|
+
fetchImpl?: typeof fetch;
|
|
19
|
+
};
|
|
20
|
+
/** Seams (tests): each new probe is injectable so doctor runs without keys
|
|
21
|
+
* or a running server. */
|
|
22
|
+
interactive?: boolean;
|
|
23
|
+
confirm?: (question: string, defaultYes?: boolean) => Promise<boolean>;
|
|
24
|
+
liveTurn?: (base: string) => Promise<LiveTurnResult>;
|
|
25
|
+
cloudProbe?: (options: {
|
|
26
|
+
env?: Record<string, string | undefined>;
|
|
27
|
+
}) => Promise<CloudDoctorResult>;
|
|
28
|
+
startDevServer?: (options: {
|
|
29
|
+
root: string;
|
|
30
|
+
statusUrl: string;
|
|
31
|
+
env?: Record<string, string | undefined>;
|
|
32
|
+
fetchImpl?: typeof fetch;
|
|
33
|
+
}) => Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
stop: () => void;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
/** Doctor runs standalone, so unlike the dev server it gets no framework
|
|
39
|
+
* dotenv loading — without this, `VENDO_API_KEY` sitting in `.env.local`
|
|
40
|
+
* is invisible to the cloud/live-turn checks and users must export it by
|
|
41
|
+
* hand. Reads `.env` then `.env.local` (local wins); real process env wins
|
|
42
|
+
* over both at the merge site. Minimal KEY=VALUE parser: `export ` prefix,
|
|
43
|
+
* matching single/double quotes, and `#` comment lines. */
|
|
44
|
+
export declare function readDotEnvFallback(root: string): Promise<Record<string, string>>;
|
|
45
|
+
/** Process env wins over the dotenv fallback — except that a blank process
|
|
46
|
+
* value yields to a concrete dotenv one, matching toolingTelemetry's
|
|
47
|
+
* VENDO_API_KEY precedence (an exported empty `VENDO_API_KEY=` must not
|
|
48
|
+
* mask the real key in `.env.local`). */
|
|
49
|
+
export declare function mergeEnvOverDotEnv(fallback: Record<string, string>, processEnv: NodeJS.ProcessEnv): Record<string, string | undefined>;
|
|
50
|
+
/** 09-vendo §5 / block-actions A — wiring checks plus live composition,
|
|
51
|
+
present-credential, and actAs mint+verify round-trips. */
|
|
52
|
+
export declare function runDoctor(options: DoctorOptions): Promise<number>;
|