@ob1-sg/horizon 0.1.10 → 0.1.11
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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +293 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +629 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/attachment-downloader.test.d.ts +2 -0
- package/dist/lib/__tests__/attachment-downloader.test.d.ts.map +1 -0
- package/dist/lib/__tests__/attachment-downloader.test.js +163 -0
- package/dist/lib/__tests__/attachment-downloader.test.js.map +1 -0
- package/dist/lib/__tests__/cli-detection.test.d.ts +2 -0
- package/dist/lib/__tests__/cli-detection.test.d.ts.map +1 -0
- package/dist/lib/__tests__/cli-detection.test.js +119 -0
- package/dist/lib/__tests__/cli-detection.test.js.map +1 -0
- package/dist/lib/__tests__/config.test.d.ts +2 -0
- package/dist/lib/__tests__/config.test.d.ts.map +1 -0
- package/dist/lib/__tests__/config.test.js +291 -0
- package/dist/lib/__tests__/config.test.js.map +1 -0
- package/dist/lib/__tests__/gcp.test.d.ts +2 -0
- package/dist/lib/__tests__/gcp.test.d.ts.map +1 -0
- package/dist/lib/__tests__/gcp.test.js +104 -0
- package/dist/lib/__tests__/gcp.test.js.map +1 -0
- package/dist/lib/__tests__/git.test.d.ts +2 -0
- package/dist/lib/__tests__/git.test.d.ts.map +1 -0
- package/dist/lib/__tests__/git.test.js +62 -0
- package/dist/lib/__tests__/git.test.js.map +1 -0
- package/dist/lib/__tests__/linear-quick-check.test.d.ts +2 -0
- package/dist/lib/__tests__/linear-quick-check.test.d.ts.map +1 -0
- package/dist/lib/__tests__/linear-quick-check.test.js +152 -0
- package/dist/lib/__tests__/linear-quick-check.test.js.map +1 -0
- package/dist/lib/__tests__/loop-instance-name.test.d.ts +2 -0
- package/dist/lib/__tests__/loop-instance-name.test.d.ts.map +1 -0
- package/dist/lib/__tests__/loop-instance-name.test.js +90 -0
- package/dist/lib/__tests__/loop-instance-name.test.js.map +1 -0
- package/dist/lib/__tests__/output-logger.test.d.ts +2 -0
- package/dist/lib/__tests__/output-logger.test.d.ts.map +1 -0
- package/dist/lib/__tests__/output-logger.test.js +136 -0
- package/dist/lib/__tests__/output-logger.test.js.map +1 -0
- package/dist/lib/__tests__/prompts.test.d.ts +2 -0
- package/dist/lib/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/lib/__tests__/prompts.test.js +70 -0
- package/dist/lib/__tests__/prompts.test.js.map +1 -0
- package/dist/lib/__tests__/provider.test.d.ts +2 -0
- package/dist/lib/__tests__/provider.test.d.ts.map +1 -0
- package/dist/lib/__tests__/provider.test.js +89 -0
- package/dist/lib/__tests__/provider.test.js.map +1 -0
- package/dist/lib/__tests__/rate-limit.test.d.ts +2 -0
- package/dist/lib/__tests__/rate-limit.test.d.ts.map +1 -0
- package/dist/lib/__tests__/rate-limit.test.js +275 -0
- package/dist/lib/__tests__/rate-limit.test.js.map +1 -0
- package/dist/lib/__tests__/readline.test.d.ts +2 -0
- package/dist/lib/__tests__/readline.test.d.ts.map +1 -0
- package/dist/lib/__tests__/readline.test.js +55 -0
- package/dist/lib/__tests__/readline.test.js.map +1 -0
- package/dist/lib/__tests__/stats-logger.test.d.ts +2 -0
- package/dist/lib/__tests__/stats-logger.test.d.ts.map +1 -0
- package/dist/lib/__tests__/stats-logger.test.js +297 -0
- package/dist/lib/__tests__/stats-logger.test.js.map +1 -0
- package/dist/lib/__tests__/update-checker.test.d.ts +2 -0
- package/dist/lib/__tests__/update-checker.test.d.ts.map +1 -0
- package/dist/lib/__tests__/update-checker.test.js +141 -0
- package/dist/lib/__tests__/update-checker.test.js.map +1 -0
- package/dist/lib/__tests__/version.test.d.ts +2 -0
- package/dist/lib/__tests__/version.test.d.ts.map +1 -0
- package/dist/lib/__tests__/version.test.js +51 -0
- package/dist/lib/__tests__/version.test.js.map +1 -0
- package/dist/lib/attachment-downloader.d.ts +26 -0
- package/dist/lib/attachment-downloader.d.ts.map +1 -0
- package/dist/lib/attachment-downloader.js +259 -0
- package/dist/lib/attachment-downloader.js.map +1 -0
- package/dist/lib/claude.d.ts +6 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +358 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/cli-detection.d.ts +25 -0
- package/dist/lib/cli-detection.d.ts.map +1 -0
- package/dist/lib/cli-detection.js +53 -0
- package/dist/lib/cli-detection.js.map +1 -0
- package/dist/lib/codex.d.ts +4 -0
- package/dist/lib/codex.d.ts.map +1 -0
- package/dist/lib/codex.js +285 -0
- package/dist/lib/codex.js.map +1 -0
- package/dist/lib/gcp.d.ts +21 -0
- package/dist/lib/gcp.d.ts.map +1 -0
- package/dist/lib/gcp.js +96 -0
- package/dist/lib/gcp.js.map +1 -0
- package/dist/lib/git.d.ts +3 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +24 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/init-project.d.ts +13 -0
- package/dist/lib/init-project.d.ts.map +1 -0
- package/dist/lib/init-project.js +420 -0
- package/dist/lib/init-project.js.map +1 -0
- package/dist/lib/linear-api.d.ts +32 -0
- package/dist/lib/linear-api.d.ts.map +1 -0
- package/dist/lib/linear-api.js +267 -0
- package/dist/lib/linear-api.js.map +1 -0
- package/dist/lib/linear-quick-check.d.ts +13 -0
- package/dist/lib/linear-quick-check.d.ts.map +1 -0
- package/dist/lib/linear-quick-check.js +61 -0
- package/dist/lib/linear-quick-check.js.map +1 -0
- package/dist/lib/loop-instance-name.d.ts +29 -0
- package/dist/lib/loop-instance-name.d.ts.map +1 -0
- package/dist/lib/loop-instance-name.js +105 -0
- package/dist/lib/loop-instance-name.js.map +1 -0
- package/dist/lib/output-logger.d.ts +23 -0
- package/dist/lib/output-logger.d.ts.map +1 -0
- package/dist/lib/output-logger.js +104 -0
- package/dist/lib/output-logger.js.map +1 -0
- package/dist/lib/prompts.d.ts +17 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +65 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/provider.d.ts +32 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +27 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/rate-limit.d.ts +14 -0
- package/dist/lib/rate-limit.d.ts.map +1 -0
- package/dist/lib/rate-limit.js +154 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/readline.d.ts +4 -0
- package/dist/lib/readline.d.ts.map +1 -0
- package/dist/lib/readline.js +39 -0
- package/dist/lib/readline.js.map +1 -0
- package/dist/lib/setup.d.ts +123 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +492 -0
- package/dist/lib/setup.js.map +1 -0
- package/dist/lib/stats-logger.d.ts +92 -0
- package/dist/lib/stats-logger.d.ts.map +1 -0
- package/dist/lib/stats-logger.js +258 -0
- package/dist/lib/stats-logger.js.map +1 -0
- package/dist/lib/update-checker.d.ts +17 -0
- package/dist/lib/update-checker.d.ts.map +1 -0
- package/dist/lib/update-checker.js +140 -0
- package/dist/lib/update-checker.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +37 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-logger.js","sourceRoot":"","sources":["../../src/lib/output-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads a prompt from .horizon/prompts/ (preferred) or package prompts/ (fallback).
|
|
3
|
+
* Supports template variables in the format {{VARIABLE_NAME}}.
|
|
4
|
+
*
|
|
5
|
+
* @param name - Prompt name without .md extension
|
|
6
|
+
* @param variables - Optional object of variable names to values for template substitution
|
|
7
|
+
* @returns The prompt content with variables substituted
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadPrompt(name: string, variables?: Record<string, string>): string;
|
|
10
|
+
/**
|
|
11
|
+
* Loads a prompt fragment from the fragments/ subdirectory.
|
|
12
|
+
*
|
|
13
|
+
* @param name - Fragment name without .md extension (e.g., 'merge-direct')
|
|
14
|
+
* @returns The fragment content
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadPromptFragment(name: string): string;
|
|
17
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA2BnF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBvD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { getRepoRoot } from '../config.js';
|
|
5
|
+
// Get the package directory for fallback prompts
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
const PACKAGE_ROOT = join(__dirname, '../..');
|
|
9
|
+
/**
|
|
10
|
+
* Loads a prompt from .horizon/prompts/ (preferred) or package prompts/ (fallback).
|
|
11
|
+
* Supports template variables in the format {{VARIABLE_NAME}}.
|
|
12
|
+
*
|
|
13
|
+
* @param name - Prompt name without .md extension
|
|
14
|
+
* @param variables - Optional object of variable names to values for template substitution
|
|
15
|
+
* @returns The prompt content with variables substituted
|
|
16
|
+
*/
|
|
17
|
+
export function loadPrompt(name, variables) {
|
|
18
|
+
// Try .horizon/prompts/ first (project-local)
|
|
19
|
+
const projectPromptPath = join(getRepoRoot(), '.horizon', 'prompts', `${name}.md`);
|
|
20
|
+
// Fallback to package prompts/
|
|
21
|
+
const packagePromptPath = join(PACKAGE_ROOT, 'prompts', `${name}.md`);
|
|
22
|
+
let promptPath;
|
|
23
|
+
if (existsSync(projectPromptPath)) {
|
|
24
|
+
promptPath = projectPromptPath;
|
|
25
|
+
}
|
|
26
|
+
else if (existsSync(packagePromptPath)) {
|
|
27
|
+
promptPath = packagePromptPath;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
throw new Error(`Prompt not found: ${name}`);
|
|
31
|
+
}
|
|
32
|
+
let content = readFileSync(promptPath, 'utf-8');
|
|
33
|
+
// Substitute template variables
|
|
34
|
+
if (variables) {
|
|
35
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
36
|
+
const placeholder = `{{${key}}}`;
|
|
37
|
+
content = content.replace(new RegExp(placeholder.replace(/[{}]/g, '\\$&'), 'g'), value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return content;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Loads a prompt fragment from the fragments/ subdirectory.
|
|
44
|
+
*
|
|
45
|
+
* @param name - Fragment name without .md extension (e.g., 'merge-direct')
|
|
46
|
+
* @returns The fragment content
|
|
47
|
+
*/
|
|
48
|
+
export function loadPromptFragment(name) {
|
|
49
|
+
// Try .horizon/prompts/fragments/ first
|
|
50
|
+
const projectFragmentPath = join(getRepoRoot(), '.horizon', 'prompts', 'fragments', `${name}.md`);
|
|
51
|
+
// Fallback to package prompts/fragments/
|
|
52
|
+
const packageFragmentPath = join(PACKAGE_ROOT, 'prompts', 'fragments', `${name}.md`);
|
|
53
|
+
let fragmentPath;
|
|
54
|
+
if (existsSync(projectFragmentPath)) {
|
|
55
|
+
fragmentPath = projectFragmentPath;
|
|
56
|
+
}
|
|
57
|
+
else if (existsSync(packageFragmentPath)) {
|
|
58
|
+
fragmentPath = packageFragmentPath;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error(`Prompt fragment not found: ${name}`);
|
|
62
|
+
}
|
|
63
|
+
return readFileSync(fragmentPath, 'utf-8');
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,iDAAiD;AACjD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,SAAkC;IACzE,8CAA8C;IAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAEnF,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAEtE,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClC,UAAU,GAAG,iBAAiB,CAAC;IACjC,CAAC;SAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,UAAU,GAAG,iBAAiB,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEhD,gCAAgC;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;YACjC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,wCAAwC;IACxC,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAElG,yCAAyC;IACzC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAErF,IAAI,YAAoB,CAAC;IACzB,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpC,YAAY,GAAG,mBAAmB,CAAC;IACrC,CAAC;SAAM,IAAI,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC3C,YAAY,GAAG,mBAAmB,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type ProviderName = 'claude' | 'codex';
|
|
2
|
+
export type ClaudeModel = 'opus' | 'sonnet' | 'haiku';
|
|
3
|
+
export type CodexReasoningEffort = 'low' | 'medium' | 'high' | 'extra_high';
|
|
4
|
+
export interface ProviderOptions {
|
|
5
|
+
prompt: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
allowedTools?: string[];
|
|
8
|
+
reasoningEffort?: CodexReasoningEffort;
|
|
9
|
+
}
|
|
10
|
+
export interface ProviderResult {
|
|
11
|
+
output: string;
|
|
12
|
+
finalOutput: string;
|
|
13
|
+
rateLimited: boolean;
|
|
14
|
+
retryAfterMs?: number;
|
|
15
|
+
cost: number;
|
|
16
|
+
costEstimated: boolean;
|
|
17
|
+
duration: number;
|
|
18
|
+
exitCode: number;
|
|
19
|
+
tokenUsage: {
|
|
20
|
+
input: number;
|
|
21
|
+
output: number;
|
|
22
|
+
cached: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface LLMProvider {
|
|
26
|
+
readonly name: ProviderName;
|
|
27
|
+
spawn(options: ProviderOptions, agentNumber?: number): Promise<ProviderResult>;
|
|
28
|
+
}
|
|
29
|
+
export declare function registerClaudeProvider(factory: () => LLMProvider): void;
|
|
30
|
+
export declare function registerCodexProvider(factory: () => LLMProvider): void;
|
|
31
|
+
export declare function createProvider(name: ProviderName): LLMProvider;
|
|
32
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/lib/provider.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,eAAe,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChF;AAMD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,WAAW,GAAG,IAAI,CAEvE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,WAAW,GAAG,IAAI,CAEtE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAe9D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Provider abstraction for LLM CLI tools (Claude Code and ChatGPT Codex)
|
|
2
|
+
// Factory function - will be populated after provider implementations are defined
|
|
3
|
+
let createClaudeProviderFn = null;
|
|
4
|
+
let createCodexProviderFn = null;
|
|
5
|
+
export function registerClaudeProvider(factory) {
|
|
6
|
+
createClaudeProviderFn = factory;
|
|
7
|
+
}
|
|
8
|
+
export function registerCodexProvider(factory) {
|
|
9
|
+
createCodexProviderFn = factory;
|
|
10
|
+
}
|
|
11
|
+
export function createProvider(name) {
|
|
12
|
+
switch (name) {
|
|
13
|
+
case 'claude':
|
|
14
|
+
if (!createClaudeProviderFn) {
|
|
15
|
+
throw new Error('Claude provider not registered. Import claude.ts first.');
|
|
16
|
+
}
|
|
17
|
+
return createClaudeProviderFn();
|
|
18
|
+
case 'codex':
|
|
19
|
+
if (!createCodexProviderFn) {
|
|
20
|
+
throw new Error('Codex provider not registered. Import codex.ts first.');
|
|
21
|
+
}
|
|
22
|
+
return createCodexProviderFn();
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Unknown provider: ${name}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/lib/provider.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAoCzE,kFAAkF;AAClF,IAAI,sBAAsB,GAA+B,IAAI,CAAC;AAC9D,IAAI,qBAAqB,GAA+B,IAAI,CAAC;AAE7D,MAAM,UAAU,sBAAsB,CAAC,OAA0B;IAC/D,sBAAsB,GAAG,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,qBAAqB,GAAG,OAAO,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,sBAAsB,EAAE,CAAC;QAClC,KAAK,OAAO;YACV,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,qBAAqB,EAAE,CAAC;QACjC;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
2
|
+
export declare function handleRateLimit(retryAfterMs: number): Promise<void>;
|
|
3
|
+
export declare function parseRateLimitReset(jsonOrText: unknown): number;
|
|
4
|
+
export declare function isRateLimitError(text: string): boolean;
|
|
5
|
+
export interface RateLimitRetryConfig {
|
|
6
|
+
maxRetries: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_RETRY_CONFIG: RateLimitRetryConfig;
|
|
9
|
+
export interface RateLimitableResult {
|
|
10
|
+
rateLimited: boolean;
|
|
11
|
+
retryAfterMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function executeWithRateLimitRetry<T extends RateLimitableResult>(operation: () => Promise<T>, config: RateLimitRetryConfig, agentName: string): Promise<T>;
|
|
14
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/lib/rate-limit.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAqCD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CA6E/D;AAkBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAGD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,oBAAoB,EAAE,oBAElC,CAAC;AAGF,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,wBAAsB,yBAAyB,CAAC,CAAC,SAAS,mBAAmB,EAC3E,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Rate limit detection and handling utilities
|
|
2
|
+
export function sleep(ms) {
|
|
3
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
4
|
+
}
|
|
5
|
+
export async function handleRateLimit(retryAfterMs) {
|
|
6
|
+
const minutes = Math.ceil(retryAfterMs / 60000);
|
|
7
|
+
console.log(`Rate limited. Sleeping ${minutes} minute(s)...`);
|
|
8
|
+
await sleep(retryAfterMs);
|
|
9
|
+
}
|
|
10
|
+
// Timezone abbreviation to UTC offset mapping (hours)
|
|
11
|
+
const TIMEZONE_OFFSETS = {
|
|
12
|
+
// US Timezones
|
|
13
|
+
'PST': -8, 'PDT': -7,
|
|
14
|
+
'MST': -7, 'MDT': -6,
|
|
15
|
+
'CST': -6, 'CDT': -5,
|
|
16
|
+
'EST': -5, 'EDT': -4,
|
|
17
|
+
// Common others
|
|
18
|
+
'UTC': 0, 'GMT': 0,
|
|
19
|
+
};
|
|
20
|
+
// Get UTC offset for an IANA timezone name (e.g., "America/Los_Angeles")
|
|
21
|
+
function getIANATimezoneOffset(tz) {
|
|
22
|
+
try {
|
|
23
|
+
const date = new Date();
|
|
24
|
+
const utcDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
|
|
25
|
+
const tzDate = new Date(date.toLocaleString('en-US', { timeZone: tz }));
|
|
26
|
+
return (tzDate.getTime() - utcDate.getTime()) / (1000 * 60 * 60);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null; // Invalid timezone
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Get UTC offset from timezone string (abbreviation or IANA name)
|
|
33
|
+
function getTimezoneOffset(tz) {
|
|
34
|
+
// Check abbreviation mapping first
|
|
35
|
+
const abbrevOffset = TIMEZONE_OFFSETS[tz.toUpperCase()];
|
|
36
|
+
if (abbrevOffset !== undefined) {
|
|
37
|
+
return abbrevOffset;
|
|
38
|
+
}
|
|
39
|
+
// Try as IANA timezone name
|
|
40
|
+
return getIANATimezoneOffset(tz);
|
|
41
|
+
}
|
|
42
|
+
// Parse rate limit reset time from Claude error messages
|
|
43
|
+
export function parseRateLimitReset(jsonOrText) {
|
|
44
|
+
let text = '';
|
|
45
|
+
if (typeof jsonOrText === 'string') {
|
|
46
|
+
text = jsonOrText;
|
|
47
|
+
}
|
|
48
|
+
else if (jsonOrText && typeof jsonOrText === 'object') {
|
|
49
|
+
const json = jsonOrText;
|
|
50
|
+
text = String(json.result || '');
|
|
51
|
+
if (!text && json.message && typeof json.message === 'object') {
|
|
52
|
+
const msg = json.message;
|
|
53
|
+
if (Array.isArray(msg.content) && msg.content[0]?.text) {
|
|
54
|
+
text = String(msg.content[0].text);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Try to extract reset time from message like "resets at 10:30 am (PST)" or "resets 12am (America/Los_Angeles)"
|
|
59
|
+
// Pattern matches: time, optional am/pm, optional timezone in parentheses
|
|
60
|
+
const match = text.match(/resets?\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);
|
|
61
|
+
if (match) {
|
|
62
|
+
let hours = parseInt(match[1], 10);
|
|
63
|
+
const minutes = match[2] ? parseInt(match[2], 10) : 0;
|
|
64
|
+
const period = match[3]?.toLowerCase();
|
|
65
|
+
const timezoneStr = match[4]?.trim();
|
|
66
|
+
if (period === 'pm' && hours !== 12) {
|
|
67
|
+
hours += 12;
|
|
68
|
+
}
|
|
69
|
+
else if (period === 'am' && hours === 12) {
|
|
70
|
+
hours = 0;
|
|
71
|
+
}
|
|
72
|
+
const now = new Date();
|
|
73
|
+
// Calculate reset time with timezone awareness
|
|
74
|
+
let resetTime;
|
|
75
|
+
if (timezoneStr) {
|
|
76
|
+
const tzOffset = getTimezoneOffset(timezoneStr);
|
|
77
|
+
if (tzOffset !== null) {
|
|
78
|
+
// Create reset time in the specified timezone
|
|
79
|
+
// Convert "hours:minutes in timezone X" to UTC
|
|
80
|
+
// Reset time in UTC: take the specified time and subtract the timezone offset
|
|
81
|
+
const resetUTCHours = hours - tzOffset;
|
|
82
|
+
resetTime = new Date();
|
|
83
|
+
resetTime.setUTCHours(resetUTCHours, minutes, 0, 0);
|
|
84
|
+
// If reset time is in the past, assume it's tomorrow
|
|
85
|
+
if (resetTime <= now) {
|
|
86
|
+
resetTime.setUTCDate(resetTime.getUTCDate() + 1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// Unknown timezone - fall back to local time
|
|
91
|
+
console.log(`Unknown timezone "${timezoneStr}", using local time`);
|
|
92
|
+
resetTime = new Date();
|
|
93
|
+
resetTime.setHours(hours, minutes, 0, 0);
|
|
94
|
+
if (resetTime <= now) {
|
|
95
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// No timezone specified - assume local time (existing behavior)
|
|
101
|
+
resetTime = new Date();
|
|
102
|
+
resetTime.setHours(hours, minutes, 0, 0);
|
|
103
|
+
if (resetTime <= now) {
|
|
104
|
+
resetTime.setDate(resetTime.getDate() + 1);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const msUntilReset = resetTime.getTime() - now.getTime();
|
|
108
|
+
// Add 1 minute buffer
|
|
109
|
+
return msUntilReset + 60000;
|
|
110
|
+
}
|
|
111
|
+
// Default: wait 5 minutes
|
|
112
|
+
return 5 * 60 * 1000;
|
|
113
|
+
}
|
|
114
|
+
// Rate limit patterns for both Claude and Codex
|
|
115
|
+
const rateLimitPatterns = [
|
|
116
|
+
// Common patterns
|
|
117
|
+
/rate.?limit/i,
|
|
118
|
+
/too many requests/i,
|
|
119
|
+
/quota exceeded/i,
|
|
120
|
+
/usage.?limit/i,
|
|
121
|
+
// Claude-specific
|
|
122
|
+
/hit your limit/i,
|
|
123
|
+
// Codex-specific
|
|
124
|
+
/RateLimitError/i,
|
|
125
|
+
/request limit reached/i,
|
|
126
|
+
/exceeded.*quota/i,
|
|
127
|
+
];
|
|
128
|
+
// Check if an error message indicates a rate limit
|
|
129
|
+
export function isRateLimitError(text) {
|
|
130
|
+
return rateLimitPatterns.some(pattern => pattern.test(text));
|
|
131
|
+
}
|
|
132
|
+
export const DEFAULT_RETRY_CONFIG = {
|
|
133
|
+
maxRetries: 3,
|
|
134
|
+
};
|
|
135
|
+
// Execute an operation with automatic retry on rate limits
|
|
136
|
+
export async function executeWithRateLimitRetry(operation, config, agentName) {
|
|
137
|
+
let attempt = 0;
|
|
138
|
+
while (true) {
|
|
139
|
+
const result = await operation();
|
|
140
|
+
if (!result.rateLimited) {
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
attempt++;
|
|
144
|
+
if (attempt >= config.maxRetries) {
|
|
145
|
+
console.log(`[Rate Limit] ${agentName} rate limited ${attempt} times, max retries reached. Continuing...`);
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
const waitMs = result.retryAfterMs || 5 * 60 * 1000;
|
|
149
|
+
console.log(`[Rate Limit] ${agentName} rate limited (attempt ${attempt}/${config.maxRetries}). Waiting for reset...`);
|
|
150
|
+
await handleRateLimit(waitMs);
|
|
151
|
+
console.log(`[Rate Limit] Retrying ${agentName}...`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/lib/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function prompt(question: string): Promise<string>;
|
|
2
|
+
export declare function confirm(question: string): Promise<boolean>;
|
|
3
|
+
export declare function selectFromList(question: string, options: string[]): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=readline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readline.d.ts","sourceRoot":"","sources":["../../src/lib/readline.ts"],"names":[],"mappings":"AAWA,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS9D;AAGD,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhE;AAGD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
// Create a readline interface for interactive input
|
|
3
|
+
function createInterface() {
|
|
4
|
+
return readline.createInterface({
|
|
5
|
+
input: process.stdin,
|
|
6
|
+
output: process.stdout,
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
// Prompt user for text input
|
|
10
|
+
export async function prompt(question) {
|
|
11
|
+
const rl = createInterface();
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
rl.question(question, (answer) => {
|
|
14
|
+
rl.close();
|
|
15
|
+
resolve(answer.trim());
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
// Prompt user for yes/no confirmation
|
|
20
|
+
export async function confirm(question) {
|
|
21
|
+
const answer = await prompt(`${question} (y/n): `);
|
|
22
|
+
return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
|
|
23
|
+
}
|
|
24
|
+
// Display a list and prompt user to select one
|
|
25
|
+
export async function selectFromList(question, options) {
|
|
26
|
+
console.log(question);
|
|
27
|
+
options.forEach((option, index) => {
|
|
28
|
+
console.log(` ${index + 1}. ${option}`);
|
|
29
|
+
});
|
|
30
|
+
const answer = await prompt('Enter number: ');
|
|
31
|
+
const index = parseInt(answer, 10) - 1;
|
|
32
|
+
if (index >= 0 && index < options.length) {
|
|
33
|
+
return options[index];
|
|
34
|
+
}
|
|
35
|
+
// Invalid selection - recursively ask again
|
|
36
|
+
console.log('Invalid selection. Please try again.');
|
|
37
|
+
return selectFromList(question, options);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=readline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readline.js","sourceRoot":"","sources":["../../src/lib/readline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,oDAAoD;AACpD,SAAS,eAAe;IACtB,OAAO,QAAQ,CAAC,eAAe,CAAC;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB;IAC3C,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;AACxE,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAiB;IACtE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,4CAA4C;IAC5C,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared setup module for Horizon configuration.
|
|
3
|
+
* Used by both `horizon` (main loop) and `horizon config` commands.
|
|
4
|
+
*/
|
|
5
|
+
import { createInterface } from 'readline';
|
|
6
|
+
import { CliAvailability } from './cli-detection.js';
|
|
7
|
+
import { ProviderName, ClaudeModel, CodexReasoningEffort, InitResult, MergeMode } from '../types.js';
|
|
8
|
+
export interface TeamInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
key: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
export interface LoadedConfig {
|
|
14
|
+
linearApiKey?: string;
|
|
15
|
+
linearTeamKey?: string;
|
|
16
|
+
provider?: ProviderName;
|
|
17
|
+
claudeModel?: ClaudeModel;
|
|
18
|
+
codexModel?: string;
|
|
19
|
+
codexReasoningEffort?: CodexReasoningEffort;
|
|
20
|
+
maxIterations?: number;
|
|
21
|
+
mergeMode?: MergeMode;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Ensures .horizon/ directory exists.
|
|
25
|
+
* Returns the path to the directory.
|
|
26
|
+
*/
|
|
27
|
+
export declare function ensureHorizonDir(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Ensures horizon-docs/ directory exists with README.
|
|
30
|
+
*/
|
|
31
|
+
export declare function ensureHorizonDocsDir(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Ensures .horizon/ is in .gitignore.
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureGitignore(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Loads existing configuration from .horizon/env file.
|
|
38
|
+
*/
|
|
39
|
+
export declare function loadExistingConfig(): LoadedConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Saves configuration to .horizon/env file.
|
|
42
|
+
*/
|
|
43
|
+
export declare function saveEnvConfig(config: LoadedConfig): void;
|
|
44
|
+
/**
|
|
45
|
+
* Saves MCP configuration with Linear API key.
|
|
46
|
+
*/
|
|
47
|
+
export declare function saveMcpConfig(apiKey: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Saves Codex MCP configuration to global ~/.codex/config.toml.
|
|
50
|
+
* Uses bearer_token_env_var so the actual API key stays in .horizon/env.
|
|
51
|
+
*/
|
|
52
|
+
export declare function saveCodexMcpConfig(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Checks which CLIs are available and displays results one-by-one.
|
|
55
|
+
* Provides real-time feedback as each check completes.
|
|
56
|
+
* Returns availability, or undefined if neither is installed.
|
|
57
|
+
*/
|
|
58
|
+
export declare function checkAndDisplayCliAvailability(): CliAvailability | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Auto-selects provider based on CLI availability.
|
|
61
|
+
* Prefers Claude if both are available.
|
|
62
|
+
*/
|
|
63
|
+
export declare function autoSelectProvider(availability: CliAvailability): ProviderName;
|
|
64
|
+
/**
|
|
65
|
+
* Validates a Linear API key.
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateLinearKey(apiKey: string): Promise<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* Fetches available teams from Linear.
|
|
70
|
+
*/
|
|
71
|
+
export declare function fetchLinearTeams(apiKey: string): Promise<TeamInfo[]>;
|
|
72
|
+
/**
|
|
73
|
+
* Checks if Linear ∞ statuses exist.
|
|
74
|
+
*/
|
|
75
|
+
export declare function checkLinearStatuses(apiKey: string, teamKey: string): Promise<boolean>;
|
|
76
|
+
/**
|
|
77
|
+
* Creates Linear ∞ statuses.
|
|
78
|
+
* Returns result with created/existing/errors counts.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createLinearStatuses(apiKey: string, teamKey: string): Promise<InitResult>;
|
|
81
|
+
/**
|
|
82
|
+
* Copies prompts from package to .horizon/prompts/.
|
|
83
|
+
* Assembles prompts with merge fragment based on current config.
|
|
84
|
+
*/
|
|
85
|
+
export declare function copyPromptsToProject(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Creates a readline interface for prompting.
|
|
88
|
+
*/
|
|
89
|
+
export declare function createPromptInterface(): ReturnType<typeof createInterface>;
|
|
90
|
+
/**
|
|
91
|
+
* Prompts for input with optional default value.
|
|
92
|
+
*/
|
|
93
|
+
export declare function promptWithDefault(rl: ReturnType<typeof createInterface>, question: string, defaultValue?: string): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Prompts for a secret value (doesn't show default).
|
|
96
|
+
*/
|
|
97
|
+
export declare function promptSecret(rl: ReturnType<typeof createInterface>, question: string): Promise<string>;
|
|
98
|
+
/**
|
|
99
|
+
* Prompts for yes/no confirmation.
|
|
100
|
+
*/
|
|
101
|
+
export declare function promptConfirm(rl: ReturnType<typeof createInterface>, question: string, defaultYes?: boolean): Promise<boolean>;
|
|
102
|
+
/**
|
|
103
|
+
* Option for numbered selection prompts.
|
|
104
|
+
*/
|
|
105
|
+
export interface SelectOption<T> {
|
|
106
|
+
value: T;
|
|
107
|
+
label: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Prompts user to select from a numbered list.
|
|
112
|
+
* Shows options as numbered list and accepts number input.
|
|
113
|
+
* Returns the selected option's value.
|
|
114
|
+
*/
|
|
115
|
+
export declare function promptSelect<T>(rl: ReturnType<typeof createInterface>, options: SelectOption<T>[], defaultIndex?: number): Promise<T>;
|
|
116
|
+
/**
|
|
117
|
+
* Masks an API key for display (shows last 4 chars).
|
|
118
|
+
*/
|
|
119
|
+
export declare function maskApiKey(apiKey: string): string;
|
|
120
|
+
export { checkCodexLinearMcpConfigured as checkCodexLinearMcp } from './codex.js';
|
|
121
|
+
export { HORIZON_STATUS_PREFIX } from './linear-api.js';
|
|
122
|
+
export { CliAvailability } from './cli-detection.js';
|
|
123
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAU3C,OAAO,EAAwD,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQrG,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAmBD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAgC3C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAyBtC;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAoDjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAyCxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA4BlD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAqCzC;AAMD;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,eAAe,GAAG,SAAS,CAqC5E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,eAAe,GAAG,YAAY,CAG9E;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAQ1E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAc/F;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAiE3C;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,UAAU,CAAC,OAAO,eAAe,CAAC,CAE1E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACtC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,UAAO,GAChB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACtC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC1B,YAAY,SAAI,GACf,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjD;AAMD,OAAO,EAAE,6BAA6B,IAAI,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGlF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|