@iowarp/clio-coder 0.3.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/CHANGELOG.md +407 -0
- package/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +224 -0
- package/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +798 -0
- package/SECURITY.md +72 -0
- package/assets/clio-coder-logo-128.webp +0 -0
- package/damage-control-rules.yaml +419 -0
- package/dist/acp-UMLFVA3F.js +92 -0
- package/dist/agents-Q4MYPMUW.js +91 -0
- package/dist/auth-O6HYIJ6J.js +521 -0
- package/dist/chunk-262G75JS.js +35 -0
- package/dist/chunk-26BZQOAD.js +1281 -0
- package/dist/chunk-2J63S4SF.js +508 -0
- package/dist/chunk-3DANZDGR.js +717 -0
- package/dist/chunk-4UQA7NCT.js +29 -0
- package/dist/chunk-527KG6XR.js +497 -0
- package/dist/chunk-5LDRNKX2.js +1063 -0
- package/dist/chunk-5N2FG33Q.js +25 -0
- package/dist/chunk-67MTHP2E.js +135 -0
- package/dist/chunk-6CWDTGUC.js +20 -0
- package/dist/chunk-7BHLZB3A.js +2115 -0
- package/dist/chunk-7RBKDI66.js +348 -0
- package/dist/chunk-AMFR5YA3.js +541 -0
- package/dist/chunk-BBUH4VAA.js +1224 -0
- package/dist/chunk-BYEU76JP.js +899 -0
- package/dist/chunk-CLJ5HLUD.js +458 -0
- package/dist/chunk-D5YD55AR.js +116 -0
- package/dist/chunk-DXQNI4PC.js +61 -0
- package/dist/chunk-E3NYWENM.js +1004 -0
- package/dist/chunk-GNGDQYDU.js +34688 -0
- package/dist/chunk-GOTUR54M.js +9 -0
- package/dist/chunk-HBU5MTAM.js +41 -0
- package/dist/chunk-HMYNFFY4.js +28 -0
- package/dist/chunk-JPOWPFCU.js +1010 -0
- package/dist/chunk-JWHCJDCI.js +1215 -0
- package/dist/chunk-KBR4MZZR.js +41 -0
- package/dist/chunk-KKKPTZLM.js +93 -0
- package/dist/chunk-ME6DNWIU.js +66 -0
- package/dist/chunk-NI4DEJMC.js +88 -0
- package/dist/chunk-O4EJEDHO.js +659 -0
- package/dist/chunk-PIDUD6M2.js +31 -0
- package/dist/chunk-PS4PFJQP.js +29459 -0
- package/dist/chunk-QV47YRF4.js +48 -0
- package/dist/chunk-RQDWMVRB.js +279 -0
- package/dist/chunk-TFSSEXL6.js +136 -0
- package/dist/chunk-TKHQ4DGZ.js +8290 -0
- package/dist/chunk-TPOCL34A.js +2876 -0
- package/dist/chunk-UGYAX5YI.js +565 -0
- package/dist/chunk-UHTSULZS.js +461 -0
- package/dist/chunk-UU3R62TT.js +128 -0
- package/dist/chunk-UWIJNAOB.js +3906 -0
- package/dist/chunk-VOO7NYPP.js +914 -0
- package/dist/chunk-VPAWTYLY.js +117 -0
- package/dist/chunk-WD6AJM35.js +1216 -0
- package/dist/chunk-X3BR7HWV.js +115 -0
- package/dist/chunk-X3NE4WVW.js +120 -0
- package/dist/chunk-XNISANGE.js +1395 -0
- package/dist/chunk-XV4ZJ6ZM.js +3177 -0
- package/dist/cli/index.js +236 -0
- package/dist/clio-KIQ5SNDS.js +53 -0
- package/dist/components-JVHMUBEB.js +653 -0
- package/dist/config-ZFCDBMDC.js +372 -0
- package/dist/configure-G4E3A2PG.js +27 -0
- package/dist/context-CDXTP2MP.js +293 -0
- package/dist/context-E3KIFVXI.js +185 -0
- package/dist/context-clear-3F4PLXOS.js +102 -0
- package/dist/context-index-Q7YSYTR3.js +106 -0
- package/dist/docs-YIETIWZI.js +280 -0
- package/dist/doctor-M5HJJZOL.js +61 -0
- package/dist/domains/agents/builtins/architect.md +33 -0
- package/dist/domains/agents/builtins/coder.md +31 -0
- package/dist/domains/agents/builtins/context-bootstrap.md +38 -0
- package/dist/domains/agents/builtins/debugger.md +30 -0
- package/dist/domains/agents/builtins/documenter.md +31 -0
- package/dist/domains/agents/builtins/git-master.md +30 -0
- package/dist/domains/agents/builtins/provenance.md +30 -0
- package/dist/domains/agents/builtins/researcher.md +71 -0
- package/dist/domains/agents/builtins/scout.md +42 -0
- package/dist/domains/agents/builtins/tester.md +31 -0
- package/dist/domains/agents/builtins/verifier.md +30 -0
- package/dist/domains/agents/builtins/wiki-writer.md +41 -0
- package/dist/eval-B3KZZESM.js +2674 -0
- package/dist/evidence-V67CHM35.js +233 -0
- package/dist/evolve-YDZSUQYA.js +518 -0
- package/dist/extensions-SRG7XCAH.js +207 -0
- package/dist/fleet-CA2CRTVG.js +760 -0
- package/dist/fleet-preflight-CLIAX7YR.js +21 -0
- package/dist/init-2OZDJE2D.js +227 -0
- package/dist/memory-3PIQQAKX.js +207 -0
- package/dist/models-DY35XI7Y.js +237 -0
- package/dist/paths-5OMXW7Z4.js +57 -0
- package/dist/preload-KZVHET2B.js +11 -0
- package/dist/reset-PIFYNOS3.js +216 -0
- package/dist/run-3VSPP24F.js +735 -0
- package/dist/share-D36RQCXM.js +241 -0
- package/dist/skills-F2MRLELY.js +445 -0
- package/dist/skills-eval-E2ZTW4PL.js +932 -0
- package/dist/targets-DZMEZAH4.js +977 -0
- package/dist/trace-7NYCUI2J.js +250 -0
- package/dist/uninstall-AD3JWHBB.js +322 -0
- package/dist/upgrade-WYYBKGDY.js +301 -0
- package/dist/usage-ULIDAGFF.js +755 -0
- package/dist/version-ROZ6CZKH.js +16 -0
- package/dist/wiki-generate-PKFIX6OB.js +377 -0
- package/dist/worker/entry.js +1739 -0
- package/docs/README.md +93 -0
- package/docs/acp.md +120 -0
- package/docs/alcf-provider.md +72 -0
- package/docs/architecture.md +172 -0
- package/docs/artifact-versions.md +54 -0
- package/docs/built-in-agents.md +265 -0
- package/docs/capacity-and-scheduling.md +97 -0
- package/docs/commands-and-modes.md +554 -0
- package/docs/config-knobs-audit.md +115 -0
- package/docs/configuration-and-targets.md +812 -0
- package/docs/context-engine.md +236 -0
- package/docs/dispatch-architecture-rationale.md +126 -0
- package/docs/documentation-coverage.md +46 -0
- package/docs/documentation-guide.md +166 -0
- package/docs/environment-variables.md +105 -0
- package/docs/eval-runner.md +205 -0
- package/docs/evals-internal.md +298 -0
- package/docs/evidence-and-memory.md +243 -0
- package/docs/evolution.md +143 -0
- package/docs/exit-codes-and-output.md +74 -0
- package/docs/extensions-and-sharing.md +306 -0
- package/docs/fleet-demo-runbook.md +179 -0
- package/docs/fleet-dispatch.md +591 -0
- package/docs/glossary.md +75 -0
- package/docs/html/agents_blueprint.html +936 -0
- package/docs/html/alcf_blueprint.html +324 -0
- package/docs/html/architecture_blueprint.html +850 -0
- package/docs/html/commands_blueprint.html +794 -0
- package/docs/html/config_knobs_audit_blueprint.html +178 -0
- package/docs/html/configuration_blueprint.html +1080 -0
- package/docs/html/context_blueprint.html +603 -0
- package/docs/html/documentation_blueprint.html +832 -0
- package/docs/html/environment_blueprint.html +404 -0
- package/docs/html/eval_blueprint.html +743 -0
- package/docs/html/evals_internal_blueprint.html +190 -0
- package/docs/html/evolution_blueprint.html +674 -0
- package/docs/html/extensions_blueprint.html +2065 -0
- package/docs/html/fleet_dispatch_blueprint.html +286 -0
- package/docs/html/index.html +919 -0
- package/docs/html/lifecycle_blueprint.html +723 -0
- package/docs/html/memory_blueprint.html +699 -0
- package/docs/html/middleware_blueprint.html +664 -0
- package/docs/html/models_blueprint.html +2366 -0
- package/docs/html/observability_blueprint.html +683 -0
- package/docs/html/provider_adapter_blueprint.html +245 -0
- package/docs/html/safety_blueprint.html +1386 -0
- package/docs/html/shared.css +571 -0
- package/docs/html/shared.js +143 -0
- package/docs/html/skills_blueprint.html +671 -0
- package/docs/html/soak_blueprint.html +182 -0
- package/docs/html/tool_usage_blueprint.html +350 -0
- package/docs/html/tools_blueprint.html +2249 -0
- package/docs/html/trace_blueprint.html +235 -0
- package/docs/html/tui_design_blueprint.html +314 -0
- package/docs/html/validation_blueprint.html +961 -0
- package/docs/html/worker_dispatch_blueprint.html +231 -0
- package/docs/installation-and-lifecycle.md +308 -0
- package/docs/middleware-and-components.md +148 -0
- package/docs/model-catalog.md +189 -0
- package/docs/observability.md +233 -0
- package/docs/proactive-memory.md +452 -0
- package/docs/prompt-envelope-and-tools.md +142 -0
- package/docs/provider-adapter-cookbook.md +148 -0
- package/docs/release-cut-checklist.md +138 -0
- package/docs/safety-model.md +357 -0
- package/docs/scientific-validation.md +105 -0
- package/docs/session-lifecycle.md +156 -0
- package/docs/skills-marketplace.md +46 -0
- package/docs/tool-usage.md +527 -0
- package/docs/trace-store.md +132 -0
- package/docs/troubleshooting.md +33 -0
- package/docs/tui-design.md +239 -0
- package/docs/worker-dispatch-mechanics.md +242 -0
- package/package.json +132 -0
- package/skills/README.md +408 -0
- package/skills/git/commit-crafting/SKILL.md +79 -0
- package/skills/git/commit-crafting/evals.md +92 -0
- package/skills/git/create-pr/SKILL.md +116 -0
- package/skills/git/create-pr/evals.md +114 -0
- package/skills/git/investigate-issue/SKILL.md +139 -0
- package/skills/git/investigate-issue/evals.md +94 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +96 -0
- package/skills/git/resolve-merge-conflicts/evals.md +58 -0
- package/skills/git/review-changes/SKILL.md +103 -0
- package/skills/git/review-changes/evals.md +85 -0
- package/skills/git/worktree-create/SKILL.md +92 -0
- package/skills/git/worktree-create/evals.md +97 -0
- package/skills/git/worktree-create/references/worktree-setup.md +66 -0
- package/skills/git/worktree-merge/SKILL.md +95 -0
- package/skills/git/worktree-merge/evals.md +114 -0
- package/skills/skill-marketplace.json +261 -0
- package/skills/workflow/cut-it/SKILL.md +86 -0
- package/skills/workflow/cut-it/evals.md +42 -0
- package/src/domains/agents/builtins/architect.md +33 -0
- package/src/domains/agents/builtins/coder.md +31 -0
- package/src/domains/agents/builtins/context-bootstrap.md +38 -0
- package/src/domains/agents/builtins/debugger.md +30 -0
- package/src/domains/agents/builtins/documenter.md +31 -0
- package/src/domains/agents/builtins/git-master.md +30 -0
- package/src/domains/agents/builtins/provenance.md +30 -0
- package/src/domains/agents/builtins/researcher.md +71 -0
- package/src/domains/agents/builtins/scout.md +42 -0
- package/src/domains/agents/builtins/tester.md +31 -0
- package/src/domains/agents/builtins/verifier.md +30 -0
- package/src/domains/agents/builtins/wiki-writer.md +41 -0
- package/src/domains/agents/fleets/build-review.md +34 -0
- package/src/domains/agents/fleets/build-test.md +35 -0
- package/src/domains/agents/fleets/sdlc.md +86 -0
- package/src/domains/prompts/fragments/identity/clio-worker.md +11 -0
- package/src/domains/prompts/fragments/identity/clio.md +26 -0
- package/src/domains/prompts/fragments/operating/contract.md +64 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +14 -0
- package/src/domains/prompts/fragments/safety/full-auto.md +14 -0
- package/src/domains/prompts/fragments/safety/read-only.md +13 -0
- package/src/domains/prompts/fragments/safety/suggest.md +13 -0
- package/src/domains/prompts/fragments/wiki/page.md +75 -0
- package/src/domains/prompts/fragments/wiki/plan.md +48 -0
- package/src/domains/providers/models/cloud-models/alcf.yaml +40 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +993 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createDelayedManualCodeInput,
|
|
3
|
+
promptOAuthSelection
|
|
4
|
+
} from "./chunk-KKKPTZLM.js";
|
|
5
|
+
import {
|
|
6
|
+
terminalColumns,
|
|
7
|
+
wrapPlain
|
|
8
|
+
} from "./chunk-ME6DNWIU.js";
|
|
9
|
+
import {
|
|
10
|
+
credentialWriteFailed,
|
|
11
|
+
printPlaintextCredentialWarning
|
|
12
|
+
} from "./chunk-PIDUD6M2.js";
|
|
13
|
+
import {
|
|
14
|
+
columnWidths,
|
|
15
|
+
formatColumnRow,
|
|
16
|
+
formatColumns,
|
|
17
|
+
printError,
|
|
18
|
+
printOk
|
|
19
|
+
} from "./chunk-67MTHP2E.js";
|
|
20
|
+
import {
|
|
21
|
+
EMPTY_CAPABILITIES,
|
|
22
|
+
getRuntimeRegistry,
|
|
23
|
+
listProviderSupportEntries,
|
|
24
|
+
registerBuiltinRuntimes,
|
|
25
|
+
resolveProviderReference,
|
|
26
|
+
supportGroupLabel
|
|
27
|
+
} from "./chunk-TKHQ4DGZ.js";
|
|
28
|
+
import "./chunk-D5YD55AR.js";
|
|
29
|
+
import {
|
|
30
|
+
readSettings
|
|
31
|
+
} from "./chunk-JWHCJDCI.js";
|
|
32
|
+
import "./chunk-UHTSULZS.js";
|
|
33
|
+
import {
|
|
34
|
+
authNotRequiredStatus,
|
|
35
|
+
openAuthStorage,
|
|
36
|
+
registerClioOAuthProviders,
|
|
37
|
+
resolveRuntimeAuthTarget,
|
|
38
|
+
targetRequiresAuth
|
|
39
|
+
} from "./chunk-5LDRNKX2.js";
|
|
40
|
+
import "./chunk-UGYAX5YI.js";
|
|
41
|
+
import "./chunk-5N2FG33Q.js";
|
|
42
|
+
import "./chunk-VPAWTYLY.js";
|
|
43
|
+
import "./chunk-X3NE4WVW.js";
|
|
44
|
+
import "./chunk-DXQNI4PC.js";
|
|
45
|
+
|
|
46
|
+
// src/cli/auth.ts
|
|
47
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
48
|
+
import { createInterface } from "node:readline/promises";
|
|
49
|
+
|
|
50
|
+
// src/cli/provider-target.ts
|
|
51
|
+
var CONNECTABLE_LIST_CAPTION = "runtimes clio authenticates itself. run `clio-coder configure --list` for every registered runtime, including those that authenticate through their own tool or need no credential.";
|
|
52
|
+
function ensureSetupRuntimeRegistry() {
|
|
53
|
+
registerClioOAuthProviders();
|
|
54
|
+
const registry = getRuntimeRegistry();
|
|
55
|
+
if (registry.list().length === 0) registerBuiltinRuntimes(registry);
|
|
56
|
+
}
|
|
57
|
+
function resolveCliProviderReference(input2) {
|
|
58
|
+
ensureSetupRuntimeRegistry();
|
|
59
|
+
const resolved = resolveProviderReference(input2, readSettings(), (runtimeId) => getRuntimeRegistry().get(runtimeId));
|
|
60
|
+
if (resolved) return resolved;
|
|
61
|
+
const oauthProvider = openAuthStorage().getOAuthProviders().find((provider) => provider.id === input2);
|
|
62
|
+
if (!oauthProvider) return null;
|
|
63
|
+
return {
|
|
64
|
+
input: input2,
|
|
65
|
+
target: null,
|
|
66
|
+
runtime: {
|
|
67
|
+
id: oauthProvider.id,
|
|
68
|
+
displayName: oauthProvider.name,
|
|
69
|
+
kind: "http",
|
|
70
|
+
apiFamily: "openai-codex-responses",
|
|
71
|
+
auth: "oauth",
|
|
72
|
+
defaultCapabilities: EMPTY_CAPABILITIES,
|
|
73
|
+
synthesizeModel: () => {
|
|
74
|
+
throw new Error(`runtime ${oauthProvider.id} is auth-only in this context`);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
authTarget: {
|
|
78
|
+
providerId: oauthProvider.id,
|
|
79
|
+
runtimeAuth: "oauth"
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function listConnectableProviderRows() {
|
|
84
|
+
ensureSetupRuntimeRegistry();
|
|
85
|
+
const settings = readSettings();
|
|
86
|
+
const auth = openAuthStorage();
|
|
87
|
+
return listProviderSupportEntries(getRuntimeRegistry().list()).filter((entry) => entry.connectable).map((entry) => {
|
|
88
|
+
const runtime = getRuntimeRegistry().get(entry.runtimeId);
|
|
89
|
+
const status = runtime ? auth.statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false }) : null;
|
|
90
|
+
return {
|
|
91
|
+
entry,
|
|
92
|
+
status,
|
|
93
|
+
targetCount: settings.targets.filter((target) => target.runtime === entry.runtimeId).length
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function renderConnectableProviderRows(rows) {
|
|
98
|
+
let lastGroup = null;
|
|
99
|
+
const lines = [];
|
|
100
|
+
const renderedRows = rows.map((row) => {
|
|
101
|
+
const status = row.status?.available ? row.status.source === "environment" ? `env${row.status.detail ? `:${row.status.detail}` : ""}` : row.status.source : "disconnected";
|
|
102
|
+
return {
|
|
103
|
+
group: row.entry.group,
|
|
104
|
+
cells: [row.entry.runtimeId, row.entry.label, status, `targets=${row.targetCount}`]
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
const widths = columnWidths(renderedRows.map((row) => row.cells));
|
|
108
|
+
for (const row of renderedRows) {
|
|
109
|
+
if (row.group !== lastGroup) {
|
|
110
|
+
lastGroup = row.group;
|
|
111
|
+
lines.push(`${supportGroupLabel(row.group)}:`);
|
|
112
|
+
}
|
|
113
|
+
lines.push(` ${formatColumnRow(row.cells, widths)}`);
|
|
114
|
+
}
|
|
115
|
+
return `${lines.join("\n")}
|
|
116
|
+
`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/cli/auth.ts
|
|
120
|
+
var USAGE = `usage: clio-coder auth list
|
|
121
|
+
clio-coder auth status [target-or-runtime]
|
|
122
|
+
clio-coder auth login [target-or-runtime] [--api-key <value>]
|
|
123
|
+
clio-coder auth logout [target-or-runtime]
|
|
124
|
+
`;
|
|
125
|
+
function parseAuthTargetArgs(args, verb) {
|
|
126
|
+
const parsed = { help: false };
|
|
127
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
128
|
+
const arg = args[i];
|
|
129
|
+
if (arg === void 0) continue;
|
|
130
|
+
if (arg === "--help" || arg === "-h") {
|
|
131
|
+
parsed.help = true;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (arg === "--api-key") {
|
|
135
|
+
const value = args[i + 1];
|
|
136
|
+
if (!value) throw new Error("--api-key requires a value");
|
|
137
|
+
parsed.apiKey = value;
|
|
138
|
+
i += 1;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (arg.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
142
|
+
if (parsed.target) throw new Error(`auth ${verb} accepts at most one target or runtime`);
|
|
143
|
+
parsed.target = arg;
|
|
144
|
+
}
|
|
145
|
+
return parsed;
|
|
146
|
+
}
|
|
147
|
+
function printConnectableListing(rows) {
|
|
148
|
+
process.stdout.write(renderConnectableProviderRows(rows));
|
|
149
|
+
for (const line of wrapPlain(CONNECTABLE_LIST_CAPTION, terminalColumns())) {
|
|
150
|
+
process.stdout.write(`${line}
|
|
151
|
+
`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function printStatusLine(id, label, type, present, source) {
|
|
155
|
+
process.stdout.write(formatColumns([[id, label, type ?? "-", present ? "present" : "absent", source]]));
|
|
156
|
+
}
|
|
157
|
+
function warnIfCredentialsDamaged(auth) {
|
|
158
|
+
const damage = auth.damageReason();
|
|
159
|
+
if (damage === null) return;
|
|
160
|
+
process.stderr.write(`warning: the credentials file could not be fully read: ${damage}
|
|
161
|
+
`);
|
|
162
|
+
process.stderr.write("warning: entries below may be understated. Nothing will be written until it is repaired.\n");
|
|
163
|
+
}
|
|
164
|
+
function renderStatusRows(rows) {
|
|
165
|
+
return formatColumns(
|
|
166
|
+
rows.map((row) => {
|
|
167
|
+
const status = row.status;
|
|
168
|
+
if (status === null) {
|
|
169
|
+
return [row.entry.runtimeId, row.entry.label, "-", "unknown", "no auth probe available"];
|
|
170
|
+
}
|
|
171
|
+
return [
|
|
172
|
+
row.entry.runtimeId,
|
|
173
|
+
row.entry.label,
|
|
174
|
+
status.credentialType ?? "-",
|
|
175
|
+
status.available ? "present" : "absent",
|
|
176
|
+
status.detail ?? status.source
|
|
177
|
+
];
|
|
178
|
+
})
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
function defaultAuthTarget(rows) {
|
|
182
|
+
const settings = readSettings();
|
|
183
|
+
const activeTarget = settings.orchestrator.target ? settings.targets.find((entry) => entry.id === settings.orchestrator.target) : void 0;
|
|
184
|
+
if (activeTarget && rows.some((row) => row.entry.runtimeId === activeTarget.runtime)) {
|
|
185
|
+
return activeTarget.runtime;
|
|
186
|
+
}
|
|
187
|
+
const configured = rows.find((row) => row.targetCount > 0);
|
|
188
|
+
if (configured) return configured.entry.runtimeId;
|
|
189
|
+
return rows[0]?.entry.runtimeId;
|
|
190
|
+
}
|
|
191
|
+
async function promptForLoginTarget(rows) {
|
|
192
|
+
if (rows.length === 0) {
|
|
193
|
+
printError("no auth-capable runtimes are registered");
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const rl = createInterface({ input, output });
|
|
197
|
+
const defaultTarget = defaultAuthTarget(rows) ?? rows[0]?.entry.runtimeId ?? "";
|
|
198
|
+
try {
|
|
199
|
+
process.stdout.write("Authenticate a runtime:\n");
|
|
200
|
+
let lastGroup = null;
|
|
201
|
+
for (const [index, row] of rows.entries()) {
|
|
202
|
+
if (row.entry.group !== lastGroup) {
|
|
203
|
+
lastGroup = row.entry.group;
|
|
204
|
+
process.stdout.write(` ${supportGroupLabel(row.entry.group)}:
|
|
205
|
+
`);
|
|
206
|
+
}
|
|
207
|
+
const status = row.status?.available ? row.status.source === "environment" ? `env:${row.status.detail ?? row.entry.runtimeId}` : row.status.source : row.status === null ? "native-cli" : "disconnected";
|
|
208
|
+
process.stdout.write(
|
|
209
|
+
` ${String(index + 1).padStart(2)}. ${row.entry.runtimeId.padEnd(22)} ${status.padEnd(18)} targets=${row.targetCount}
|
|
210
|
+
`
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
for (const line of wrapPlain(CONNECTABLE_LIST_CAPTION, terminalColumns())) {
|
|
214
|
+
process.stdout.write(`${line}
|
|
215
|
+
`);
|
|
216
|
+
}
|
|
217
|
+
process.stdout.write("\n");
|
|
218
|
+
for (; ; ) {
|
|
219
|
+
const answer = (await rl.question(`Selection (number or runtime id) [${defaultTarget}]: `)).trim();
|
|
220
|
+
const value = answer.length > 0 ? answer : defaultTarget;
|
|
221
|
+
const numeric = Number(value);
|
|
222
|
+
if (Number.isInteger(numeric) && numeric >= 1 && numeric <= rows.length) {
|
|
223
|
+
return rows[numeric - 1]?.entry.runtimeId ?? null;
|
|
224
|
+
}
|
|
225
|
+
if (rows.some((row) => row.entry.runtimeId === value)) return value;
|
|
226
|
+
process.stderr.write(`unknown selection: ${value}
|
|
227
|
+
`);
|
|
228
|
+
}
|
|
229
|
+
} catch {
|
|
230
|
+
return null;
|
|
231
|
+
} finally {
|
|
232
|
+
rl.close();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function storedCredentialRows(rows) {
|
|
236
|
+
return rows.filter((row) => row.status?.source === "stored-api-key" || row.status?.source === "stored-oauth");
|
|
237
|
+
}
|
|
238
|
+
function statusForResolvedTarget(resolved, auth) {
|
|
239
|
+
if (resolved.target && !targetRequiresAuth(resolved.target, resolved.runtime)) {
|
|
240
|
+
return authNotRequiredStatus(resolved.authTarget.providerId);
|
|
241
|
+
}
|
|
242
|
+
if (!resolved.target && resolved.runtime.auth !== "api-key" && resolved.runtime.auth !== "oauth") {
|
|
243
|
+
return authNotRequiredStatus(resolved.authTarget.providerId);
|
|
244
|
+
}
|
|
245
|
+
return auth.statusForTarget(resolved.authTarget, { includeFallback: false });
|
|
246
|
+
}
|
|
247
|
+
async function promptForLogoutTarget(rows) {
|
|
248
|
+
if (rows.length === 0) {
|
|
249
|
+
printError("no stored target credentials");
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
const rl = createInterface({ input, output });
|
|
253
|
+
const defaultTarget = defaultAuthTarget(rows) ?? rows[0]?.entry.runtimeId ?? "";
|
|
254
|
+
try {
|
|
255
|
+
process.stdout.write("Remove stored credentials:\n");
|
|
256
|
+
let lastGroup = null;
|
|
257
|
+
for (const [index, row] of rows.entries()) {
|
|
258
|
+
if (row.entry.group !== lastGroup) {
|
|
259
|
+
lastGroup = row.entry.group;
|
|
260
|
+
process.stdout.write(` ${supportGroupLabel(row.entry.group)}:
|
|
261
|
+
`);
|
|
262
|
+
}
|
|
263
|
+
process.stdout.write(
|
|
264
|
+
` ${String(index + 1).padStart(2)}. ${row.entry.runtimeId.padEnd(22)} ${String(row.status?.source ?? "disconnected")}
|
|
265
|
+
`
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
process.stdout.write("\n");
|
|
269
|
+
for (; ; ) {
|
|
270
|
+
const answer = (await rl.question(`Selection (number or runtime id) [${defaultTarget}]: `)).trim();
|
|
271
|
+
const value = answer.length > 0 ? answer : defaultTarget;
|
|
272
|
+
const numeric = Number(value);
|
|
273
|
+
if (Number.isInteger(numeric) && numeric >= 1 && numeric <= rows.length) {
|
|
274
|
+
return rows[numeric - 1]?.entry.runtimeId ?? null;
|
|
275
|
+
}
|
|
276
|
+
if (rows.some((row) => row.entry.runtimeId === value)) return value;
|
|
277
|
+
process.stderr.write(`unknown selection: ${value}
|
|
278
|
+
`);
|
|
279
|
+
}
|
|
280
|
+
} catch {
|
|
281
|
+
return null;
|
|
282
|
+
} finally {
|
|
283
|
+
rl.close();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
async function runLogin(args) {
|
|
287
|
+
let parsed;
|
|
288
|
+
try {
|
|
289
|
+
parsed = parseAuthTargetArgs(args, "login");
|
|
290
|
+
} catch (error) {
|
|
291
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
292
|
+
process.stderr.write(USAGE);
|
|
293
|
+
return 2;
|
|
294
|
+
}
|
|
295
|
+
if (parsed.help) {
|
|
296
|
+
process.stdout.write(USAGE);
|
|
297
|
+
return 0;
|
|
298
|
+
}
|
|
299
|
+
if (!parsed.target) {
|
|
300
|
+
if (!input.isTTY || !output.isTTY) {
|
|
301
|
+
printConnectableListing(listConnectableProviderRows());
|
|
302
|
+
process.stderr.write(USAGE);
|
|
303
|
+
return 2;
|
|
304
|
+
}
|
|
305
|
+
const picked = await promptForLoginTarget(listConnectableProviderRows());
|
|
306
|
+
if (!picked) return 0;
|
|
307
|
+
parsed.target = picked;
|
|
308
|
+
}
|
|
309
|
+
const resolved = resolveCliProviderReference(parsed.target);
|
|
310
|
+
if (!resolved) {
|
|
311
|
+
printError(`unknown target or runtime: ${parsed.target}`);
|
|
312
|
+
process.stderr.write(USAGE);
|
|
313
|
+
return 2;
|
|
314
|
+
}
|
|
315
|
+
const auth = openAuthStorage();
|
|
316
|
+
if (resolved.runtime.authNotice) process.stdout.write(`note: ${resolved.runtime.authNotice}
|
|
317
|
+
`);
|
|
318
|
+
if (resolved.runtime.auth === "oauth") {
|
|
319
|
+
const rl2 = createInterface({ input, output });
|
|
320
|
+
const manualCodeInput = createDelayedManualCodeInput(
|
|
321
|
+
rl2,
|
|
322
|
+
"Paste verification code if the browser flow does not return automatically: "
|
|
323
|
+
);
|
|
324
|
+
try {
|
|
325
|
+
await auth.login(resolved.authTarget.providerId, {
|
|
326
|
+
onAuth: ({ url, instructions }) => {
|
|
327
|
+
process.stdout.write(`${url}
|
|
328
|
+
`);
|
|
329
|
+
if (instructions) process.stdout.write(`${instructions}
|
|
330
|
+
`);
|
|
331
|
+
process.stdout.write("Waiting for the browser callback. A manual code prompt will appear if needed.\n");
|
|
332
|
+
},
|
|
333
|
+
onDeviceCode: ({ verificationUri, userCode }) => {
|
|
334
|
+
process.stdout.write(`${verificationUri}
|
|
335
|
+
`);
|
|
336
|
+
process.stdout.write(`Enter code: ${userCode}
|
|
337
|
+
`);
|
|
338
|
+
},
|
|
339
|
+
onPrompt: async (prompt) => {
|
|
340
|
+
const answer = await rl2.question(`${prompt.message}${prompt.allowEmpty ? " " : ": "}`);
|
|
341
|
+
return prompt.allowEmpty ? answer : answer.trim();
|
|
342
|
+
},
|
|
343
|
+
onSelect: (prompt) => promptOAuthSelection(rl2, prompt),
|
|
344
|
+
onManualCodeInput: manualCodeInput.onManualCodeInput,
|
|
345
|
+
onProgress: (message) => {
|
|
346
|
+
process.stderr.write(`${message}
|
|
347
|
+
`);
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
if (credentialWriteFailed(auth, `credential for ${resolved.authTarget.providerId} was not stored`)) return 1;
|
|
351
|
+
printOk(`authenticated ${resolved.authTarget.providerId}`);
|
|
352
|
+
return 0;
|
|
353
|
+
} catch (error) {
|
|
354
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
355
|
+
return 1;
|
|
356
|
+
} finally {
|
|
357
|
+
manualCodeInput.cancel();
|
|
358
|
+
rl2.close();
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (resolved.runtime.auth !== "api-key") {
|
|
362
|
+
printError(`runtime ${resolved.runtime.id} does not support interactive auth login`);
|
|
363
|
+
process.stderr.write(
|
|
364
|
+
` it authenticates as '${resolved.runtime.auth}', outside clio: \`clio-coder auth status ${resolved.runtime.id}\` reports its state, and \`clio-coder configure --list\` shows how it is registered
|
|
365
|
+
`
|
|
366
|
+
);
|
|
367
|
+
return 1;
|
|
368
|
+
}
|
|
369
|
+
let apiKey = parsed.apiKey;
|
|
370
|
+
const rl = createInterface({ input, output });
|
|
371
|
+
try {
|
|
372
|
+
if (!apiKey) {
|
|
373
|
+
apiKey = (await rl.question(`API key for ${resolved.runtime.displayName}: `)).trim();
|
|
374
|
+
}
|
|
375
|
+
if (!apiKey) {
|
|
376
|
+
printError("empty API key");
|
|
377
|
+
return 1;
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
auth.setApiKey(resolved.authTarget.providerId, apiKey);
|
|
381
|
+
} catch (error) {
|
|
382
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
383
|
+
return 1;
|
|
384
|
+
}
|
|
385
|
+
if (credentialWriteFailed(auth, `credential for ${resolved.authTarget.providerId} was not stored`)) return 1;
|
|
386
|
+
printOk(`authenticated ${resolved.authTarget.providerId}`);
|
|
387
|
+
printPlaintextCredentialWarning();
|
|
388
|
+
return 0;
|
|
389
|
+
} finally {
|
|
390
|
+
rl.close();
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async function runStatus(args) {
|
|
394
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
395
|
+
process.stdout.write(USAGE);
|
|
396
|
+
return 0;
|
|
397
|
+
}
|
|
398
|
+
if (args.some((arg) => arg.startsWith("-"))) {
|
|
399
|
+
printError(`unknown flag: ${args.find((arg) => arg.startsWith("-"))}`);
|
|
400
|
+
process.stderr.write(USAGE);
|
|
401
|
+
return 2;
|
|
402
|
+
}
|
|
403
|
+
if (args.length > 1) {
|
|
404
|
+
printError("auth status accepts at most one target or runtime");
|
|
405
|
+
process.stderr.write(USAGE);
|
|
406
|
+
return 2;
|
|
407
|
+
}
|
|
408
|
+
const auth = openAuthStorage();
|
|
409
|
+
warnIfCredentialsDamaged(auth);
|
|
410
|
+
const target = args[0];
|
|
411
|
+
if (target) {
|
|
412
|
+
const resolved = resolveCliProviderReference(target);
|
|
413
|
+
if (!resolved) {
|
|
414
|
+
printError(`unknown target or runtime: ${target}`);
|
|
415
|
+
return 2;
|
|
416
|
+
}
|
|
417
|
+
const status = statusForResolvedTarget(resolved, auth);
|
|
418
|
+
printStatusLine(
|
|
419
|
+
resolved.authTarget.providerId,
|
|
420
|
+
resolved.runtime.displayName,
|
|
421
|
+
status.credentialType,
|
|
422
|
+
status.available,
|
|
423
|
+
status.detail ?? status.source
|
|
424
|
+
);
|
|
425
|
+
return status.available ? 0 : 1;
|
|
426
|
+
}
|
|
427
|
+
process.stdout.write(renderStatusRows(listConnectableProviderRows()));
|
|
428
|
+
return 0;
|
|
429
|
+
}
|
|
430
|
+
function runLogout(args) {
|
|
431
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
432
|
+
process.stdout.write(USAGE);
|
|
433
|
+
return 0;
|
|
434
|
+
}
|
|
435
|
+
if (args.some((arg) => arg.startsWith("-"))) {
|
|
436
|
+
printError(`unknown flag: ${args.find((arg) => arg.startsWith("-"))}`);
|
|
437
|
+
process.stderr.write(USAGE);
|
|
438
|
+
return 2;
|
|
439
|
+
}
|
|
440
|
+
const target = args[0];
|
|
441
|
+
if (!target) {
|
|
442
|
+
const rows = storedCredentialRows(listConnectableProviderRows());
|
|
443
|
+
if (!input.isTTY || !output.isTTY) {
|
|
444
|
+
process.stdout.write(renderConnectableProviderRows(rows));
|
|
445
|
+
process.stderr.write(USAGE);
|
|
446
|
+
return 2;
|
|
447
|
+
}
|
|
448
|
+
return promptForLogoutTarget(rows).then((picked) => picked ? runLogout([picked]) : 1);
|
|
449
|
+
}
|
|
450
|
+
if (args.length > 1) {
|
|
451
|
+
printError("auth logout accepts at most one target or runtime");
|
|
452
|
+
process.stderr.write(USAGE);
|
|
453
|
+
return 2;
|
|
454
|
+
}
|
|
455
|
+
const resolved = resolveCliProviderReference(target);
|
|
456
|
+
if (!resolved) {
|
|
457
|
+
printError(`unknown target or runtime: ${target}`);
|
|
458
|
+
process.stderr.write(USAGE);
|
|
459
|
+
return 2;
|
|
460
|
+
}
|
|
461
|
+
const auth = openAuthStorage();
|
|
462
|
+
warnIfCredentialsDamaged(auth);
|
|
463
|
+
const status = statusForResolvedTarget(resolved, auth);
|
|
464
|
+
if (!status.available) {
|
|
465
|
+
printError(
|
|
466
|
+
auth.damageReason() === null ? `no stored credential for ${resolved.authTarget.providerId}` : `cannot tell whether ${resolved.authTarget.providerId} is stored: the credentials file could not be fully read`
|
|
467
|
+
);
|
|
468
|
+
return 1;
|
|
469
|
+
}
|
|
470
|
+
if (status.source === "environment") {
|
|
471
|
+
printError(
|
|
472
|
+
`credential for ${resolved.authTarget.providerId} comes from ${status.detail ?? "the environment"}; clear the env var to log out`
|
|
473
|
+
);
|
|
474
|
+
return 1;
|
|
475
|
+
}
|
|
476
|
+
if (status.source !== "stored-api-key" && status.source !== "stored-oauth") {
|
|
477
|
+
printError(`cannot remove credential for ${resolved.authTarget.providerId} from source ${status.source}`);
|
|
478
|
+
return 1;
|
|
479
|
+
}
|
|
480
|
+
try {
|
|
481
|
+
auth.logout(resolved.authTarget.providerId);
|
|
482
|
+
} catch (error) {
|
|
483
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
484
|
+
return 1;
|
|
485
|
+
}
|
|
486
|
+
if (credentialWriteFailed(auth, `credential for ${resolved.authTarget.providerId} was not removed`)) return 1;
|
|
487
|
+
printOk(`removed credential for ${resolved.authTarget.providerId}`);
|
|
488
|
+
return 0;
|
|
489
|
+
}
|
|
490
|
+
async function runAuthCommand(args) {
|
|
491
|
+
const subcommand = args[0] ?? "status";
|
|
492
|
+
const rest = args.slice(1);
|
|
493
|
+
if (subcommand === "list") {
|
|
494
|
+
if (rest.includes("--help") || rest.includes("-h")) {
|
|
495
|
+
process.stdout.write(USAGE);
|
|
496
|
+
return 0;
|
|
497
|
+
}
|
|
498
|
+
if (rest.length > 0 && rest.some((arg) => arg !== "--help" && arg !== "-h")) {
|
|
499
|
+
printError("auth list does not accept target arguments");
|
|
500
|
+
process.stderr.write(USAGE);
|
|
501
|
+
return 2;
|
|
502
|
+
}
|
|
503
|
+
warnIfCredentialsDamaged(openAuthStorage());
|
|
504
|
+
printConnectableListing(listConnectableProviderRows());
|
|
505
|
+
return 0;
|
|
506
|
+
}
|
|
507
|
+
if (subcommand === "status") return runStatus(rest);
|
|
508
|
+
if (subcommand === "login") return runLogin(rest);
|
|
509
|
+
if (subcommand === "logout") return runLogout(rest);
|
|
510
|
+
if (subcommand === "--help" || subcommand === "-h") {
|
|
511
|
+
process.stdout.write(USAGE);
|
|
512
|
+
return 0;
|
|
513
|
+
}
|
|
514
|
+
printError(`unknown auth subcommand: ${subcommand}`);
|
|
515
|
+
process.stderr.write(USAGE);
|
|
516
|
+
return 2;
|
|
517
|
+
}
|
|
518
|
+
export {
|
|
519
|
+
runAuthCommand
|
|
520
|
+
};
|
|
521
|
+
//# sourceMappingURL=auth-O6HYIJ6J.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/domains/providers/probe/fingerprint.ts
|
|
2
|
+
async function fetchWithTimeout(url, timeoutMs) {
|
|
3
|
+
const controller = new AbortController();
|
|
4
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
5
|
+
try {
|
|
6
|
+
return await fetch(url, { signal: controller.signal });
|
|
7
|
+
} catch {
|
|
8
|
+
return null;
|
|
9
|
+
} finally {
|
|
10
|
+
clearTimeout(timer);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function fingerprintNativeRuntime(baseUrl) {
|
|
14
|
+
const trimmed = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
|
|
15
|
+
const lmStudioV1 = await fetchWithTimeout(`${trimmed}/api/v1/models`, 750);
|
|
16
|
+
if (lmStudioV1?.ok) return { runtimeId: "lmstudio-native", displayName: "LM Studio" };
|
|
17
|
+
const lmStudioV0 = await fetchWithTimeout(`${trimmed}/api/v0/models`, 750);
|
|
18
|
+
if (lmStudioV0?.ok) return { runtimeId: "lmstudio-native", displayName: "LM Studio" };
|
|
19
|
+
const ollama = await fetchWithTimeout(`${trimmed}/api/version`, 750);
|
|
20
|
+
if (ollama?.ok) {
|
|
21
|
+
try {
|
|
22
|
+
const data = await ollama.json();
|
|
23
|
+
if (typeof data.version === "string") {
|
|
24
|
+
return { runtimeId: "ollama-native", displayName: "Ollama" };
|
|
25
|
+
}
|
|
26
|
+
} catch {
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
fingerprintNativeRuntime
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-262G75JS.js.map
|