kly 0.2.0 → 0.3.1
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.md +14 -2
- package/dist/ai/context.mjs.map +1 -1
- package/dist/ai/storage.mjs +3 -2
- package/dist/ai/storage.mjs.map +1 -1
- package/dist/bin/bin-registry-Cj1PddZ1.mjs +3 -0
- package/dist/bin/kly.mjs +3240 -2434
- package/dist/bin/kly.mjs.map +1 -1
- package/dist/bin/{permissions-extractor-BfUPS0Tr.mjs → permissions-extractor-B3XI8JLv.mjs} +4 -2
- package/dist/bin/permissions-extractor-B3XI8JLv.mjs.map +1 -0
- package/dist/cli.mjs +4 -4
- package/dist/cli.mjs.map +1 -1
- package/dist/define-app.d.mts.map +1 -1
- package/dist/define-app.mjs +35 -28
- package/dist/define-app.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -3
- package/dist/mcp/schema-converter.d.mts.map +1 -1
- package/dist/mcp/schema-converter.mjs +2 -1
- package/dist/mcp/schema-converter.mjs.map +1 -1
- package/dist/mcp/server.d.mts.map +1 -1
- package/dist/mcp/server.mjs +7 -6
- package/dist/mcp/server.mjs.map +1 -1
- package/dist/permissions/index.mjs +8 -10
- package/dist/permissions/index.mjs.map +1 -1
- package/dist/sandbox/bundled-executor.d.mts.map +1 -1
- package/dist/sandbox/bundled-executor.mjs +67 -10
- package/dist/sandbox/bundled-executor.mjs.map +1 -1
- package/dist/sandbox/ipc-client.mjs +2 -0
- package/dist/sandbox/ipc-client.mjs.map +1 -1
- package/dist/sandbox/sandboxed-context.mjs.map +1 -1
- package/dist/shared/constants.mjs +5 -1
- package/dist/shared/constants.mjs.map +1 -1
- package/dist/shared/errors.mjs +21 -0
- package/dist/shared/errors.mjs.map +1 -0
- package/dist/tool.d.mts.map +1 -1
- package/dist/tool.mjs.map +1 -1
- package/dist/types.d.mts +7 -6
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/ui/components/confirm.d.mts.map +1 -1
- package/dist/ui/components/confirm.mjs +4 -8
- package/dist/ui/components/confirm.mjs.map +1 -1
- package/dist/ui/components/form.d.mts.map +1 -1
- package/dist/ui/components/form.mjs +12 -26
- package/dist/ui/components/form.mjs.map +1 -1
- package/dist/ui/components/input.d.mts.map +1 -1
- package/dist/ui/components/input.mjs +3 -7
- package/dist/ui/components/input.mjs.map +1 -1
- package/dist/ui/{utils/output.d.mts → components/log.d.mts} +22 -2
- package/dist/ui/components/log.d.mts.map +1 -0
- package/dist/ui/components/log.mjs +92 -0
- package/dist/ui/components/log.mjs.map +1 -0
- package/dist/ui/components/prompts.d.mts +1 -0
- package/dist/ui/components/select.d.mts.map +1 -1
- package/dist/ui/components/select.mjs +5 -8
- package/dist/ui/components/select.mjs.map +1 -1
- package/dist/ui/components/table.d.mts +1 -1
- package/dist/ui/components/table.d.mts.map +1 -1
- package/dist/ui/components/table.mjs +19 -19
- package/dist/ui/components/table.mjs.map +1 -1
- package/dist/ui/index.d.mts +3 -2
- package/dist/ui/utils/cancel.mjs +17 -0
- package/dist/ui/utils/cancel.mjs.map +1 -0
- package/dist/ui/utils/colors.d.mts +3 -3
- package/dist/ui/utils/colors.d.mts.map +1 -1
- package/dist/ui/utils/colors.mjs +21 -33
- package/dist/ui/utils/colors.mjs.map +1 -1
- package/dist/ui/utils/tty.mjs.map +1 -1
- package/package.json +30 -27
- package/dist/bin/permissions-extractor-BfUPS0Tr.mjs.map +0 -1
- package/dist/ui/utils/output.d.mts.map +0 -1
- package/dist/ui/utils/output.mjs +0 -42
- package/dist/ui/utils/output.mjs.map +0 -1
- /package/dist/bin/{config-builder-D5EtwOB3.mjs → config-builder-CkkAqWMY.mjs} +0 -0
- /package/dist/bin/{launcher-Ex3ynZdE.mjs → launcher-CSdy4_ZV.mjs} +0 -0
- /package/dist/bin/{permissions-C_WgoA3t.mjs → permissions-DOOzghc5.mjs} +0 -0
package/README.md
CHANGED
|
@@ -2,8 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/kly)
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
A CLI framework with sandbox isolation and MCP support.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bun install -g kly
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
kly run ./app.ts # Run local app
|
|
17
|
+
kly run user/repo # Run remote app
|
|
18
|
+
kly mcp ./app.ts # Run as MCP server
|
|
7
19
|
```
|
|
8
20
|
|
|
9
21
|
## License
|
package/dist/ai/context.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.mjs","names":[],"sources":["../../src/ai/context.ts"],"sourcesContent":["import { checkApiKeyPermission, getAppIdentifier } from \"../permissions\";\nimport type { ModelConfig, ModelInfo, ModelsContext } from \"../types\";\nimport { getCurrentModelConfig, listModels } from \"./storage\";\n\n/**\n * Create models context for ExecuteContext\n * Provides access to configured LLM models and their credentials (with permission checks)\n */\nexport function createModelsContext(): ModelsContext {\n // Track if permission has been checked in this process\n let permissionChecked = false;\n let permissionGranted = false;\n\n /**\n * Check permission before allowing access to API keys\n */\n async function ensurePermission(): Promise<void> {\n if (permissionChecked) {\n if (!permissionGranted) {\n throw new Error(\
|
|
1
|
+
{"version":3,"file":"context.mjs","names":[],"sources":["../../src/ai/context.ts"],"sourcesContent":["import { checkApiKeyPermission, getAppIdentifier } from \"../permissions\";\nimport type { ModelConfig, ModelInfo, ModelsContext } from \"../types\";\nimport { getCurrentModelConfig, listModels } from \"./storage\";\n\n/**\n * Create models context for ExecuteContext\n * Provides access to configured LLM models and their credentials (with permission checks)\n */\nexport function createModelsContext(): ModelsContext {\n // Track if permission has been checked in this process\n let permissionChecked = false;\n let permissionGranted = false;\n\n /**\n * Check permission before allowing access to API keys\n */\n async function ensurePermission(): Promise<void> {\n if (permissionChecked) {\n if (!permissionGranted) {\n throw new Error(\"Permission denied: This app does not have permission to access API keys.\");\n }\n return;\n }\n\n const appId = getAppIdentifier();\n permissionGranted = await checkApiKeyPermission(appId);\n permissionChecked = true;\n\n if (!permissionGranted) {\n throw new Error(\"Permission denied: This app does not have permission to access API keys.\");\n }\n }\n\n return {\n list(): ModelInfo[] {\n return listModels().map((m) => ({\n name: m.name,\n provider: m.config.provider,\n model: m.config.model,\n isCurrent: m.isCurrent,\n }));\n },\n\n getCurrent(): ModelInfo | null {\n const models = listModels();\n const current = models.find((m) => m.isCurrent);\n if (!current) return null;\n\n return {\n name: current.name,\n provider: current.config.provider,\n model: current.config.model,\n isCurrent: true,\n };\n },\n\n get(name: string): ModelInfo | null {\n const models = listModels();\n const found = models.find((m) => m.name === name);\n if (!found) return null;\n\n return {\n name: found.name,\n provider: found.config.provider,\n model: found.config.model,\n isCurrent: found.isCurrent,\n };\n },\n\n async getConfigAsync(name?: string): Promise<ModelConfig | null> {\n // Check permission first\n await ensurePermission();\n\n if (name) {\n const models = listModels();\n const found = models.find((m) => m.name === name);\n if (!found) return null;\n\n return {\n provider: found.config.provider,\n model: found.config.model,\n apiKey: found.config.apiKey,\n baseURL: found.config.baseURL,\n };\n }\n\n const current = getCurrentModelConfig();\n if (!current) return null;\n\n return {\n provider: current.provider,\n model: current.model,\n apiKey: current.apiKey,\n baseURL: current.baseURL,\n };\n },\n };\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,sBAAqC;CAEnD,IAAI,oBAAoB;CACxB,IAAI,oBAAoB;;;;CAKxB,eAAe,mBAAkC;AAC/C,MAAI,mBAAmB;AACrB,OAAI,CAAC,kBACH,OAAM,IAAI,MAAM,2EAA2E;AAE7F;;AAIF,sBAAoB,MAAM,sBADZ,kBAAkB,CACsB;AACtD,sBAAoB;AAEpB,MAAI,CAAC,kBACH,OAAM,IAAI,MAAM,2EAA2E;;AAI/F,QAAO;EACL,OAAoB;AAClB,UAAO,YAAY,CAAC,KAAK,OAAO;IAC9B,MAAM,EAAE;IACR,UAAU,EAAE,OAAO;IACnB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE;IACd,EAAE;;EAGL,aAA+B;GAE7B,MAAM,UADS,YAAY,CACJ,MAAM,MAAM,EAAE,UAAU;AAC/C,OAAI,CAAC,QAAS,QAAO;AAErB,UAAO;IACL,MAAM,QAAQ;IACd,UAAU,QAAQ,OAAO;IACzB,OAAO,QAAQ,OAAO;IACtB,WAAW;IACZ;;EAGH,IAAI,MAAgC;GAElC,MAAM,QADS,YAAY,CACN,MAAM,MAAM,EAAE,SAAS,KAAK;AACjD,OAAI,CAAC,MAAO,QAAO;AAEnB,UAAO;IACL,MAAM,MAAM;IACZ,UAAU,MAAM,OAAO;IACvB,OAAO,MAAM,OAAO;IACpB,WAAW,MAAM;IAClB;;EAGH,MAAM,eAAe,MAA4C;AAE/D,SAAM,kBAAkB;AAExB,OAAI,MAAM;IAER,MAAM,QADS,YAAY,CACN,MAAM,MAAM,EAAE,SAAS,KAAK;AACjD,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO;KACL,UAAU,MAAM,OAAO;KACvB,OAAO,MAAM,OAAO;KACpB,QAAQ,MAAM,OAAO;KACrB,SAAS,MAAM,OAAO;KACvB;;GAGH,MAAM,UAAU,uBAAuB;AACvC,OAAI,CAAC,QAAS,QAAO;AAErB,UAAO;IACL,UAAU,QAAQ;IAClB,OAAO,QAAQ;IACf,QAAQ,QAAQ;IAChB,SAAS,QAAQ;IAClB;;EAEJ"}
|
package/dist/ai/storage.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { error } from "../ui/components/log.mjs";
|
|
1
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
3
|
import { homedir } from "node:os";
|
|
3
4
|
import { join } from "node:path";
|
|
@@ -20,8 +21,8 @@ function loadConfig() {
|
|
|
20
21
|
try {
|
|
21
22
|
const content = readFileSync(CONFIG_FILE, "utf-8");
|
|
22
23
|
return JSON.parse(content);
|
|
23
|
-
} catch (
|
|
24
|
-
|
|
24
|
+
} catch (err) {
|
|
25
|
+
error(`Failed to parse config file: ${err}`);
|
|
25
26
|
return { models: {} };
|
|
26
27
|
}
|
|
27
28
|
}
|
package/dist/ai/storage.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.mjs","names":[],"sources":["../../src/ai/storage.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { LLMConfig, LLMProvider } from \"./types\";\n\nconst CONFIG_DIR = join(homedir(), \".kly\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport interface KlyConfig {\n currentModel?: string;\n models: Record<string, LLMConfig>;\n}\n\n/**\n * Ensure config directory exists\n */\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n}\n\n/**\n * Load configuration from ~/.kly/config.json\n */\nexport function loadConfig(): KlyConfig {\n ensureConfigDir();\n\n if (!existsSync(CONFIG_FILE)) {\n return { models: {} };\n }\n\n try {\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\n return JSON.parse(content);\n } catch (
|
|
1
|
+
{"version":3,"file":"storage.mjs","names":[],"sources":["../../src/ai/storage.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { error } from \"../ui\";\nimport type { LLMConfig, LLMProvider } from \"./types\";\n\nconst CONFIG_DIR = join(homedir(), \".kly\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport interface KlyConfig {\n currentModel?: string;\n models: Record<string, LLMConfig>;\n}\n\n/**\n * Ensure config directory exists\n */\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n}\n\n/**\n * Load configuration from ~/.kly/config.json\n */\nexport function loadConfig(): KlyConfig {\n ensureConfigDir();\n\n if (!existsSync(CONFIG_FILE)) {\n return { models: {} };\n }\n\n try {\n const content = readFileSync(CONFIG_FILE, \"utf-8\");\n return JSON.parse(content);\n } catch (err) {\n error(`Failed to parse config file: ${err}`);\n return { models: {} };\n }\n}\n\n/**\n * Save configuration to ~/.kly/config.json\n */\nexport function saveConfig(config: KlyConfig): void {\n ensureConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\n/**\n * Get current active model configuration\n */\nexport function getCurrentModelConfig(): LLMConfig | null {\n const config = loadConfig();\n\n if (!config.currentModel) {\n return null;\n }\n\n return config.models[config.currentModel] || null;\n}\n\n/**\n * Set a model as current\n */\nexport function setCurrentModel(modelName: string): void {\n const config = loadConfig();\n\n if (!config.models[modelName]) {\n throw new Error(`Model '${modelName}' not found in config`);\n }\n\n config.currentModel = modelName;\n saveConfig(config);\n}\n\n/**\n * Add or update a model configuration\n */\nexport function saveModelConfig(modelName: string, modelConfig: LLMConfig): void {\n const config = loadConfig();\n\n config.models[modelName] = modelConfig;\n\n // Set as current if it's the first model\n if (!config.currentModel) {\n config.currentModel = modelName;\n }\n\n saveConfig(config);\n}\n\n/**\n * Remove a model configuration\n */\nexport function removeModelConfig(modelName: string): void {\n const config = loadConfig();\n\n delete config.models[modelName];\n\n // Clear current if it was removed\n if (config.currentModel === modelName) {\n config.currentModel = undefined;\n }\n\n saveConfig(config);\n}\n\n/**\n * List all configured models\n */\nexport function listModels(): Array<{\n name: string;\n config: LLMConfig;\n isCurrent: boolean;\n}> {\n const config = loadConfig();\n\n return Object.entries(config.models).map(([name, modelConfig]) => ({\n name,\n config: modelConfig,\n isCurrent: name === config.currentModel,\n }));\n}\n\n/**\n * Get provider display name\n */\nexport function getProviderDisplayName(provider: LLMProvider): string {\n const displayNames: Record<LLMProvider, string> = {\n openai: \"OpenAI\",\n anthropic: \"Anthropic\",\n google: \"Google\",\n deepseek: \"DeepSeek\",\n ollama: \"Ollama\",\n groq: \"Groq\",\n mistral: \"Mistral\",\n cohere: \"Cohere\",\n \"openai-compatible\": \"OpenAI Compatible\",\n };\n return displayNames[provider];\n}\n"],"mappings":";;;;;;AAMA,MAAM,aAAa,KAAK,SAAS,EAAE,OAAO;AAC1C,MAAM,cAAc,KAAK,YAAY,cAAc;;;;AAUnD,SAAS,kBAAwB;AAC/B,KAAI,CAAC,WAAW,WAAW,CACzB,WAAU,YAAY,EAAE,WAAW,MAAM,CAAC;;;;;AAO9C,SAAgB,aAAwB;AACtC,kBAAiB;AAEjB,KAAI,CAAC,WAAW,YAAY,CAC1B,QAAO,EAAE,QAAQ,EAAE,EAAE;AAGvB,KAAI;EACF,MAAM,UAAU,aAAa,aAAa,QAAQ;AAClD,SAAO,KAAK,MAAM,QAAQ;UACnB,KAAK;AACZ,QAAM,gCAAgC,MAAM;AAC5C,SAAO,EAAE,QAAQ,EAAE,EAAE;;;;;;AAezB,SAAgB,wBAA0C;CACxD,MAAM,SAAS,YAAY;AAE3B,KAAI,CAAC,OAAO,aACV,QAAO;AAGT,QAAO,OAAO,OAAO,OAAO,iBAAiB;;;;;AAoD/C,SAAgB,aAIb;CACD,MAAM,SAAS,YAAY;AAE3B,QAAO,OAAO,QAAQ,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,kBAAkB;EACjE;EACA,QAAQ;EACR,WAAW,SAAS,OAAO;EAC5B,EAAE"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { A as writeRegistry, C as removeShim, D as listCommands, E as getRegistryPath, M as isCommandAvailable, O as readRegistry, S as getShimDir, T as getCommand, _ as autoRegisterBins, b as createShim, g as setupPath, h as isKlyBinInPath, j as detectBins, k as removeCommand, m as getShellConfigFile, p as checkPathSetup, v as shouldReregisterLocal, w as addCommand, x as generateShimPath, y as unregisterCommand } from "./kly.mjs";
|
|
2
|
+
|
|
3
|
+
export { autoRegisterBins };
|