@keel_flow/setup 0.2.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 +21 -0
- package/dist/encryption-key.d.ts +19 -0
- package/dist/encryption-key.d.ts.map +1 -0
- package/dist/encryption-key.js +52 -0
- package/dist/encryption-key.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/key-specs.d.ts +25 -0
- package/dist/key-specs.d.ts.map +1 -0
- package/dist/key-specs.js +204 -0
- package/dist/key-specs.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/walkthrough.d.ts +14 -0
- package/dist/walkthrough.d.ts.map +1 -0
- package/dist/walkthrough.js +59 -0
- package/dist/walkthrough.js.map +1 -0
- package/package.json +43 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 jglasskatz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface EncryptionKeyStatus {
|
|
2
|
+
source: "env" | "file" | "generated" | "missing";
|
|
3
|
+
path?: string;
|
|
4
|
+
warning?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function readEncryptionKey(opts?: {
|
|
7
|
+
keyFile?: string;
|
|
8
|
+
}): {
|
|
9
|
+
hex: string;
|
|
10
|
+
status: EncryptionKeyStatus;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function ensureEncryptionKey(opts?: {
|
|
13
|
+
keyFile?: string;
|
|
14
|
+
}): {
|
|
15
|
+
hex: string;
|
|
16
|
+
status: EncryptionKeyStatus;
|
|
17
|
+
};
|
|
18
|
+
export declare function maskKey(value: string): string;
|
|
19
|
+
//# sourceMappingURL=encryption-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption-key.d.ts","sourceRoot":"","sources":["../src/encryption-key.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,mBAAmB,CAAC;CAC7B,GAAG,IAAI,CAgBP;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAwBA;AAMD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { randomBytes } from "crypto";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, chmodSync, mkdirSync } from "fs";
|
|
3
|
+
import { join, dirname } from "path";
|
|
4
|
+
const HEX_PATTERN = /^[0-9a-fA-F]{64}$/;
|
|
5
|
+
export function readEncryptionKey(opts = {}) {
|
|
6
|
+
const envKey = process.env["KEEL_TOKEN_ENCRYPTION_KEY"];
|
|
7
|
+
if (envKey && HEX_PATTERN.test(envKey)) {
|
|
8
|
+
return { hex: envKey, status: { source: "env" } };
|
|
9
|
+
}
|
|
10
|
+
const keyFile = opts.keyFile ?? defaultKeyFilePath();
|
|
11
|
+
if (existsSync(keyFile)) {
|
|
12
|
+
const onDisk = readFileSync(keyFile, "utf-8").trim();
|
|
13
|
+
if (HEX_PATTERN.test(onDisk)) {
|
|
14
|
+
return { hex: onDisk, status: { source: "file", path: keyFile } };
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function ensureEncryptionKey(opts = {}) {
|
|
21
|
+
const existing = readEncryptionKey(opts);
|
|
22
|
+
if (existing)
|
|
23
|
+
return existing;
|
|
24
|
+
const keyFile = opts.keyFile ?? defaultKeyFilePath();
|
|
25
|
+
mkdirSync(dirname(keyFile), { recursive: true });
|
|
26
|
+
const hex = randomBytes(32).toString("hex");
|
|
27
|
+
writeFileSync(keyFile, hex + "\n", { mode: 0o600 });
|
|
28
|
+
try {
|
|
29
|
+
chmodSync(keyFile, 0o600);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// best effort on platforms without POSIX mode
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
hex,
|
|
36
|
+
status: {
|
|
37
|
+
source: "generated",
|
|
38
|
+
path: keyFile,
|
|
39
|
+
warning: `Generated a new 32-byte encryption key at ${keyFile}. ` +
|
|
40
|
+
"BACK THIS UP OFF-MACHINE — losing it makes every stored secret unrecoverable.",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function defaultKeyFilePath() {
|
|
45
|
+
return join(process.cwd(), ".keel", "encryption-key");
|
|
46
|
+
}
|
|
47
|
+
export function maskKey(value) {
|
|
48
|
+
if (value.length <= 8)
|
|
49
|
+
return "•".repeat(value.length);
|
|
50
|
+
return value.slice(0, 3) + "•".repeat(Math.max(4, value.length - 7)) + value.slice(-4);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=encryption-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption-key.js","sourceRoot":"","sources":["../src/encryption-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAQxC,MAAM,UAAU,iBAAiB,CAAC,OAA6B,EAAE;IAI/D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACxD,IAAI,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC;IACrD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA6B,EAAE;IAIjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC;IACrD,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,OAAO;QACL,GAAG;QACH,MAAM,EAAE;YACN,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,OAAO;YACb,OAAO,EACL,6CAA6C,OAAO,IAAI;gBACxD,+EAA+E;SAClF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { KEY_REGISTRY, SecretCategorySchema, findKeySpec, keysByCategory, } from "./key-specs.js";
|
|
2
|
+
export type { KeySpec, SecretCategory, TestResult } from "./key-specs.js";
|
|
3
|
+
export { WALKTHROUGH_STEPS, getStep, nextStep, prevStep, } from "./walkthrough.js";
|
|
4
|
+
export type { StepId, WalkthroughStep } from "./walkthrough.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,QAAQ,GACT,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const SecretCategorySchema: z.ZodEnum<["llm", "embedding", "rerank", "integration", "system"]>;
|
|
3
|
+
export type SecretCategory = z.infer<typeof SecretCategorySchema>;
|
|
4
|
+
export interface KeySpec {
|
|
5
|
+
name: string;
|
|
6
|
+
category: SecretCategory;
|
|
7
|
+
description: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
docsUrl?: string;
|
|
10
|
+
shapeHint: string;
|
|
11
|
+
validateShape: (value: string) => {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
reason?: string;
|
|
14
|
+
};
|
|
15
|
+
test: (value: string) => Promise<TestResult>;
|
|
16
|
+
}
|
|
17
|
+
export interface TestResult {
|
|
18
|
+
ok: boolean;
|
|
19
|
+
detail: string;
|
|
20
|
+
latencyMs: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const KEY_REGISTRY: KeySpec[];
|
|
23
|
+
export declare function findKeySpec(name: string): KeySpec | undefined;
|
|
24
|
+
export declare function keysByCategory(): Record<SecretCategory, KeySpec[]>;
|
|
25
|
+
//# sourceMappingURL=key-specs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-specs.d.ts","sourceRoot":"","sources":["../src/key-specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB,oEAM/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAwLD,eAAO,MAAM,YAAY,EAAE,OAAO,EAQjC,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE7D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAUlE"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SecretCategorySchema = z.enum([
|
|
3
|
+
"llm",
|
|
4
|
+
"embedding",
|
|
5
|
+
"rerank",
|
|
6
|
+
"integration",
|
|
7
|
+
"system",
|
|
8
|
+
]);
|
|
9
|
+
function isNonEmpty(v) {
|
|
10
|
+
return v.trim().length > 0 ? { ok: true } : { ok: false, reason: "Empty value" };
|
|
11
|
+
}
|
|
12
|
+
async function timed(fn) {
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
const result = await fn();
|
|
15
|
+
return { result, latencyMs: Date.now() - start };
|
|
16
|
+
}
|
|
17
|
+
async function testHttpAuth(url, headers, okStatuses = [200, 401, 403]) {
|
|
18
|
+
const { result, latencyMs } = await timed(async () => {
|
|
19
|
+
try {
|
|
20
|
+
const res = await fetch(url, { method: "GET", headers });
|
|
21
|
+
return { status: res.status, ok: res.ok };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return { status: 0, ok: false, error: String(err) };
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
if (!okStatuses.includes(result.status)) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
detail: result.status === 0
|
|
31
|
+
? `Network error: ${"error" in result ? result.error : "unknown"}`
|
|
32
|
+
: `Unexpected status ${result.status}`,
|
|
33
|
+
latencyMs,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (result.status === 401 || result.status === 403) {
|
|
37
|
+
return { ok: false, detail: `Authentication rejected (${result.status})`, latencyMs };
|
|
38
|
+
}
|
|
39
|
+
return { ok: true, detail: `${result.status} OK`, latencyMs };
|
|
40
|
+
}
|
|
41
|
+
const ANTHROPIC = {
|
|
42
|
+
name: "ANTHROPIC_API_KEY",
|
|
43
|
+
category: "llm",
|
|
44
|
+
description: "Anthropic API key. Used by the orchestrator and spec-compliance judge.",
|
|
45
|
+
required: false,
|
|
46
|
+
docsUrl: "https://platform.claude.com/settings/keys",
|
|
47
|
+
shapeHint: "sk-ant-…",
|
|
48
|
+
validateShape(v) {
|
|
49
|
+
if (!v.startsWith("sk-ant-"))
|
|
50
|
+
return { ok: false, reason: "Expected prefix `sk-ant-`" };
|
|
51
|
+
if (v.length < 20)
|
|
52
|
+
return { ok: false, reason: "Suspiciously short" };
|
|
53
|
+
return { ok: true };
|
|
54
|
+
},
|
|
55
|
+
test(value) {
|
|
56
|
+
return testHttpAuth("https://api.anthropic.com/v1/models", {
|
|
57
|
+
"x-api-key": value,
|
|
58
|
+
"anthropic-version": "2023-06-01",
|
|
59
|
+
}, [200]);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const OPENAI = {
|
|
63
|
+
name: "OPENAI_API_KEY",
|
|
64
|
+
category: "llm",
|
|
65
|
+
description: "OpenAI API key, or an OpenAI-compatible key (DeepSeek / Kimi / Together / Groq / Ollama). Pair with OPENAI_BASE_URL to point at non-OpenAI endpoints.",
|
|
66
|
+
required: false,
|
|
67
|
+
docsUrl: "https://platform.openai.com/api-keys",
|
|
68
|
+
shapeHint: "sk-… or sk-proj-…",
|
|
69
|
+
validateShape(v) {
|
|
70
|
+
if (!v.startsWith("sk-"))
|
|
71
|
+
return { ok: false, reason: "Expected prefix `sk-`" };
|
|
72
|
+
if (v.length < 20)
|
|
73
|
+
return { ok: false, reason: "Suspiciously short" };
|
|
74
|
+
return { ok: true };
|
|
75
|
+
},
|
|
76
|
+
async test(value) {
|
|
77
|
+
const baseUrl = process.env["OPENAI_BASE_URL"] ?? "https://api.openai.com/v1";
|
|
78
|
+
return testHttpAuth(`${baseUrl.replace(/\/$/, "")}/models`, {
|
|
79
|
+
Authorization: `Bearer ${value}`,
|
|
80
|
+
}, [200]);
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const VOYAGE = {
|
|
84
|
+
name: "VOYAGE_API_KEY",
|
|
85
|
+
category: "embedding",
|
|
86
|
+
description: "Voyage AI API key for voyage-context-3 (recommended default embedding model).",
|
|
87
|
+
required: false,
|
|
88
|
+
docsUrl: "https://docs.voyageai.com/docs/api-key-and-installation",
|
|
89
|
+
shapeHint: "pa-…",
|
|
90
|
+
validateShape: isNonEmpty,
|
|
91
|
+
async test(value) {
|
|
92
|
+
return timed(async () => {
|
|
93
|
+
try {
|
|
94
|
+
const res = await fetch("https://api.voyageai.com/v1/embeddings", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: {
|
|
97
|
+
Authorization: `Bearer ${value}`,
|
|
98
|
+
"Content-Type": "application/json",
|
|
99
|
+
},
|
|
100
|
+
body: JSON.stringify({ input: ["ping"], model: "voyage-3-lite" }),
|
|
101
|
+
});
|
|
102
|
+
return res;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return { ok: false, status: 0, error: String(err) };
|
|
106
|
+
}
|
|
107
|
+
}).then(({ result, latencyMs }) => {
|
|
108
|
+
const status = result.status;
|
|
109
|
+
if (status === 200)
|
|
110
|
+
return { ok: true, detail: "200 OK", latencyMs };
|
|
111
|
+
if (status === 401)
|
|
112
|
+
return { ok: false, detail: "Authentication rejected (401)", latencyMs };
|
|
113
|
+
return { ok: false, detail: `Unexpected status ${status}`, latencyMs };
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const OPENAI_EMBEDDING = {
|
|
118
|
+
name: "OPENAI_EMBEDDING_API_KEY",
|
|
119
|
+
category: "embedding",
|
|
120
|
+
description: "Optional separate OpenAI key used only for embeddings (text-embedding-3-small/large). Falls back to OPENAI_API_KEY when unset.",
|
|
121
|
+
required: false,
|
|
122
|
+
shapeHint: "sk-…",
|
|
123
|
+
validateShape(v) {
|
|
124
|
+
if (!v.startsWith("sk-"))
|
|
125
|
+
return { ok: false, reason: "Expected prefix `sk-`" };
|
|
126
|
+
return { ok: true };
|
|
127
|
+
},
|
|
128
|
+
test(value) {
|
|
129
|
+
return testHttpAuth("https://api.openai.com/v1/models", {
|
|
130
|
+
Authorization: `Bearer ${value}`,
|
|
131
|
+
}, [200]);
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
const VOYAGE_RERANK = {
|
|
135
|
+
name: "VOYAGE_RERANK_API_KEY",
|
|
136
|
+
category: "rerank",
|
|
137
|
+
description: "Optional separate Voyage key for reranking only (voyage-rerank-2.5). Falls back to VOYAGE_API_KEY when unset. Reranking is enabled by KEEL_KB_RERANK=true.",
|
|
138
|
+
required: false,
|
|
139
|
+
shapeHint: "pa-…",
|
|
140
|
+
validateShape: isNonEmpty,
|
|
141
|
+
test: VOYAGE.test,
|
|
142
|
+
};
|
|
143
|
+
const GITHUB_PAT = {
|
|
144
|
+
name: "GITHUB_TOKEN",
|
|
145
|
+
category: "integration",
|
|
146
|
+
description: "GitHub personal access token. Used by `@keel_flow/extend` PR opener and any CI integration.",
|
|
147
|
+
required: false,
|
|
148
|
+
docsUrl: "https://github.com/settings/tokens",
|
|
149
|
+
shapeHint: "ghp_… or github_pat_…",
|
|
150
|
+
validateShape(v) {
|
|
151
|
+
if (v.startsWith("ghp_") || v.startsWith("github_pat_") || v.startsWith("ghs_")) {
|
|
152
|
+
return { ok: true };
|
|
153
|
+
}
|
|
154
|
+
return { ok: false, reason: "Expected prefix `ghp_`, `github_pat_`, or `ghs_`" };
|
|
155
|
+
},
|
|
156
|
+
test(value) {
|
|
157
|
+
return testHttpAuth("https://api.github.com/user", {
|
|
158
|
+
Authorization: `Bearer ${value}`,
|
|
159
|
+
"User-Agent": "keel-setup",
|
|
160
|
+
Accept: "application/vnd.github+json",
|
|
161
|
+
}, [200]);
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
const ENCRYPTION_KEY = {
|
|
165
|
+
name: "KEEL_TOKEN_ENCRYPTION_KEY",
|
|
166
|
+
category: "system",
|
|
167
|
+
description: "32-byte hex key used to encrypt stored secrets at rest. Auto-generated on first run; back it up off-machine.",
|
|
168
|
+
required: true,
|
|
169
|
+
shapeHint: "64 hex chars",
|
|
170
|
+
validateShape(v) {
|
|
171
|
+
if (!/^[0-9a-fA-F]{64}$/.test(v)) {
|
|
172
|
+
return { ok: false, reason: "Expected 64 hex chars (32 bytes)" };
|
|
173
|
+
}
|
|
174
|
+
return { ok: true };
|
|
175
|
+
},
|
|
176
|
+
async test() {
|
|
177
|
+
return { ok: true, detail: "shape-validated (no remote endpoint)", latencyMs: 0 };
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
export const KEY_REGISTRY = [
|
|
181
|
+
ANTHROPIC,
|
|
182
|
+
OPENAI,
|
|
183
|
+
VOYAGE,
|
|
184
|
+
OPENAI_EMBEDDING,
|
|
185
|
+
VOYAGE_RERANK,
|
|
186
|
+
GITHUB_PAT,
|
|
187
|
+
ENCRYPTION_KEY,
|
|
188
|
+
];
|
|
189
|
+
export function findKeySpec(name) {
|
|
190
|
+
return KEY_REGISTRY.find((k) => k.name === name);
|
|
191
|
+
}
|
|
192
|
+
export function keysByCategory() {
|
|
193
|
+
const out = {
|
|
194
|
+
llm: [],
|
|
195
|
+
embedding: [],
|
|
196
|
+
rerank: [],
|
|
197
|
+
integration: [],
|
|
198
|
+
system: [],
|
|
199
|
+
};
|
|
200
|
+
for (const k of KEY_REGISTRY)
|
|
201
|
+
out[k.category].push(k);
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=key-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-specs.js","sourceRoot":"","sources":["../src/key-specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC;IACzC,KAAK;IACL,WAAW;IACX,QAAQ;IACR,aAAa;IACb,QAAQ;CACT,CAAC,CAAC;AAoBH,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,KAAK,CAAI,EAAoB;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,GAAW,EACX,OAA+B,EAC/B,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAE5B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBACzB,CAAC,CAAC,kBAAkB,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE;gBAClE,CAAC,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE;YACxC,SAAS;SACV,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,MAAM,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,KAAK,EAAE,SAAS,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,SAAS,GAAY;IACzB,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,wEAAwE;IACrF,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,2CAA2C;IACpD,SAAS,EAAE,UAAU;IACrB,aAAa,CAAC,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;QACxF,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,KAAK;QACR,OAAO,YAAY,CAAC,qCAAqC,EAAE;YACzD,WAAW,EAAE,KAAK;YAClB,mBAAmB,EAAE,YAAY;SAClC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,GAAY;IACtB,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,KAAK;IACf,WAAW,EACT,uJAAuJ;IACzJ,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,sCAAsC;IAC/C,SAAS,EAAE,mBAAmB;IAC9B,aAAa,CAAC,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;QAChF,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;QACtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,2BAA2B,CAAC;QAC9E,OAAO,YAAY,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE;YAC1D,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,GAAY;IACtB,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,WAAW;IACrB,WAAW,EACT,+EAA+E;IACjF,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,yDAAyD;IAClE,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,UAAU;IACzB,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,wCAAwC,EAAE;oBAChE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,KAAK,EAAE;wBAChC,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;iBAClE,CAAC,CAAC;gBACH,OAAO,GAAG,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAyB,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;YAChC,MAAM,MAAM,GAAI,MAAmB,CAAC,MAAM,CAAC;YAC3C,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YACrE,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,CAAC;YAC7F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,gBAAgB,GAAY;IAChC,IAAI,EAAE,0BAA0B;IAChC,QAAQ,EAAE,WAAW;IACrB,WAAW,EACT,gIAAgI;IAClI,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,MAAM;IACjB,aAAa,CAAC,CAAC;QACb,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;QAChF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,KAAK;QACR,OAAO,YAAY,CAAC,kCAAkC,EAAE;YACtD,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,MAAM,aAAa,GAAY;IAC7B,IAAI,EAAE,uBAAuB;IAC7B,QAAQ,EAAE,QAAQ;IAClB,WAAW,EACT,4JAA4J;IAC9J,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC,IAAI;CAClB,CAAC;AAEF,MAAM,UAAU,GAAY;IAC1B,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,aAAa;IACvB,WAAW,EACT,6FAA6F;IAC/F,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,oCAAoC;IAC7C,SAAS,EAAE,uBAAuB;IAClC,aAAa,CAAC,CAAC;QACb,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAChF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,KAAK;QACR,OAAO,YAAY,CAAC,6BAA6B,EAAE;YACjD,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,YAAY,EAAE,YAAY;YAC1B,MAAM,EAAE,6BAA6B;SACtC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACZ,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAY;IAC9B,IAAI,EAAE,2BAA2B;IACjC,QAAQ,EAAE,QAAQ;IAClB,WAAW,EACT,8GAA8G;IAChH,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,cAAc;IACzB,aAAa,CAAC,CAAC;QACb,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,sCAAsC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,SAAS;IACT,MAAM;IACN,MAAM;IACN,gBAAgB;IAChB,aAAa;IACb,UAAU;IACV,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAsC;QAC7C,GAAG,EAAE,EAAE;QACP,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,EAAE;KACX,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,GACR,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,OAAO,GACR,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type KeySpec } from "./key-specs.js";
|
|
2
|
+
export type StepId = "welcome" | "llm" | "embedding" | "integrations" | "done";
|
|
3
|
+
export interface WalkthroughStep {
|
|
4
|
+
id: StepId;
|
|
5
|
+
title: string;
|
|
6
|
+
blurb: string;
|
|
7
|
+
keys: KeySpec[];
|
|
8
|
+
requireAtLeastOne: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const WALKTHROUGH_STEPS: WalkthroughStep[];
|
|
11
|
+
export declare function nextStep(current: StepId): StepId | null;
|
|
12
|
+
export declare function prevStep(current: StepId): StepId | null;
|
|
13
|
+
export declare function getStep(id: StepId): WalkthroughStep;
|
|
14
|
+
//# sourceMappingURL=walkthrough.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walkthrough.d.ts","sourceRoot":"","sources":["../src/walkthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,iBAAiB,EAAE,eAAe,EA0C9C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAInD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { KEY_REGISTRY } from "./key-specs.js";
|
|
2
|
+
export const WALKTHROUGH_STEPS = [
|
|
3
|
+
{
|
|
4
|
+
id: "welcome",
|
|
5
|
+
title: "Welcome to Keel",
|
|
6
|
+
blurb: "Keel needs a few keys to talk to LLM providers and (optionally) external services. We'll walk through the required ones and skip optional ones unless you want them. You can edit anything later at /settings/keys.",
|
|
7
|
+
keys: [],
|
|
8
|
+
requireAtLeastOne: false,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
id: "llm",
|
|
12
|
+
title: "LLM provider",
|
|
13
|
+
blurb: "Pick at least one LLM provider. Anthropic via your Pro/Max subscription is the recommended path; OpenAI-compatible covers DeepSeek / Kimi / Together / Groq / Ollama.",
|
|
14
|
+
keys: KEY_REGISTRY.filter((k) => k.category === "llm"),
|
|
15
|
+
requireAtLeastOne: true,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "embedding",
|
|
19
|
+
title: "Embeddings (optional)",
|
|
20
|
+
blurb: "voyage-context-3 is the recommended embedding model. If no key is configured, Keel falls back to a local MiniLM model (no external API needed, lower quality).",
|
|
21
|
+
keys: KEY_REGISTRY.filter((k) => k.category === "embedding"),
|
|
22
|
+
requireAtLeastOne: false,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: "integrations",
|
|
26
|
+
title: "Integrations (optional)",
|
|
27
|
+
blurb: "GitHub PAT enables the extend-flow PR opener. Rerank API key enables KEEL_KB_RERANK=true.",
|
|
28
|
+
keys: KEY_REGISTRY.filter((k) => k.category === "integration" || k.category === "rerank"),
|
|
29
|
+
requireAtLeastOne: false,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "done",
|
|
33
|
+
title: "Done",
|
|
34
|
+
blurb: "Setup complete. You can revisit any of these at /settings/keys.",
|
|
35
|
+
keys: [],
|
|
36
|
+
requireAtLeastOne: false,
|
|
37
|
+
},
|
|
38
|
+
];
|
|
39
|
+
export function nextStep(current) {
|
|
40
|
+
const idx = WALKTHROUGH_STEPS.findIndex((s) => s.id === current);
|
|
41
|
+
if (idx < 0 || idx >= WALKTHROUGH_STEPS.length - 1)
|
|
42
|
+
return null;
|
|
43
|
+
const next = WALKTHROUGH_STEPS[idx + 1];
|
|
44
|
+
return next ? next.id : null;
|
|
45
|
+
}
|
|
46
|
+
export function prevStep(current) {
|
|
47
|
+
const idx = WALKTHROUGH_STEPS.findIndex((s) => s.id === current);
|
|
48
|
+
if (idx <= 0)
|
|
49
|
+
return null;
|
|
50
|
+
const prev = WALKTHROUGH_STEPS[idx - 1];
|
|
51
|
+
return prev ? prev.id : null;
|
|
52
|
+
}
|
|
53
|
+
export function getStep(id) {
|
|
54
|
+
const step = WALKTHROUGH_STEPS.find((s) => s.id === id);
|
|
55
|
+
if (!step)
|
|
56
|
+
throw new Error(`Unknown step: ${id}`);
|
|
57
|
+
return step;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=walkthrough.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walkthrough.js","sourceRoot":"","sources":["../src/walkthrough.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,gBAAgB,CAAC;AAY5D,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,iBAAiB;QACxB,KAAK,EACH,qNAAqN;QACvN,IAAI,EAAE,EAAE;QACR,iBAAiB,EAAE,KAAK;KACzB;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,cAAc;QACrB,KAAK,EACH,uKAAuK;QACzK,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;QACtD,iBAAiB,EAAE,IAAI;KACxB;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,uBAAuB;QAC9B,KAAK,EACH,gKAAgK;QAClK,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC;QAC5D,iBAAiB,EAAE,KAAK;KACzB;IACD;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,yBAAyB;QAChC,KAAK,EACH,2FAA2F;QAC7F,IAAI,EAAE,YAAY,CAAC,MAAM,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/D;QACD,iBAAiB,EAAE,KAAK;KACzB;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,iEAAiE;QACxE,IAAI,EAAE,EAAE;QACR,iBAAiB,EAAE,KAAK;KACzB;CACF,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACjE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACjE,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@keel_flow/setup",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"require": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./server": {
|
|
21
|
+
"import": "./dist/server.js",
|
|
22
|
+
"require": "./dist/server.js",
|
|
23
|
+
"types": "./dist/server.d.ts"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"zod": "^3.23.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^25.9.1",
|
|
31
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
32
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
33
|
+
"eslint": "^9.0.0",
|
|
34
|
+
"typescript": "^5.5.0",
|
|
35
|
+
"vitest": "^2.0.0"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsc",
|
|
39
|
+
"typecheck": "tsc --noEmit",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"lint": "eslint src"
|
|
42
|
+
}
|
|
43
|
+
}
|