koneck 1.0.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/astValidator.d.ts +6 -0
  4. package/dist/astValidator.d.ts.map +1 -0
  5. package/dist/astValidator.js +57 -0
  6. package/dist/astValidator.js.map +1 -0
  7. package/dist/chat.d.ts +3 -0
  8. package/dist/chat.d.ts.map +1 -0
  9. package/dist/chat.js +205 -0
  10. package/dist/chat.js.map +1 -0
  11. package/dist/completion.d.ts +2 -0
  12. package/dist/completion.d.ts.map +1 -0
  13. package/dist/completion.js +137 -0
  14. package/dist/completion.js.map +1 -0
  15. package/dist/compressor.d.ts +9 -0
  16. package/dist/compressor.d.ts.map +1 -0
  17. package/dist/compressor.js +71 -0
  18. package/dist/compressor.js.map +1 -0
  19. package/dist/config.d.ts +14 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +40 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/doctor.d.ts +2 -0
  24. package/dist/doctor.d.ts.map +1 -0
  25. package/dist/doctor.js +99 -0
  26. package/dist/doctor.js.map +1 -0
  27. package/dist/engine.d.ts +11 -0
  28. package/dist/engine.d.ts.map +1 -0
  29. package/dist/engine.js +510 -0
  30. package/dist/engine.js.map +1 -0
  31. package/dist/generate-koneck-md.d.ts +3 -0
  32. package/dist/generate-koneck-md.d.ts.map +1 -0
  33. package/dist/generate-koneck-md.js +69 -0
  34. package/dist/generate-koneck-md.js.map +1 -0
  35. package/dist/git-tools.d.ts +4 -0
  36. package/dist/git-tools.d.ts.map +1 -0
  37. package/dist/git-tools.js +206 -0
  38. package/dist/git-tools.js.map +1 -0
  39. package/dist/highlight.d.ts +3 -0
  40. package/dist/highlight.d.ts.map +1 -0
  41. package/dist/highlight.js +139 -0
  42. package/dist/highlight.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +448 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/init.d.ts +9 -0
  48. package/dist/init.d.ts.map +1 -0
  49. package/dist/init.js +93 -0
  50. package/dist/init.js.map +1 -0
  51. package/dist/mcp.d.ts +24 -0
  52. package/dist/mcp.d.ts.map +1 -0
  53. package/dist/mcp.js +75 -0
  54. package/dist/mcp.js.map +1 -0
  55. package/dist/memory.d.ts +3 -0
  56. package/dist/memory.d.ts.map +1 -0
  57. package/dist/memory.js +18 -0
  58. package/dist/memory.js.map +1 -0
  59. package/dist/plugins.d.ts +9 -0
  60. package/dist/plugins.d.ts.map +1 -0
  61. package/dist/plugins.js +60 -0
  62. package/dist/plugins.js.map +1 -0
  63. package/dist/pricing.d.ts +9 -0
  64. package/dist/pricing.d.ts.map +1 -0
  65. package/dist/pricing.js +84 -0
  66. package/dist/pricing.js.map +1 -0
  67. package/dist/project.d.ts +14 -0
  68. package/dist/project.d.ts.map +1 -0
  69. package/dist/project.js +151 -0
  70. package/dist/project.js.map +1 -0
  71. package/dist/providers.d.ts +13 -0
  72. package/dist/providers.d.ts.map +1 -0
  73. package/dist/providers.js +130 -0
  74. package/dist/providers.js.map +1 -0
  75. package/dist/session.d.ts +19 -0
  76. package/dist/session.d.ts.map +1 -0
  77. package/dist/session.js +71 -0
  78. package/dist/session.js.map +1 -0
  79. package/dist/setup.d.ts +4 -0
  80. package/dist/setup.d.ts.map +1 -0
  81. package/dist/setup.js +63 -0
  82. package/dist/setup.js.map +1 -0
  83. package/dist/stats.d.ts +2 -0
  84. package/dist/stats.d.ts.map +1 -0
  85. package/dist/stats.js +81 -0
  86. package/dist/stats.js.map +1 -0
  87. package/dist/tools.d.ts +17 -0
  88. package/dist/tools.d.ts.map +1 -0
  89. package/dist/tools.js +713 -0
  90. package/dist/tools.js.map +1 -0
  91. package/dist/tui.d.ts +38 -0
  92. package/dist/tui.d.ts.map +1 -0
  93. package/dist/tui.js +364 -0
  94. package/dist/tui.js.map +1 -0
  95. package/dist/types.d.ts +158 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/watch.d.ts +3 -0
  100. package/dist/watch.d.ts.map +1 -0
  101. package/dist/watch.js +68 -0
  102. package/dist/watch.js.map +1 -0
  103. package/dist/worktree.d.ts +8 -0
  104. package/dist/worktree.d.ts.map +1 -0
  105. package/dist/worktree.js +94 -0
  106. package/dist/worktree.js.map +1 -0
  107. package/package.json +67 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 KONECK Contributors
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.
package/README.md ADDED
@@ -0,0 +1,109 @@
1
+ # KONECK
2
+
3
+ > Kinetically Orchestrated Neural Execution Engine for Code
4
+
5
+ A CLI AI coding agent that works like Claude Code or Codex CLI — drop into a chat, give it a task, and it reads, writes, and runs code autonomously using any LLM provider.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g koneck
11
+ ```
12
+
13
+ Then run `koneck` — the first-run wizard sets up your API key and provider.
14
+
15
+ ## Quick Start
16
+
17
+ ```bash
18
+ koneck # interactive chat (first run → setup wizard)
19
+ koneck "add validation to auth.ts" # one-shot task
20
+ koneck --pr "fix the flaky tests" # task + open a PR when done
21
+ ```
22
+
23
+ ## Providers
24
+
25
+ | Provider | Env Var | Default Model |
26
+ |---|---|---|
27
+ | omni (OmniRoute) | `OMNI_ROUTE_API_KEY` | auto/best-coding |
28
+ | openai | `OPENAI_API_KEY` | gpt-4o |
29
+ | anthropic | `ANTHROPIC_API_KEY` | claude-opus-4-5 |
30
+ | google | `GOOGLE_API_KEY` | gemini-2.0-flash |
31
+ | groq | `GROQ_API_KEY` | llama-3.3-70b-versatile |
32
+ | deepseek | `DEEPSEEK_API_KEY` | deepseek-coder |
33
+ | mistral | `MISTRAL_API_KEY` | mistral-large-latest |
34
+ | together | `TOGETHER_API_KEY` | meta-llama/Llama-3-70b-chat-hf |
35
+ | xai | `XAI_API_KEY` | grok-beta |
36
+ | perplexity | `PERPLEXITY_API_KEY` | llama-3.1-sonar-large-128k-online |
37
+ | moonshot | `MOONSHOT_API_KEY` | moonshot-v1-8k |
38
+ | cohere | `COHERE_API_KEY` | command-r-plus |
39
+ | ollama (local) | (none) | llama3.2 |
40
+
41
+ ## CLI Reference
42
+
43
+ ### Flags
44
+
45
+ | Flag | Description |
46
+ |---|---|
47
+ | `-p`, `--provider` | LLM provider to use (e.g. `openai`, `anthropic`, `omni`) |
48
+ | `--base-url` | Override the provider base URL |
49
+ | `-m`, `--model` | Model name to use |
50
+ | `-t`, `--max-turns` | Maximum agentic turns before stopping |
51
+ | `-a`, `--approve` | Auto-approve all tool calls |
52
+ | `-w`, `--worktree` | Run in an isolated git worktree |
53
+ | `-C`, `--cwd` | Set working directory |
54
+ | `-v`, `--verbose` | Print full tool call input/output |
55
+ | `--ci` | Non-interactive CI mode |
56
+ | `--json` | Output structured JSON |
57
+ | `--budget` | Token/cost budget limit |
58
+ | `--pr` | Open a pull request when the task completes |
59
+ | `-V`, `--version` | Print version |
60
+ | `-h`, `--help` | Show help |
61
+
62
+ ### Subcommands
63
+
64
+ | Subcommand | Description |
65
+ |---|---|
66
+ | `chat` | Start an interactive chat session (default) |
67
+ | `doctor` | Check provider connectivity and configuration |
68
+ | `stats` | Show usage statistics |
69
+ | `watch [pattern]` | Watch files matching pattern and re-run on changes |
70
+ | `setup` | Interactive first-run configuration wizard |
71
+ | `init` | Generate a KONECK.md for the current project |
72
+ | `completion [shell]` | Print shell completion script (bash/zsh/fish) |
73
+ | `--sessions` | List recent sessions |
74
+ | `--resume <id>` | Resume a previous session by ID |
75
+
76
+ ## KONECK.md
77
+
78
+ Place a `KONECK.md` in your project root to give KONECK project-specific context — architecture notes, conventions, commands to run before editing, files to avoid, and anything else the agent should know up front.
79
+
80
+ Run `koneck init` to auto-generate one from your existing codebase, or `koneck setup` to walk through it interactively.
81
+
82
+ ## MCP Servers
83
+
84
+ KONECK supports Model Context Protocol servers declared in `.koneck/mcp.json`:
85
+
86
+ ```json
87
+ // .koneck/mcp.json
88
+ {
89
+ "servers": {
90
+ "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"] }
91
+ }
92
+ }
93
+ ```
94
+
95
+ Servers are started automatically when KONECK launches and their tools become available to the agent.
96
+
97
+ ## Configuration
98
+
99
+ Global config lives in `~/.koneckrc`:
100
+
101
+ ```json
102
+ { "provider": "anthropic", "model": "claude-opus-4-5", "baseURL": "https://..." }
103
+ ```
104
+
105
+ Project-level config can be placed in `.koneck/config.json` and takes precedence over the global config.
106
+
107
+ ## License
108
+
109
+ MIT
@@ -0,0 +1,6 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ }
5
+ export declare function validateCode(content: string, filePath: string): ValidationResult;
6
+ //# sourceMappingURL=astValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astValidator.d.ts","sourceRoot":"","sources":["../src/astValidator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAKD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CA2DhF"}
@@ -0,0 +1,57 @@
1
+ import { Project, ts } from 'ts-morph';
2
+ import path from 'path';
3
+ const TS_EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts']);
4
+ const JS_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.cjs']);
5
+ export function validateCode(content, filePath) {
6
+ const ext = path.extname(filePath).toLowerCase();
7
+ if (!TS_EXTENSIONS.has(ext) && !JS_EXTENSIONS.has(ext)) {
8
+ return { valid: true, errors: [] };
9
+ }
10
+ try {
11
+ const project = new Project({
12
+ compilerOptions: {
13
+ allowJs: true,
14
+ checkJs: false,
15
+ strict: false,
16
+ skipLibCheck: true,
17
+ noEmit: true,
18
+ noResolve: true,
19
+ isolatedModules: true,
20
+ },
21
+ useInMemoryFileSystem: true,
22
+ skipAddingFilesFromTsConfig: true,
23
+ });
24
+ const virtualPath = path.basename(filePath);
25
+ project.createSourceFile(virtualPath, content, { overwrite: true });
26
+ const diagnostics = project.getPreEmitDiagnostics().filter(d => {
27
+ const code = d.getCode();
28
+ return (d.getCategory() === ts.DiagnosticCategory.Error &&
29
+ code >= 1000 &&
30
+ code < 2000);
31
+ });
32
+ if (diagnostics.length === 0) {
33
+ return { valid: true, errors: [] };
34
+ }
35
+ const errors = diagnostics.map(d => {
36
+ const rawMsg = d.getMessageText();
37
+ const msg = typeof rawMsg === 'string' ? rawMsg : rawMsg.getMessageText();
38
+ const sourceFile = d.getSourceFile();
39
+ if (sourceFile) {
40
+ const start = d.getStart() ?? 0;
41
+ const { line, column } = sourceFile.getLineAndColumnAtPos(start);
42
+ return `Line ${line}, Col ${column}: ${msg}`;
43
+ }
44
+ return msg;
45
+ });
46
+ return { valid: false, errors };
47
+ }
48
+ catch (err) {
49
+ return {
50
+ valid: false,
51
+ errors: [
52
+ `AST validation error: ${err instanceof Error ? err.message : String(err)}`,
53
+ ],
54
+ };
55
+ }
56
+ }
57
+ //# sourceMappingURL=astValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astValidator.js","sourceRoot":"","sources":["../src/astValidator.ts"],"names":[],"mappings":"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"}
package/dist/chat.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { AgentConfig } from './types.js';
2
+ export declare function runChatMode(config: AgentConfig): Promise<void>;
3
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAyC9C,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmLpE"}
package/dist/chat.js ADDED
@@ -0,0 +1,205 @@
1
+ import readline from 'readline';
2
+ import chalk from 'chalk';
3
+ import { createAgentSession } from './engine.js';
4
+ import { tui } from './tui.js';
5
+ import { saveSession, listSessions, generateSessionId } from './session.js';
6
+ import { estimateCost, formatCost } from './pricing.js';
7
+ const MODES = ['auto', 'plan', 'code'];
8
+ const MODE_LABELS = {
9
+ auto: chalk.cyan('auto'),
10
+ plan: chalk.magenta('plan'),
11
+ code: chalk.yellow('code'),
12
+ };
13
+ const MODE_PREFIXES = {
14
+ auto: '',
15
+ plan: 'Think step-by-step, create an explicit plan before making any changes. List every file you will touch and why.\n\nTask: ',
16
+ code: 'Be concise and direct. Focus only on code changes. No explanations unless something is non-obvious.\n\nTask: ',
17
+ };
18
+ // ─── Chat HELP ────────────────────────────────────────────────────────────────
19
+ const CHAT_HELP = chalk.dim(`
20
+ Commands:
21
+ /help Show this message
22
+ /reset Clear conversation, start fresh
23
+ /save Save session to disk now
24
+ /sessions List recent sessions
25
+ /mode Show or cycle mode (auto / plan / code)
26
+ /exit Exit and auto-save
27
+ Shift+Tab Cycle mode (auto → plan → code → auto)
28
+ Ctrl+C Cancel current task (in-progress) or exit
29
+ `);
30
+ // ─── Prompt renderer ─────────────────────────────────────────────────────────
31
+ function renderPrompt(mode) {
32
+ return chalk.cyan('koneck') + chalk.dim('[') + MODE_LABELS[mode] + chalk.dim(']') + chalk.cyan('> ');
33
+ }
34
+ // ─── Main chat function ───────────────────────────────────────────────────────
35
+ export async function runChatMode(config) {
36
+ tui.printBanner();
37
+ const providerStr = chalk.dim(`${config.provider} / ${config.model}`);
38
+ console.log(chalk.cyan(' KONECK chat ') + providerStr);
39
+ console.log(chalk.dim(' Shift+Tab: cycle mode │ /help: commands │ Ctrl+C: cancel/exit\n'));
40
+ const sessionId = generateSessionId();
41
+ let session = await createAgentSession(config);
42
+ let mode = 'auto';
43
+ let busy = false;
44
+ let currentAbort = null;
45
+ const rl = readline.createInterface({
46
+ input: process.stdin,
47
+ output: process.stdout,
48
+ terminal: true,
49
+ prompt: '',
50
+ });
51
+ // ── Shift+Tab via raw keypress ─────────────────────────────────────────────
52
+ if (process.stdin.isTTY) {
53
+ readline.emitKeypressEvents(process.stdin, rl);
54
+ process.stdin.on('keypress', (_char, key) => {
55
+ if (!key)
56
+ return;
57
+ // Shift+Tab = \x1b[Z
58
+ if (key.sequence === '\x1b[Z' || (key.shift && key.name === 'tab')) {
59
+ const idx = MODES.indexOf(mode);
60
+ mode = MODES[(idx + 1) % MODES.length];
61
+ // Redraw the current prompt line
62
+ process.stdout.write('\r\x1b[K' + renderPrompt(mode));
63
+ }
64
+ });
65
+ }
66
+ function writePrompt() {
67
+ process.stdout.write(renderPrompt(mode));
68
+ }
69
+ async function doSave() {
70
+ const firstUser = session.messages.find(m => m.role === 'user');
71
+ const task = firstUser && typeof firstUser.content === 'string'
72
+ ? firstUser.content.slice(0, 120)
73
+ : '(chat session)';
74
+ return saveSession(config.cwd, sessionId, {
75
+ id: sessionId,
76
+ task,
77
+ provider: config.provider,
78
+ model: config.model,
79
+ cwd: config.cwd,
80
+ startedAt: new Date().toISOString(),
81
+ turns: session.stats.turns,
82
+ totalTokens: session.stats.totalTokens,
83
+ }, session.messages);
84
+ }
85
+ async function handleLine(line) {
86
+ const input = line.trim();
87
+ if (!input)
88
+ return;
89
+ // ── Slash commands ─────────────────────────────────────────────────────────
90
+ switch (input) {
91
+ case '/exit':
92
+ case '/quit': {
93
+ const file = await doSave();
94
+ console.log(chalk.dim(`\n Session saved: ${file}`));
95
+ console.log(chalk.dim(' Goodbye.\n'));
96
+ rl.close();
97
+ process.exit(0);
98
+ }
99
+ case '/help':
100
+ console.log(CHAT_HELP);
101
+ return;
102
+ case '/reset': {
103
+ session = await createAgentSession(config);
104
+ console.log(chalk.green(' ✔ Conversation reset.\n'));
105
+ return;
106
+ }
107
+ case '/save': {
108
+ const file = await doSave();
109
+ console.log(chalk.green(` ✔ Saved: ${file}\n`));
110
+ return;
111
+ }
112
+ case '/mode':
113
+ case '/modes': {
114
+ const idx = MODES.indexOf(mode);
115
+ mode = MODES[(idx + 1) % MODES.length];
116
+ console.log(chalk.cyan(` Mode: ${MODE_LABELS[mode]}\n`));
117
+ return;
118
+ }
119
+ case '/auto':
120
+ mode = 'auto';
121
+ console.log(chalk.cyan(' Mode: auto\n'));
122
+ return;
123
+ case '/plan':
124
+ mode = 'plan';
125
+ console.log(chalk.magenta(' Mode: plan\n'));
126
+ return;
127
+ case '/code':
128
+ mode = 'code';
129
+ console.log(chalk.yellow(' Mode: code\n'));
130
+ return;
131
+ case '/sessions': {
132
+ const sessions = await listSessions(config.cwd);
133
+ if (sessions.length === 0) {
134
+ console.log(chalk.dim(' No sessions found.\n'));
135
+ return;
136
+ }
137
+ console.log();
138
+ for (const s of sessions) {
139
+ const cost = estimateCost(s.model, Math.round(s.totalTokens * 0.75), Math.round(s.totalTokens * 0.25));
140
+ const costStr = cost.known ? ` · ${formatCost(cost.total)}` : '';
141
+ console.log(chalk.dim(` ${s.id}`) + ' ' +
142
+ chalk.white(s.task.padEnd(50).slice(0, 50)) + ' ' +
143
+ chalk.dim(`${s.turns} turns${costStr}`));
144
+ }
145
+ console.log();
146
+ return;
147
+ }
148
+ default:
149
+ if (input.startsWith('/')) {
150
+ console.log(chalk.dim(` Unknown: ${input}. Try /help.\n`));
151
+ return;
152
+ }
153
+ }
154
+ // ── Task execution ────────────────────────────────────────────────────────
155
+ busy = true;
156
+ rl.pause();
157
+ const taskText = MODE_PREFIXES[mode] + input;
158
+ currentAbort = new AbortController();
159
+ const { signal } = currentAbort;
160
+ const taskStart = Date.now();
161
+ try {
162
+ await session.send(taskText, signal);
163
+ const elapsed = Date.now() - taskStart;
164
+ tui.printStats(session.stats, config.provider, config.model, elapsed);
165
+ }
166
+ catch (err) {
167
+ if (err?.name !== 'AbortError') {
168
+ tui.printError(`${err instanceof Error ? err.message : String(err)}`);
169
+ }
170
+ }
171
+ finally {
172
+ currentAbort = null;
173
+ busy = false;
174
+ rl.resume();
175
+ }
176
+ }
177
+ // ── Ctrl+C: cancel task if busy, exit if not ─────────────────────────────
178
+ process.on('SIGINT', async () => {
179
+ if (busy && currentAbort) {
180
+ currentAbort.abort();
181
+ process.stdout.write(chalk.yellow('\n ⚠ Interrupted — task cancelled.\n\n'));
182
+ // rl.resume() happens in handleLine's finally block
183
+ return;
184
+ }
185
+ // Not busy — save and exit
186
+ process.stdout.write('\n');
187
+ const file = await doSave().catch(() => '');
188
+ if (file)
189
+ console.log(chalk.dim(` Session saved: ${file}`));
190
+ process.exit(0);
191
+ });
192
+ rl.on('line', async (line) => {
193
+ await handleLine(line);
194
+ writePrompt();
195
+ });
196
+ rl.on('close', async () => {
197
+ process.stdout.write('\n');
198
+ const file = await doSave().catch(() => '');
199
+ if (file)
200
+ console.log(chalk.dim(` Session saved: ${file}`));
201
+ process.exit(0);
202
+ });
203
+ writePrompt();
204
+ }
205
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../src/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getCompletionScript(shell: string): string;
2
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAazD"}
@@ -0,0 +1,137 @@
1
+ import { PROVIDERS } from './providers.js';
2
+ export function getCompletionScript(shell) {
3
+ const providers = Object.keys(PROVIDERS).join(' ');
4
+ switch (shell.toLowerCase()) {
5
+ case 'bash':
6
+ return bashScript(providers);
7
+ case 'zsh':
8
+ return zshScript(providers);
9
+ case 'fish':
10
+ return fishScript(providers);
11
+ default:
12
+ throw new Error('Unsupported shell "' + shell + '". Choose: bash, zsh, fish');
13
+ }
14
+ }
15
+ function bashScript(providers) {
16
+ return [
17
+ '# koneck bash completion',
18
+ '# Usage: eval "$(koneck completion bash)"',
19
+ '# or: source <(koneck completion bash)',
20
+ '',
21
+ '_koneck_completions() {',
22
+ ' local cur prev',
23
+ ' COMPREPLY=()',
24
+ ' cur="${COMP_WORDS[COMP_CWORD]}"',
25
+ ' prev="${COMP_WORDS[COMP_CWORD-1]}"',
26
+ '',
27
+ ' case "$prev" in',
28
+ ' -p|--provider)',
29
+ ' COMPREPLY=( $(compgen -W "' + providers + '" -- "$cur") )',
30
+ ' return 0',
31
+ ' ;;',
32
+ ' -m|--model|-t|--max-turns|--budget|--base-url)',
33
+ ' return 0',
34
+ ' ;;',
35
+ ' --resume)',
36
+ ' local sessions_dir=".koneck/sessions"',
37
+ ' if [ -d "$sessions_dir" ]; then',
38
+ ' local ids',
39
+ " ids=$(ls \"$sessions_dir\" 2>/dev/null | sed 's/\\.jsonl$//')",
40
+ ' COMPREPLY=( $(compgen -W "$ids" -- "$cur") )',
41
+ ' fi',
42
+ ' return 0',
43
+ ' ;;',
44
+ ' -C|--cwd)',
45
+ ' COMPREPLY=( $(compgen -d -- "$cur") )',
46
+ ' return 0',
47
+ ' ;;',
48
+ ' completion)',
49
+ ' COMPREPLY=( $(compgen -W "bash zsh fish" -- "$cur") )',
50
+ ' return 0',
51
+ ' ;;',
52
+ ' esac',
53
+ '',
54
+ ' if [[ "$cur" == -* ]]; then',
55
+ ' local opts',
56
+ ' opts="-p --provider -m --model -t --max-turns -a --approve -w --worktree"',
57
+ ' opts="$opts -C --cwd -v --verbose --ci --json --budget --base-url"',
58
+ ' opts="$opts --resume --sessions --list-providers -h --help"',
59
+ ' COMPREPLY=( $(compgen -W "$opts" -- "$cur") )',
60
+ ' else',
61
+ ' COMPREPLY=( $(compgen -W "chat init completion" -- "$cur") )',
62
+ ' fi',
63
+ '}',
64
+ '',
65
+ 'complete -F _koneck_completions koneck',
66
+ '',
67
+ ].join('\n');
68
+ }
69
+ function zshScript(providers) {
70
+ const providerList = providers.split(' ').map(p => "'" + p + "'").join(' ');
71
+ return [
72
+ '#compdef koneck',
73
+ '# koneck zsh completion',
74
+ '# Usage: source <(koneck completion zsh)',
75
+ '# or: koneck completion zsh > "${fpath[1]}/_koneck"',
76
+ '',
77
+ '_koneck() {',
78
+ ' local context state state_descr line',
79
+ ' local -a providers',
80
+ ' providers=(' + providerList + ')',
81
+ '',
82
+ ' _arguments -C \\',
83
+ ' \'(-h --help)\'{-h,--help}\'[show help]\' \\',
84
+ ' \'(-p --provider)\'{-p,--provider}\'[LLM provider]:provider:($providers)\' \\',
85
+ ' \'(-m --model)\'{-m,--model}\'[model name]:model:\' \\',
86
+ ' \'(-t --max-turns)\'{-t,--max-turns}\'[max turns per task]:n:\' \\',
87
+ ' \'(-a --approve)\'{-a,--approve}\'[require approval before writes]\' \\',
88
+ ' \'(-w --worktree)\'{-w,--worktree}\'[git worktree isolation]\' \\',
89
+ ' \'(-C --cwd)\'{-C,--cwd}\'[working directory]:dir:_directories\' \\',
90
+ ' \'(-v --verbose)\'{-v,--verbose}\'[verbose output]\' \\',
91
+ ' \'--ci[CI mode: no banner, stderr output, auto-approve]\' \\',
92
+ ' \'--json[print JSON result to stdout (implies --ci)]\' \\',
93
+ " '--budget[cost limit in USD]:amount:' \\",
94
+ " '--base-url[provider base URL override]:url:' \\",
95
+ " '--resume[resume a saved session]:id:' \\",
96
+ " '--sessions[list recent sessions]' \\",
97
+ " '--list-providers[list supported providers]' \\",
98
+ " '1:command:(chat init completion)' \\",
99
+ " '*:task:'",
100
+ '}',
101
+ '',
102
+ '_koneck',
103
+ '',
104
+ ].join('\n');
105
+ }
106
+ function fishScript(providers) {
107
+ return [
108
+ '# koneck fish completions',
109
+ '# Copy to: ~/.config/fish/completions/koneck.fish',
110
+ '',
111
+ 'complete -c koneck -f',
112
+ '',
113
+ '# Subcommands',
114
+ 'complete -c koneck -n "__fish_use_subcommand" -a chat -d "Interactive chat session"',
115
+ 'complete -c koneck -n "__fish_use_subcommand" -a init -d "Initialize project config files"',
116
+ 'complete -c koneck -n "__fish_use_subcommand" -a completion -d "Generate shell completion script"',
117
+ '',
118
+ '# Flags',
119
+ 'complete -c koneck -s p -l provider -d "LLM provider" -r -a "' + providers + '"',
120
+ 'complete -c koneck -s m -l model -d "Model name" -r',
121
+ 'complete -c koneck -s t -l max-turns -d "Max turns per task" -r',
122
+ 'complete -c koneck -s a -l approve -d "Require approval before writes"',
123
+ 'complete -c koneck -s w -l worktree -d "Git worktree isolation"',
124
+ 'complete -c koneck -s C -l cwd -d "Working directory" -r -a "(__fish_complete_directories)"',
125
+ 'complete -c koneck -s v -l verbose -d "Verbose output"',
126
+ 'complete -c koneck -l ci -d "CI mode (no banner, stderr output)"',
127
+ 'complete -c koneck -l json -d "Print JSON result to stdout"',
128
+ 'complete -c koneck -l budget -d "Cost limit in USD" -r',
129
+ 'complete -c koneck -l base-url -d "Provider base URL override" -r',
130
+ 'complete -c koneck -l resume -d "Resume a saved session" -r',
131
+ 'complete -c koneck -l sessions -d "List recent sessions"',
132
+ 'complete -c koneck -l list-providers -d "List supported providers"',
133
+ 'complete -c koneck -s h -l help -d "Show help"',
134
+ '',
135
+ ].join('\n');
136
+ }
137
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type OpenAI from 'openai';
2
+ import type { Message } from './types.js';
3
+ declare function estimateTokens(messages: Message[]): number;
4
+ export declare function compressIfNeeded(messages: Message[], client: OpenAI, model: string): Promise<{
5
+ messages: Message[];
6
+ compressed: boolean;
7
+ }>;
8
+ export { estimateTokens };
9
+ //# sourceMappingURL=compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../src/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAM1C,iBAAS,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAenD;AAeD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA2CvD;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}