@botconnector/bccli 0.4.0 → 0.4.2
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/README.en.md +13 -2
- package/README.md +13 -2
- package/dist/abort.d.ts +5 -0
- package/dist/{acp-ATIL4JOZ.js → acp-UYC6APR5.js} +30 -6
- package/dist/acp.d.ts +28 -0
- package/dist/agent.d.ts +147 -0
- package/dist/agents.d.ts +4 -0
- package/dist/args-NRTZWWEV.js +13 -0
- package/dist/args.d.ts +53 -0
- package/dist/budget.d.ts +23 -0
- package/dist/checkpoints.d.ts +35 -0
- package/dist/{chunk-6M5X2KZE.js → chunk-266SY3MC.js} +1 -1
- package/dist/{chunk-7F3IWBPQ.js → chunk-3I5BW3ZT.js} +20 -9
- package/dist/{chunk-UZWJQF67.js → chunk-3WHI4LN3.js} +2 -1
- package/dist/{chunk-PUN4HMAG.js → chunk-5YJ3ZQVR.js} +73 -10
- package/dist/{chunk-L7QI6JN2.js → chunk-6M55UPES.js} +7 -7
- package/dist/{chunk-KEMYIGCP.js → chunk-6UO5GX55.js} +26 -12
- package/dist/{chunk-TLPFQIS2.js → chunk-C64KM37J.js} +36 -6
- package/dist/{chunk-JL5ZCSP2.js → chunk-H7XJDKJY.js} +4 -4
- package/dist/{chunk-SPRNLS7K.js → chunk-HQW4BROS.js} +4 -5
- package/dist/{chunk-XBO5GACQ.js → chunk-IYR5PYA3.js} +4 -4
- package/dist/{chunk-45SDLMTV.js → chunk-JXM6REER.js} +1 -1
- package/dist/{chunk-BLOYFIAD.js → chunk-KPTML72Q.js} +1 -1
- package/dist/{chunk-BQ2IGPBR.js → chunk-NQOGVP3I.js} +2 -2
- package/dist/{chunk-QZKLZELZ.js → chunk-OK2USAXX.js} +28 -4
- package/dist/{chunk-TVALKHFB.js → chunk-R72OV7RF.js} +421 -108
- package/dist/{chunk-LACUWBWS.js → chunk-RX4UQX43.js} +25 -10
- package/dist/{chunk-QDQU6VY2.js → chunk-SVD4LHJC.js} +73 -3
- package/dist/{chunk-BNA74HPN.js → chunk-TIMSYZIR.js} +7 -7
- package/dist/{chunk-O7M3TGIW.js → chunk-WFZKJY3R.js} +43 -4
- package/dist/{chunk-M7CALSP3.js → chunk-ZEPTUKNW.js} +120 -32
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +61 -45
- package/dist/clipboardImage.d.ts +17 -0
- package/dist/commands.d.ts +16 -0
- package/dist/{completion-HPPFDAPB.js → completion-D2BSBTQO.js} +1 -1
- package/dist/completion.d.ts +14 -0
- package/dist/{config-COPNMMV6.js → config-ENDRMOTP.js} +3 -3
- package/dist/{config-RZ5JONMX.js → config-LAINORU5.js} +8 -4
- package/dist/config.d.ts +99 -0
- package/dist/context.d.ts +13 -0
- package/dist/contextWindow.d.ts +3 -0
- package/dist/diff.d.ts +7 -0
- package/dist/exit.d.ts +9 -0
- package/dist/extensions.d.ts +34 -0
- package/dist/{ghBotCli-IBCZIWT5.js → ghBotCli-TSLRORJJ.js} +21 -20
- package/dist/ghBotCli.d.ts +9 -0
- package/dist/ghBotDispatch.d.ts +68 -0
- package/dist/ghBotRunner.d.ts +82 -0
- package/dist/ghBotServe.d.ts +21 -0
- package/dist/ghBotWebhook.d.ts +45 -0
- package/dist/hooks.d.ts +27 -0
- package/dist/i18n/id.d.ts +1 -0
- package/dist/i18n.d.ts +16 -0
- package/dist/{integrationCli-P75R2VSC.js → integrationCli-HXCSEWH2.js} +2 -2
- package/dist/integrationCli.d.ts +9 -0
- package/dist/keybinds.d.ts +22 -0
- package/dist/{login-SYIQP46J.js → login-RYESFZG6.js} +4 -4
- package/dist/login.d.ts +19 -0
- package/dist/lsp.d.ts +50 -0
- package/dist/mcp/catalog.d.ts +14 -0
- package/dist/mcp/config.d.ts +36 -0
- package/dist/mcp/manager.d.ts +52 -0
- package/dist/mcp/oauth.d.ts +82 -0
- package/dist/{mcpCli-QUV5SD64.js → mcpCli-SETTCL3K.js} +6 -6
- package/dist/mcpCli.d.ts +3 -0
- package/dist/mcpServer/serve.d.ts +8 -0
- package/dist/mcpServer/server.d.ts +19 -0
- package/dist/models.d.ts +13 -0
- package/dist/{modelsCli-TRRB5LX4.js → modelsCli-OP7CDZC7.js} +6 -6
- package/dist/modelsCli.d.ts +15 -0
- package/dist/npmRunner.d.ts +21 -0
- package/dist/{oauthLogin-6FWQABJ7.js → oauthLogin-XWY7OHCG.js} +1 -1
- package/dist/oauthLogin.d.ts +47 -0
- package/dist/permissions.d.ts +30 -0
- package/dist/pluginSpec.d.ts +25 -0
- package/dist/plugins.d.ts +45 -0
- package/dist/{pluginsCli-GNW4TPVV.js → pluginsCli-ZQNKWZHJ.js} +2 -2
- package/dist/pluginsCli.d.ts +16 -0
- package/dist/{prCli-5IMV3VNQ.js → prCli-6PUWTMTP.js} +20 -4
- package/dist/prCli.d.ts +46 -0
- package/dist/presets.d.ts +8 -0
- package/dist/print.d.ts +16 -0
- package/dist/provider.d.ts +145 -0
- package/dist/providerCli-5OZI2GQQ.js +15 -0
- package/dist/providerCli.d.ts +17 -0
- package/dist/providers.d.ts +6 -0
- package/dist/reasoning.d.ts +12 -0
- package/dist/repomap.d.ts +10 -0
- package/dist/sdk.d.ts +61 -0
- package/dist/sdk.js +829 -191
- package/dist/{serve-JG7RLIUD.js → serve-4J7HA4JO.js} +24 -18
- package/dist/{serve-6QLBJUYW.js → serve-K5AH4MGO.js} +3 -3
- package/dist/serve.d.ts +37 -0
- package/dist/serveHeartbeat.d.ts +14 -0
- package/dist/serveProtocol.d.ts +47 -0
- package/dist/session-YQXCCKXI.js +12 -0
- package/dist/session.d.ts +33 -0
- package/dist/setup-S4AJT6XE.js +24 -0
- package/dist/setup.d.ts +74 -0
- package/dist/slash/copy.d.ts +1 -0
- package/dist/slash/diff.d.ts +1 -0
- package/dist/slash/doctor.d.ts +18 -0
- package/dist/slash/export.d.ts +2 -0
- package/dist/slash/info.d.ts +46 -0
- package/dist/slash/memory.d.ts +10 -0
- package/dist/{statsCli-CF3R7ATL.js → statsCli-XR6BEZQQ.js} +2 -2
- package/dist/statsCli.d.ts +62 -0
- package/dist/textToolCalls.d.ts +6 -0
- package/dist/thinking.d.ts +17 -0
- package/dist/tokenBudget.d.ts +22 -0
- package/dist/tools/bash.d.ts +52 -0
- package/dist/tools/diagnostics.d.ts +5 -0
- package/dist/tools/edit.d.ts +12 -0
- package/dist/tools/fetch.d.ts +41 -0
- package/dist/tools/glob.d.ts +5 -0
- package/dist/tools/globSafety.d.ts +7 -0
- package/dist/tools/grep.d.ts +25 -0
- package/dist/tools/ignore.d.ts +2 -0
- package/dist/tools/index.d.ts +12 -0
- package/dist/tools/memory.d.ts +13 -0
- package/dist/tools/paths.d.ts +4 -0
- package/dist/tools/plan.d.ts +10 -0
- package/dist/tools/read.d.ts +16 -0
- package/dist/tools/repomap.d.ts +2 -0
- package/dist/tools/sandbox.d.ts +12 -0
- package/dist/tools/shell.d.ts +18 -0
- package/dist/tools/skill.d.ts +3 -0
- package/dist/tools/task.d.ts +28 -0
- package/dist/tools/todo.d.ts +13 -0
- package/dist/tools/types.d.ts +52 -0
- package/dist/tools/websearch.d.ts +9 -0
- package/dist/tools/write.d.ts +5 -0
- package/dist/{transferCli-TK2GSVRK.js → transferCli-R2KEIWQR.js} +8 -6
- package/dist/transferCli.d.ts +23 -0
- package/dist/ui/App.d.ts +7 -0
- package/dist/ui/DiffView.d.ts +3 -0
- package/dist/ui/EditableText.d.ts +7 -0
- package/dist/ui/LinePrompt.d.ts +6 -0
- package/dist/ui/ListPicker.d.ts +11 -0
- package/dist/ui/Markdown.d.ts +8 -0
- package/dist/ui/McpMenu.d.ts +11 -0
- package/dist/ui/ModelPicker.d.ts +6 -0
- package/dist/ui/PermissionPrompt.d.ts +5 -0
- package/dist/ui/PlanApproval.d.ts +5 -0
- package/dist/ui/PromptInput.d.ts +18 -0
- package/dist/ui/ProviderMenu.d.ts +10 -0
- package/dist/ui/Spinner.d.ts +4 -0
- package/dist/ui/StatusBar.d.ts +9 -0
- package/dist/ui/TodoList.d.ts +4 -0
- package/dist/ui/ToolBlock.d.ts +14 -0
- package/dist/ui/complete.d.ts +6 -0
- package/dist/ui/focusReport.d.ts +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/lineEdit.d.ts +42 -0
- package/dist/ui/replay.d.ts +4 -0
- package/dist/ui/table.d.ts +20 -0
- package/dist/ui/theme.d.ts +5 -0
- package/dist/ui/thinkingMouse.d.ts +33 -0
- package/dist/ui/transcript.d.ts +55 -0
- package/dist/ui/vim.d.ts +26 -0
- package/dist/{ui-B3CJ6TGE.js → ui-36ZEK65V.js} +179 -54
- package/dist/{update-K5IQ2MYR.js → update-FSS7X5WV.js} +2 -2
- package/dist/update.d.ts +30 -0
- package/dist/verify.d.ts +16 -0
- package/dist/version.d.ts +1 -0
- package/dist/webBudget.d.ts +25 -0
- package/dist/worktree.d.ts +12 -0
- package/package.json +26 -13
- package/dist/args-J5ONVGIF.js +0 -13
- package/dist/providerCli-FAOZHOKW.js +0 -15
- package/dist/session-KBAQ4BZ5.js +0 -12
- package/dist/setup-FJAWDWV4.js +0 -24
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import type { AgentEvent } from './agent';
|
|
3
|
+
import { type CommentDelivery } from './ghBotWebhook';
|
|
4
|
+
export interface GhDeps {
|
|
5
|
+
/** ASYNC (spawn, bukan spawnSync), argv array tanpa shell; stdin opsional utk `--input -`
|
|
6
|
+
* (EPIPE ditangani); signal → child di-kill; settle sekali via close/error. */
|
|
7
|
+
spawn(argv: string[], opts?: {
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
stdin?: string;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
code: number;
|
|
12
|
+
stdout: string;
|
|
13
|
+
stderr: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
/** Instruksi draf — system prompt murni (tanpa data konteks). */
|
|
17
|
+
export declare function ghSystemPrompt(): string;
|
|
18
|
+
export interface CreateGhSpawnOptions {
|
|
19
|
+
spawnImpl?: typeof spawn;
|
|
20
|
+
killGraceMs?: number;
|
|
21
|
+
hardMs?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Spawn async dgn settle HANYA dari `close` (KECUALI hard-timeout force-settle),
|
|
25
|
+
* eskalasi `kill('SIGKILL')` eksplisit, marker SELALU ikut di hard-timeout, dan
|
|
26
|
+
* cleanup listener/pipe di settle (data telat aman). Lihat spec §6.4.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createGhSpawn(cmd?: string, o?: CreateGhSpawnOptions): GhDeps['spawn'];
|
|
29
|
+
/**
|
|
30
|
+
* Konteks di-pra-kumpulkan: selalu issue view; bila isPR → pr view + pr diff.
|
|
31
|
+
* SEMUA gh command membawa --repo dari delivery tervalidasi (tanpa cwd).
|
|
32
|
+
* Data masuk blok <untrusted-github>; komentar 8KB, issue body 64KB, diff 100KB (byte UTF-8).
|
|
33
|
+
*/
|
|
34
|
+
export declare function collectGhContext(d: CommentDelivery, deps: {
|
|
35
|
+
gh: GhDeps;
|
|
36
|
+
signal: AbortSignal;
|
|
37
|
+
}): Promise<{
|
|
38
|
+
ok: true;
|
|
39
|
+
context: string;
|
|
40
|
+
} | {
|
|
41
|
+
ok: false;
|
|
42
|
+
reason: string;
|
|
43
|
+
}>;
|
|
44
|
+
export type DraftStopReason = 'done' | 'aborted' | 'stepLimit' | 'budgetExceeded' | 'error' | 'none';
|
|
45
|
+
/** Kolektor event agent: text append; textReplace MENGGANTI; stopReason = event terminal terakhir. */
|
|
46
|
+
export declare function createDraftCollector(): {
|
|
47
|
+
onEvent(e: AgentEvent): void;
|
|
48
|
+
result(): {
|
|
49
|
+
text: string;
|
|
50
|
+
stopReason: DraftStopReason;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Sukses HANYA stopReason 'done' + teks non-kosong; selain itu gagal (tanpa post).
|
|
55
|
+
* dispose SELALU di finally.
|
|
56
|
+
*/
|
|
57
|
+
export declare function runDraft(context: string, signal: AbortSignal, deps: {
|
|
58
|
+
createAgent(): {
|
|
59
|
+
run(prompt: string, signal: AbortSignal): Promise<{
|
|
60
|
+
text: string;
|
|
61
|
+
stopReason: DraftStopReason;
|
|
62
|
+
}>;
|
|
63
|
+
dispose(): Promise<void> | void;
|
|
64
|
+
};
|
|
65
|
+
system: string;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
ok: true;
|
|
68
|
+
text: string;
|
|
69
|
+
} | {
|
|
70
|
+
ok: false;
|
|
71
|
+
reason: string;
|
|
72
|
+
}>;
|
|
73
|
+
/** Post komentar via stdin JSON — hasil TERSTRUKTUR (koreksi review #1). */
|
|
74
|
+
export declare function postReply(d: CommentDelivery, text: string, deps: {
|
|
75
|
+
gh: GhDeps;
|
|
76
|
+
signal: AbortSignal;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
ok: true;
|
|
79
|
+
} | {
|
|
80
|
+
ok: false;
|
|
81
|
+
reason: string;
|
|
82
|
+
}>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type GhBotConfig, type CloseSummary } from './ghBotDispatch';
|
|
2
|
+
import type { Provider } from './provider';
|
|
3
|
+
import { type GhDeps } from './ghBotRunner';
|
|
4
|
+
export interface GhBotServeOptions {
|
|
5
|
+
port?: number;
|
|
6
|
+
host?: string;
|
|
7
|
+
config: GhBotConfig;
|
|
8
|
+
/** Aksesor per-request (rotasi secret tanpa restart — spec §3). */
|
|
9
|
+
getSecret: () => string | undefined;
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
provider?: Provider;
|
|
12
|
+
fetch?: typeof globalThis.fetch;
|
|
13
|
+
gh?: GhDeps;
|
|
14
|
+
out?: (s?: string) => void;
|
|
15
|
+
err?: (s?: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface GhBotHandle {
|
|
18
|
+
port: number;
|
|
19
|
+
close(): Promise<CloseSummary>;
|
|
20
|
+
}
|
|
21
|
+
export declare function startGhBot(opts: GhBotServeOptions): Promise<GhBotHandle>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Header wajib GitHub webhook delivery. */
|
|
2
|
+
export declare const GITHUB_HEADERS: readonly ['x-hub-signature-256', 'x-hub-delivery', 'x-hub-event'];
|
|
3
|
+
export interface CommentDelivery {
|
|
4
|
+
delivery: string;
|
|
5
|
+
event: string;
|
|
6
|
+
action: string;
|
|
7
|
+
repo: string;
|
|
8
|
+
number: number;
|
|
9
|
+
isPR: boolean;
|
|
10
|
+
author: string;
|
|
11
|
+
authorType: string;
|
|
12
|
+
body: string;
|
|
13
|
+
}
|
|
14
|
+
export type VerifyOutcome = {
|
|
15
|
+
ok: true;
|
|
16
|
+
delivery: CommentDelivery;
|
|
17
|
+
} | {
|
|
18
|
+
ok: false;
|
|
19
|
+
status: 400 | 401 | 405 | 413 | 415 | 503;
|
|
20
|
+
message: string;
|
|
21
|
+
};
|
|
22
|
+
/** 'sha256=<hex>' atas byte mentah — dipakai verifikasi dan fixture test. */
|
|
23
|
+
export declare function signBody(rawBody: Buffer, secret: string): string;
|
|
24
|
+
declare const HARD_TIMEOUT_MARKER = "<child did not close after termination>";
|
|
25
|
+
export { HARD_TIMEOUT_MARKER };
|
|
26
|
+
/**
|
|
27
|
+
* Urutan persis spec §3: method → content-type → size (byte) → header wajib →
|
|
28
|
+
* secret (aksesor per-request) → HMAC atas Buffer MENTAH → decode UTF-8 fatal →
|
|
29
|
+
* parse → tipe-guard field event. HMAC selalu sebelum decode/parse.
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyAndParse(rawBody: Buffer, headers: Record<string, string | undefined>, opts: {
|
|
32
|
+
method: string;
|
|
33
|
+
contentType: string | undefined;
|
|
34
|
+
maxBodyBytes: number;
|
|
35
|
+
getSecret: () => string | undefined;
|
|
36
|
+
}, jsonParse?: (text: string) => unknown): VerifyOutcome;
|
|
37
|
+
/**
|
|
38
|
+
* '/bccli <task>' → task trim; '/bccli' tanpa task → null (tanpa balasan);
|
|
39
|
+
* prefix lain / komentar biasa → null.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractCommand(body: string): string | null;
|
|
42
|
+
/** Potong di batas code point dengan budget byte UTF-8 — tak pernah membelah karakter. */
|
|
43
|
+
export declare function truncateUtf8Bytes(text: string, maxBytes: number, marker?: string): string;
|
|
44
|
+
/** 60% kepala + 40% ekor dalam SATU budget byte, dengan marker di tengah. */
|
|
45
|
+
export declare function truncateHeadTailUtf8(text: string, maxBytes: number, marker?: string): string;
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type HookEvent = 'PreToolUse' | 'PostToolUse' | 'SessionStart' | 'Stop';
|
|
2
|
+
export interface HookRule {
|
|
3
|
+
/** Glob over the tool name ('*' matches everything, omitted = every tool). Tool events only. */
|
|
4
|
+
match?: string;
|
|
5
|
+
command: string;
|
|
6
|
+
}
|
|
7
|
+
export type HooksConfig = Partial<Record<HookEvent, HookRule[]>>;
|
|
8
|
+
export interface HookOutcome {
|
|
9
|
+
/** PreToolUse only: the tool call is denied with this message instead of running. */
|
|
10
|
+
blocked?: string;
|
|
11
|
+
warnings: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface HookRunOptions {
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Runs the configured hooks for one event, in order. A PreToolUse hook that exits
|
|
20
|
+
* with code 2 blocks the tool call (Claude Code semantics); any other failure is a
|
|
21
|
+
* non-blocking warning. Hooks receive BCCLI_HOOK_EVENT/TOOL/INPUT/OUTPUT env vars.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runHooks(hooks: HooksConfig | undefined, event: HookEvent, payload?: {
|
|
24
|
+
tool?: string;
|
|
25
|
+
input?: unknown;
|
|
26
|
+
output?: string;
|
|
27
|
+
}, opts?: HookRunOptions): Promise<HookOutcome>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ID: Record<string, string>;
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type Lang = 'en' | 'id';
|
|
2
|
+
export declare const LANGS: readonly Lang[];
|
|
3
|
+
export declare function parseLang(value: string | undefined): Lang | undefined;
|
|
4
|
+
export declare function setLanguage(lang: Lang): void;
|
|
5
|
+
export declare function getLanguage(): Lang;
|
|
6
|
+
/** Locale for dates and numbers, matching the UI language. */
|
|
7
|
+
export declare const locale: () => string;
|
|
8
|
+
/**
|
|
9
|
+
* User-facing text. The English sentence is the key; Indonesian lives in i18n/id.ts.
|
|
10
|
+
* Placeholders are `{name}`. Text the model reads (tool results, prompts) is plain English and does not go through here.
|
|
11
|
+
*/
|
|
12
|
+
export declare function t(en: string, params?: Record<string, string | number>): string;
|
|
13
|
+
/** `--lang x` or `--lang=x` from raw argv, so even argument errors can be shown in the right language. */
|
|
14
|
+
export declare function langFromArgv(argv: string[]): Lang | undefined;
|
|
15
|
+
/** --lang, then BCCLI_LANG, then the `language` of the global config, then English. */
|
|
16
|
+
export declare function resolveLanguage(argv: string[], env: NodeJS.ProcessEnv, fromConfig?: string): Lang;
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
loadConfig,
|
|
6
6
|
readCredentials,
|
|
7
7
|
resolveModel
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RX4UQX43.js";
|
|
9
9
|
import {
|
|
10
10
|
t
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-3WHI4LN3.js";
|
|
12
12
|
|
|
13
13
|
// src/integrationCli.ts
|
|
14
14
|
import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CliArgs } from './args';
|
|
2
|
+
export interface IntegrationDeps {
|
|
3
|
+
env: NodeJS.ProcessEnv;
|
|
4
|
+
cwd: string;
|
|
5
|
+
out: (s: string) => void;
|
|
6
|
+
err: (s: string) => void;
|
|
7
|
+
fetch: typeof globalThis.fetch;
|
|
8
|
+
}
|
|
9
|
+
export declare function runIntegrationCommand(args: CliArgs, deps: IntegrationDeps): Promise<number>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type KeybindAction = 'thinking' | 'toolOutput' | 'pasteImage';
|
|
2
|
+
export declare const KEYBIND_ACTIONS: KeybindAction[];
|
|
3
|
+
export declare const DEFAULT_KEYBINDS: Record<KeybindAction, string>;
|
|
4
|
+
export declare function defaultKeybinds(): Record<KeybindAction, Keybind>;
|
|
5
|
+
export interface Keybind {
|
|
6
|
+
/** The normalized spec, for display in notices and /help. */
|
|
7
|
+
spec: string;
|
|
8
|
+
ctrl: boolean;
|
|
9
|
+
meta: boolean;
|
|
10
|
+
/** Lowercase single letter. */
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parses "ctrl+t" / "alt+x" / "ctrl+alt+o". A modifier is required: a bare letter
|
|
15
|
+
* would fire while the user types. Returns undefined for anything else so the
|
|
16
|
+
* caller can produce a localized ConfigError.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseKeybind(raw: string): Keybind | undefined;
|
|
19
|
+
export declare function matchKeybind(kb: Keybind, input: string, key: {
|
|
20
|
+
ctrl?: boolean;
|
|
21
|
+
meta?: boolean;
|
|
22
|
+
}): boolean;
|
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
readLine,
|
|
5
5
|
readSecret,
|
|
6
6
|
runLogin
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-TIMSYZIR.js";
|
|
8
|
+
import "./chunk-3I5BW3ZT.js";
|
|
9
|
+
import "./chunk-RX4UQX43.js";
|
|
10
|
+
import "./chunk-3WHI4LN3.js";
|
|
11
11
|
export {
|
|
12
12
|
defaultLoginDeps,
|
|
13
13
|
readLine,
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function readSecret(prompt: string): Promise<string>;
|
|
2
|
+
/** Prompt TANPA masking (kode otorisasi harus terlihat saat di-paste). Ctrl+C -> exit 130. */
|
|
3
|
+
export declare function readLine(prompt: string): Promise<string>;
|
|
4
|
+
import type { CliArgs } from './args';
|
|
5
|
+
import type { ABORT } from './oauthLogin';
|
|
6
|
+
export interface LoginDeps {
|
|
7
|
+
out(s: string): void;
|
|
8
|
+
err(s: string): void;
|
|
9
|
+
env: NodeJS.ProcessEnv;
|
|
10
|
+
isTTY: boolean;
|
|
11
|
+
open(url: string): void;
|
|
12
|
+
readLine(prompt: string): Promise<string | typeof ABORT>;
|
|
13
|
+
saveCredential(id: string, key: string): void;
|
|
14
|
+
removeCredential(id: string): boolean;
|
|
15
|
+
fetch: typeof fetch;
|
|
16
|
+
legacyAdd(providerId: string, cwd: string): Promise<number>;
|
|
17
|
+
}
|
|
18
|
+
export declare function defaultLoginDeps(): LoginDeps;
|
|
19
|
+
export declare function runLogin(providerId: string, cwd: string, args: CliArgs, deps: LoginDeps): Promise<number>;
|
package/dist/lsp.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare function languageIdFor(file: string): string;
|
|
2
|
+
export declare function useShellForLsp(command: string, platform?: NodeJS.Platform): boolean;
|
|
3
|
+
export interface LspServer {
|
|
4
|
+
extensions: string[];
|
|
5
|
+
command: string;
|
|
6
|
+
args?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface LspDiagnostic {
|
|
9
|
+
line: number;
|
|
10
|
+
character: number;
|
|
11
|
+
severity: number;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
interface LspRawDiagnostic {
|
|
15
|
+
range?: {
|
|
16
|
+
start?: {
|
|
17
|
+
line?: number;
|
|
18
|
+
character?: number;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
severity?: number;
|
|
22
|
+
message?: string;
|
|
23
|
+
}
|
|
24
|
+
/** The JSON-RPC messages this one-shot client cares about. */
|
|
25
|
+
export interface LspMessage {
|
|
26
|
+
id?: number;
|
|
27
|
+
method?: string;
|
|
28
|
+
result?: unknown;
|
|
29
|
+
params?: {
|
|
30
|
+
uri?: string;
|
|
31
|
+
diagnostics?: LspRawDiagnostic[];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export declare function encodeLsp(msg: unknown): Buffer;
|
|
35
|
+
/** Content-Length framed JSON-RPC reader; survives messages split across chunks. */
|
|
36
|
+
export declare function createLspParser(onMessage: (msg: LspMessage) => void): {
|
|
37
|
+
push(chunk: Buffer): void;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Open one file with one LSP server, wait for its first publishDiagnostics (or the timeout),
|
|
41
|
+
* then shut it down. A one-shot client on purpose: no long-lived servers to manage yet.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getDiagnostics(opts: {
|
|
44
|
+
server: LspServer;
|
|
45
|
+
cwd: string;
|
|
46
|
+
file: string;
|
|
47
|
+
timeoutMs?: number;
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}): Promise<LspDiagnostic[]>;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { McpServerConfig } from './config';
|
|
2
|
+
export interface CatalogInput {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
secret?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CatalogEntry {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
config: McpServerConfig;
|
|
11
|
+
inputs?: CatalogInput[];
|
|
12
|
+
}
|
|
13
|
+
export declare const CATALOG: CatalogEntry[];
|
|
14
|
+
export declare function fillTemplate(config: McpServerConfig, values: Record<string, string>): McpServerConfig;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type McpServerConfig = {
|
|
2
|
+
type?: 'stdio';
|
|
3
|
+
command: string;
|
|
4
|
+
args?: string[];
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'http';
|
|
8
|
+
url: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
auth?: 'oauth';
|
|
11
|
+
};
|
|
12
|
+
export interface McpServerSpec {
|
|
13
|
+
name: string;
|
|
14
|
+
config: McpServerConfig;
|
|
15
|
+
source: 'global' | 'project';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Claude Code-style environment expansion at connect time: ${VAR} reads from the
|
|
19
|
+
* parent environment, ${VAR:-default} falls back when unset, and an unset variable
|
|
20
|
+
* without a default stays literal. This lets a server pull a secret from the parent
|
|
21
|
+
* env ("API_KEY": "${MY_KEY}") without pasting the value into mcp.json, while the
|
|
22
|
+
* stdio child still only receives the whitelist plus the resolved config env.
|
|
23
|
+
*/
|
|
24
|
+
export declare function expandEnvVars(config: McpServerConfig, env: NodeJS.ProcessEnv): McpServerConfig;
|
|
25
|
+
export declare const globalMcpPath: (home: string) => string;
|
|
26
|
+
export declare const projectMcpPath: (cwd: string) => string;
|
|
27
|
+
export declare function readMcpFile(path: string): Record<string, McpServerConfig>;
|
|
28
|
+
export declare function addGlobalServer(home: string, name: string, config: McpServerConfig): void;
|
|
29
|
+
export declare function removeGlobalServer(home: string, name: string): void;
|
|
30
|
+
export declare function projectTrust(home: string, cwd: string, name: string, config: McpServerConfig): boolean | undefined;
|
|
31
|
+
export declare function setProjectTrust(home: string, cwd: string, name: string, allowed: boolean, config: McpServerConfig): void;
|
|
32
|
+
/** Global servers always; project servers only after a recorded yes. A project server never shadows a global one. */
|
|
33
|
+
export declare function serversToStart(home: string, cwd: string): {
|
|
34
|
+
start: McpServerSpec[];
|
|
35
|
+
needTrust: McpServerSpec[];
|
|
36
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Tool } from '../tools/types';
|
|
2
|
+
import type { McpServerSpec } from './config';
|
|
3
|
+
export interface McpContentItem {
|
|
4
|
+
type: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
data?: string;
|
|
7
|
+
mimeType?: string;
|
|
8
|
+
resource?: {
|
|
9
|
+
uri?: string;
|
|
10
|
+
text?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function formatMcpContent(content: McpContentItem[] | undefined): {
|
|
14
|
+
output: string;
|
|
15
|
+
images?: {
|
|
16
|
+
mediaType: string;
|
|
17
|
+
data: string;
|
|
18
|
+
path: string;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
/** Safe env for spawned MCP servers: whitelist from the parent + the server's own config.env. */
|
|
22
|
+
export declare function mcpChildEnv(extra?: Record<string, string>): Record<string, string>;
|
|
23
|
+
export interface McpServerState {
|
|
24
|
+
name: string;
|
|
25
|
+
source: 'global' | 'project';
|
|
26
|
+
status: 'starting' | 'ready' | 'error';
|
|
27
|
+
error?: string;
|
|
28
|
+
tools: number;
|
|
29
|
+
}
|
|
30
|
+
/** OpenAI function names: [A-Za-z0-9_-], max 64 chars, unique. */
|
|
31
|
+
export declare function mcpToolName(server: string, tool: string, taken: Set<string>): string;
|
|
32
|
+
export declare class McpManager {
|
|
33
|
+
private readonly opts;
|
|
34
|
+
private readonly servers;
|
|
35
|
+
private readonly taken;
|
|
36
|
+
constructor(opts?: {
|
|
37
|
+
connectTimeoutMs?: number;
|
|
38
|
+
onChange?: () => void;
|
|
39
|
+
onToolsRemoved?: (names: string[]) => void;
|
|
40
|
+
/** Config home for the OAuth token store; enables authProvider on http servers. */
|
|
41
|
+
home?: string;
|
|
42
|
+
/** Overrides how the OAuth consent page is opened (tests inject a fake browser). */
|
|
43
|
+
open?: (url: URL) => void | Promise<void>;
|
|
44
|
+
});
|
|
45
|
+
start(specs: McpServerSpec[]): Promise<void>;
|
|
46
|
+
add(spec: McpServerSpec): Promise<void>;
|
|
47
|
+
private wrap;
|
|
48
|
+
remove(name: string): Promise<void>;
|
|
49
|
+
tools(): Tool[];
|
|
50
|
+
states(): McpServerState[];
|
|
51
|
+
stop(): Promise<void>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { type OAuthClientProvider, type OAuthDiscoveryState } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
3
|
+
import type { OAuthClientInformationMixed, OAuthClientMetadata, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
4
|
+
import type { FetchLike } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
5
|
+
import type { McpServerConfig } from './config';
|
|
6
|
+
export interface OAuthStorage {
|
|
7
|
+
client?: OAuthClientInformationMixed;
|
|
8
|
+
tokens?: OAuthTokens;
|
|
9
|
+
codeVerifier?: string;
|
|
10
|
+
discovery?: OAuthDiscoveryState;
|
|
11
|
+
}
|
|
12
|
+
export type OAuthStore = Record<string, OAuthStorage>;
|
|
13
|
+
export declare const oauthStorePath: (home: string) => string;
|
|
14
|
+
export declare function hasStoredTokens(home: string, serverUrl: string): boolean;
|
|
15
|
+
export declare function clearTokens(home: string, serverUrl: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* The browser is opened through a direct argv hand-off: on Windows `cmd /c start` re-parses
|
|
18
|
+
* its own command line, so an authorization URL from the MCP server could smuggle a second
|
|
19
|
+
* command with `&`. rundll32 plus `shell: false` never gives the URL to a shell, and only
|
|
20
|
+
* http(s) is ever opened (no `file:`/custom protocol handlers).
|
|
21
|
+
*/
|
|
22
|
+
export declare function openCommand(url: URL, platform: NodeJS.Platform): {
|
|
23
|
+
command: string;
|
|
24
|
+
args: string[];
|
|
25
|
+
} | undefined;
|
|
26
|
+
/** Opens a URL in the user's browser (best effort; callers should also print the URL). */
|
|
27
|
+
export declare function defaultOpen(url: URL, deps?: {
|
|
28
|
+
platform?: NodeJS.Platform;
|
|
29
|
+
spawn?: typeof spawn;
|
|
30
|
+
}): void;
|
|
31
|
+
export interface FileOAuthProviderOptions {
|
|
32
|
+
home: string;
|
|
33
|
+
serverUrl: string;
|
|
34
|
+
redirectUrl?: string | URL;
|
|
35
|
+
open?: (url: URL) => void | Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* File-backed OAuthClientProvider: client registration, tokens, PKCE verifier and
|
|
39
|
+
* discovery state per MCP server URL, stored in ~/.bccli/mcp-oauth.json (mode 600).
|
|
40
|
+
*/
|
|
41
|
+
export declare class FileOAuthProvider implements OAuthClientProvider {
|
|
42
|
+
private readonly opts;
|
|
43
|
+
constructor(opts: FileOAuthProviderOptions);
|
|
44
|
+
/**
|
|
45
|
+
* Always defined: MCP SDK treats a missing redirectUrl as a non-interactive
|
|
46
|
+
* (client_credentials) flow and would try a token exchange without a code.
|
|
47
|
+
*/
|
|
48
|
+
get redirectUrl(): string | URL;
|
|
49
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
50
|
+
private entry;
|
|
51
|
+
private patch;
|
|
52
|
+
clientInformation(): OAuthClientInformationMixed | undefined;
|
|
53
|
+
saveClientInformation(clientInformation: OAuthClientInformationMixed): void;
|
|
54
|
+
tokens(): OAuthTokens | undefined;
|
|
55
|
+
saveTokens(tokens: OAuthTokens): void;
|
|
56
|
+
saveCodeVerifier(codeVerifier: string): void;
|
|
57
|
+
codeVerifier(): string;
|
|
58
|
+
redirectToAuthorization(authorizationUrl: URL): void | Promise<void>;
|
|
59
|
+
saveDiscoveryState(state: OAuthDiscoveryState): void;
|
|
60
|
+
discoveryState(): OAuthDiscoveryState | undefined;
|
|
61
|
+
invalidateCredentials(scope: 'all' | 'client' | 'tokens' | 'verifier' | 'discovery'): void;
|
|
62
|
+
}
|
|
63
|
+
/** Parses the loopback callback URL; an OAuth error response throws. */
|
|
64
|
+
export declare function parseCallback(input: string | URL): {
|
|
65
|
+
code: string;
|
|
66
|
+
state?: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Runs the MCP OAuth 2.1 (PKCE) flow for one http server: starts a loopback callback
|
|
70
|
+
* server, hands the SDK auth() orchestrator the FileOAuthProvider, opens the browser,
|
|
71
|
+
* waits for the code, exchanges it, and stores the tokens. Throws on deny/failure.
|
|
72
|
+
*/
|
|
73
|
+
export declare function authorizeMcpServer(spec: {
|
|
74
|
+
name: string;
|
|
75
|
+
config: Extract<McpServerConfig, {
|
|
76
|
+
type?: 'http';
|
|
77
|
+
}>;
|
|
78
|
+
}, deps: {
|
|
79
|
+
home: string;
|
|
80
|
+
open?: (url: URL) => void | Promise<void>;
|
|
81
|
+
fetchFn?: FetchLike;
|
|
82
|
+
}): Promise<void>;
|
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
import {
|
|
3
3
|
CATALOG,
|
|
4
4
|
fillTemplate
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-NQOGVP3I.js";
|
|
6
6
|
import {
|
|
7
7
|
authorizeMcpServer,
|
|
8
8
|
clearTokens
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3I5BW3ZT.js";
|
|
10
10
|
import {
|
|
11
11
|
addGlobalServer,
|
|
12
12
|
globalMcpPath,
|
|
13
13
|
readMcpFile,
|
|
14
14
|
removeGlobalServer
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-6M55UPES.js";
|
|
16
16
|
import {
|
|
17
17
|
bccliHome
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-RX4UQX43.js";
|
|
19
19
|
import {
|
|
20
20
|
t
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-3WHI4LN3.js";
|
|
22
22
|
|
|
23
23
|
// src/mcpCli.ts
|
|
24
24
|
async function runMcpCommand(args, deps) {
|
|
25
25
|
const home = bccliHome(deps.env);
|
|
26
26
|
const [action = "list", name] = args.subArgs;
|
|
27
27
|
if (action === "serve") {
|
|
28
|
-
const { runMcpServe } = await import("./serve-
|
|
28
|
+
const { runMcpServe } = await import("./serve-K5AH4MGO.js");
|
|
29
29
|
return runMcpServe(args, deps);
|
|
30
30
|
}
|
|
31
31
|
const installed = readMcpFile(globalMcpPath(home));
|
package/dist/mcpCli.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
import type { CliArgs } from '../args';
|
|
3
|
+
import type { CliDeps } from '../providerCli';
|
|
4
|
+
export interface McpServeDeps extends CliDeps {
|
|
5
|
+
/** Test seam: replaces the stdio transport (pass an InMemoryTransport half). */
|
|
6
|
+
transport?: Transport;
|
|
7
|
+
}
|
|
8
|
+
export declare function runMcpServe(args: CliArgs, deps: McpServeDeps): Promise<number>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { type FetchToolOptions } from '../tools/fetch';
|
|
3
|
+
export interface McpServerDeps {
|
|
4
|
+
/** BotConnector API base, e.g. https://api.botconnector.id/v1 (no trailing slash). */
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** Bearer key for paid endpoints (bc_chat); never logged or echoed. */
|
|
7
|
+
apiKey: string;
|
|
8
|
+
/** Default model id for bc_chat (provider prefix already stripped). */
|
|
9
|
+
defaultModel: string;
|
|
10
|
+
/** Injectable for tests; defaults to global fetch. */
|
|
11
|
+
fetchFn?: typeof fetch;
|
|
12
|
+
/** Injectable clock for the catalog cache; defaults to Date.now. */
|
|
13
|
+
now?: () => number;
|
|
14
|
+
/** Keenable endpoint for bc_search fallback; undefined = the public keyless endpoint. */
|
|
15
|
+
keenableURL?: string;
|
|
16
|
+
/** Passed to createFetchTool (DNS lookup / page fetch injection for tests). */
|
|
17
|
+
fetchTool?: FetchToolOptions;
|
|
18
|
+
}
|
|
19
|
+
export declare function createMcpServer(deps: McpServerDeps): McpServer;
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Config } from './config';
|
|
2
|
+
export interface ModelGroup {
|
|
3
|
+
providerId: string;
|
|
4
|
+
providerName: string;
|
|
5
|
+
models: string[];
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function listAllModels(config: Config, env?: NodeJS.ProcessEnv, opts?: {
|
|
9
|
+
fetch?: typeof fetch;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
only?: string;
|
|
12
|
+
keyOverride?: string;
|
|
13
|
+
}): Promise<ModelGroup[]>;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
listAllModels
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-IYR5PYA3.js";
|
|
5
|
+
import "./chunk-HQW4BROS.js";
|
|
6
|
+
import "./chunk-5YJ3ZQVR.js";
|
|
7
|
+
import "./chunk-KPTML72Q.js";
|
|
8
8
|
import {
|
|
9
9
|
loadConfig,
|
|
10
10
|
resolveModel
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RX4UQX43.js";
|
|
12
12
|
import {
|
|
13
13
|
t
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-3WHI4LN3.js";
|
|
15
15
|
|
|
16
16
|
// src/modelsCli.ts
|
|
17
17
|
async function runModelsCommand(args, deps) {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CliArgs } from './args';
|
|
2
|
+
export interface ModelsDeps {
|
|
3
|
+
env: NodeJS.ProcessEnv;
|
|
4
|
+
cwd: string;
|
|
5
|
+
out(line: string): void;
|
|
6
|
+
err(line: string): void;
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* `bccli models [provider|provider/model]`.
|
|
11
|
+
* No argument keeps the old behavior: list the models of the active provider.
|
|
12
|
+
* A provider id (or a full model ref, whose provider part is used) lists exactly
|
|
13
|
+
* that provider, even when it is keyless or comes from the project config.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runModelsCommand(args: CliArgs, deps: ModelsDeps): Promise<number>;
|