repowise 0.1.4 → 0.1.6

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 (66) hide show
  1. package/dist/bin/repowise.js +116 -14
  2. package/dist/src/commands/create.d.ts +1 -1
  3. package/dist/src/commands/create.d.ts.map +1 -1
  4. package/dist/src/commands/create.js +237 -2
  5. package/dist/src/commands/create.js.map +1 -1
  6. package/dist/src/commands/listen.d.ts +3 -2
  7. package/dist/src/commands/listen.d.ts.map +1 -1
  8. package/dist/src/commands/listen.js +45 -3
  9. package/dist/src/commands/listen.js.map +1 -1
  10. package/dist/src/commands/login.d.ts +4 -1
  11. package/dist/src/commands/login.d.ts.map +1 -1
  12. package/dist/src/commands/login.js +56 -2
  13. package/dist/src/commands/login.js.map +1 -1
  14. package/dist/src/commands/logout.d.ts +1 -1
  15. package/dist/src/commands/logout.d.ts.map +1 -1
  16. package/dist/src/commands/logout.js +10 -2
  17. package/dist/src/commands/logout.js.map +1 -1
  18. package/dist/src/commands/start.d.ts +2 -0
  19. package/dist/src/commands/start.d.ts.map +1 -0
  20. package/dist/src/commands/start.js +17 -0
  21. package/dist/src/commands/start.js.map +1 -0
  22. package/dist/src/commands/status.d.ts +1 -1
  23. package/dist/src/commands/status.d.ts.map +1 -1
  24. package/dist/src/commands/status.js +61 -2
  25. package/dist/src/commands/status.js.map +1 -1
  26. package/dist/src/commands/stop.d.ts +2 -0
  27. package/dist/src/commands/stop.d.ts.map +1 -0
  28. package/dist/src/commands/stop.js +17 -0
  29. package/dist/src/commands/stop.js.map +1 -0
  30. package/dist/src/lib/ai-tools.d.ts +23 -0
  31. package/dist/src/lib/ai-tools.d.ts.map +1 -0
  32. package/dist/src/lib/ai-tools.js +193 -0
  33. package/dist/src/lib/ai-tools.js.map +1 -0
  34. package/dist/src/lib/api.d.ts.map +1 -1
  35. package/dist/src/lib/api.js +25 -4
  36. package/dist/src/lib/api.js.map +1 -1
  37. package/dist/src/lib/auth.d.ts +18 -0
  38. package/dist/src/lib/auth.d.ts.map +1 -1
  39. package/dist/src/lib/auth.js +251 -7
  40. package/dist/src/lib/auth.js.map +1 -1
  41. package/dist/src/lib/config.d.ts +2 -0
  42. package/dist/src/lib/config.d.ts.map +1 -1
  43. package/dist/src/lib/config.js.map +1 -1
  44. package/dist/src/lib/env.d.ts +10 -0
  45. package/dist/src/lib/env.d.ts.map +1 -0
  46. package/dist/src/lib/env.js +26 -0
  47. package/dist/src/lib/env.js.map +1 -0
  48. package/dist/src/lib/interview-handler.d.ts +2 -0
  49. package/dist/src/lib/interview-handler.d.ts.map +1 -0
  50. package/dist/src/lib/interview-handler.js +96 -0
  51. package/dist/src/lib/interview-handler.js.map +1 -0
  52. package/dist/src/lib/progress-renderer.d.ts +69 -0
  53. package/dist/src/lib/progress-renderer.d.ts.map +1 -0
  54. package/dist/src/lib/progress-renderer.js +186 -0
  55. package/dist/src/lib/progress-renderer.js.map +1 -0
  56. package/dist/src/lib/prompts.d.ts +6 -1
  57. package/dist/src/lib/prompts.d.ts.map +1 -1
  58. package/dist/src/lib/prompts.js +21 -3
  59. package/dist/src/lib/prompts.js.map +1 -1
  60. package/dist/src/types/index.d.ts +1 -0
  61. package/dist/src/types/index.d.ts.map +1 -1
  62. package/dist/tsup.config.d.ts +3 -0
  63. package/dist/tsup.config.d.ts.map +1 -0
  64. package/dist/tsup.config.js +18 -0
  65. package/dist/tsup.config.js.map +1 -0
  66. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function start(): Promise<void>;
2
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"AAAA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB3C"}
@@ -0,0 +1,17 @@
1
+ export async function start() {
2
+ try {
3
+ const { isRunning, startBackground } = await import('@repowise/listener/process-manager');
4
+ if (await isRunning()) {
5
+ console.log('Listener is already running.');
6
+ return;
7
+ }
8
+ const pid = await startBackground();
9
+ console.log(`Listener started (PID: ${pid}).`);
10
+ }
11
+ catch (err) {
12
+ const message = err instanceof Error ? err.message : 'Unknown error';
13
+ console.error(`Failed to start listener: ${message}`);
14
+ process.exitCode = 1;
15
+ }
16
+ }
17
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/start.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAE1F,IAAI,MAAM,SAAS,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare function status(): void;
1
+ export declare function status(): Promise<void>;
2
2
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,IAAI,IAAI,CAE7B"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAUA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA8D5C"}
@@ -1,4 +1,63 @@
1
- export function status() {
2
- console.log('Status command - not yet implemented');
1
+ import { readFile } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ const STATE_PATH = join(homedir(), '.repowise', 'listener-state.json');
5
+ export async function status() {
6
+ let state = null;
7
+ try {
8
+ const data = await readFile(STATE_PATH, 'utf-8');
9
+ state = JSON.parse(data);
10
+ }
11
+ catch {
12
+ // No state file — listener hasn't run yet
13
+ }
14
+ // Check process status
15
+ let processRunning = false;
16
+ let pid = null;
17
+ try {
18
+ const { getStatus } = await import('@repowise/listener/process-manager');
19
+ const processStatus = await getStatus();
20
+ processRunning = processStatus.running;
21
+ pid = processStatus.pid;
22
+ }
23
+ catch {
24
+ // process-manager not available
25
+ }
26
+ // Check service registration
27
+ let serviceInstalled = false;
28
+ try {
29
+ const { isInstalled } = await import('@repowise/listener/service-installer');
30
+ serviceInstalled = await isInstalled();
31
+ }
32
+ catch {
33
+ // service-installer not available
34
+ }
35
+ console.log('RepoWise Status');
36
+ console.log('===============');
37
+ if (processRunning) {
38
+ console.log(`Listener: running (PID: ${pid})`);
39
+ }
40
+ else {
41
+ console.log('Listener: stopped');
42
+ }
43
+ if (serviceInstalled) {
44
+ console.log('Auto-start: enabled');
45
+ }
46
+ else {
47
+ console.log('Auto-start: disabled');
48
+ }
49
+ console.log('');
50
+ if (!state || Object.keys(state.repos).length === 0) {
51
+ console.log('No sync history. Run `repowise listen` to start syncing.');
52
+ return;
53
+ }
54
+ console.log('Watched Repos:');
55
+ for (const [repoId, repoState] of Object.entries(state.repos)) {
56
+ const syncTime = repoState.lastSyncTimestamp
57
+ ? new Date(repoState.lastSyncTimestamp).toLocaleString()
58
+ : 'never';
59
+ const commit = repoState.lastSyncCommitSha ? repoState.lastSyncCommitSha.slice(0, 7) : 'none';
60
+ console.log(` ${repoId}: last sync ${syncTime} (commit: ${commit})`);
61
+ }
3
62
  }
4
63
  //# sourceMappingURL=status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM;IACpB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function stop(): Promise<void>;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB1C"}
@@ -0,0 +1,17 @@
1
+ export async function stop() {
2
+ try {
3
+ const { isRunning, stopProcess } = await import('@repowise/listener/process-manager');
4
+ if (!(await isRunning())) {
5
+ console.log('Listener is not running.');
6
+ return;
7
+ }
8
+ await stopProcess();
9
+ console.log('Listener stopped.');
10
+ }
11
+ catch (err) {
12
+ const message = err instanceof Error ? err.message : 'Unknown error';
13
+ console.error(`Failed to stop listener: ${message}`);
14
+ process.exitCode = 1;
15
+ }
16
+ }
17
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAEtF,IAAI,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type AiTool = 'cursor' | 'claude-code' | 'copilot' | 'windsurf' | 'cline' | 'codex' | 'roo-code';
2
+ export interface ContextFileInfo {
3
+ fileName: string;
4
+ relativePath: string;
5
+ }
6
+ interface ToolConfig {
7
+ label: string;
8
+ fileName: string;
9
+ filePath: string;
10
+ markerStart: string;
11
+ markerEnd: string;
12
+ format: 'markdown' | 'plain-text';
13
+ }
14
+ export declare const AI_TOOL_CONFIG: Record<AiTool, ToolConfig>;
15
+ export declare const SUPPORTED_TOOLS: AiTool[];
16
+ export declare function generateReference(tool: AiTool, repoName: string, contextFolder: string, contextFiles: ContextFileInfo[]): string;
17
+ export declare function updateToolConfig(repoRoot: string, tool: AiTool, repoName: string, contextFolder: string, contextFiles: ContextFileInfo[]): Promise<{
18
+ created: boolean;
19
+ }>;
20
+ export declare function removeToolConfig(repoRoot: string, tool: AiTool): Promise<void>;
21
+ export declare function scanLocalContextFiles(repoRoot: string, contextFolder: string): Promise<ContextFileInfo[]>;
22
+ export {};
23
+ //# sourceMappingURL=ai-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-tools.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GACd,QAAQ,GACR,aAAa,GACb,SAAS,GACT,UAAU,GACV,OAAO,GACP,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,GAAG,YAAY,CAAC;CACnC;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAyDrD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,EAA4C,CAAC;AAejF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,MAAM,CA4DR;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuC/B;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpF;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,eAAe,EAAE,CAAC,CAe5B"}
@@ -0,0 +1,193 @@
1
+ import { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';
2
+ import { join, dirname } from 'node:path';
3
+ export const AI_TOOL_CONFIG = {
4
+ cursor: {
5
+ label: 'Cursor',
6
+ fileName: '.cursorrules',
7
+ filePath: '.cursorrules',
8
+ markerStart: '# --- repowise-start ---',
9
+ markerEnd: '# --- repowise-end ---',
10
+ format: 'plain-text',
11
+ },
12
+ 'claude-code': {
13
+ label: 'Claude Code',
14
+ fileName: 'CLAUDE.md',
15
+ filePath: 'CLAUDE.md',
16
+ markerStart: '<!-- repowise-start -->',
17
+ markerEnd: '<!-- repowise-end -->',
18
+ format: 'markdown',
19
+ },
20
+ copilot: {
21
+ label: 'GitHub Copilot',
22
+ fileName: 'copilot-instructions.md',
23
+ filePath: '.github/copilot-instructions.md',
24
+ markerStart: '<!-- repowise-start -->',
25
+ markerEnd: '<!-- repowise-end -->',
26
+ format: 'markdown',
27
+ },
28
+ windsurf: {
29
+ label: 'Windsurf',
30
+ fileName: '.windsurfrules',
31
+ filePath: '.windsurfrules',
32
+ markerStart: '# --- repowise-start ---',
33
+ markerEnd: '# --- repowise-end ---',
34
+ format: 'plain-text',
35
+ },
36
+ cline: {
37
+ label: 'Cline',
38
+ fileName: '.clinerules',
39
+ filePath: '.clinerules',
40
+ markerStart: '# --- repowise-start ---',
41
+ markerEnd: '# --- repowise-end ---',
42
+ format: 'plain-text',
43
+ },
44
+ codex: {
45
+ label: 'Codex',
46
+ fileName: 'AGENTS.md',
47
+ filePath: 'AGENTS.md',
48
+ markerStart: '<!-- repowise-start -->',
49
+ markerEnd: '<!-- repowise-end -->',
50
+ format: 'markdown',
51
+ },
52
+ 'roo-code': {
53
+ label: 'Roo Code',
54
+ fileName: 'rules.md',
55
+ filePath: '.roo/rules.md',
56
+ markerStart: '<!-- repowise-start -->',
57
+ markerEnd: '<!-- repowise-end -->',
58
+ format: 'markdown',
59
+ },
60
+ };
61
+ export const SUPPORTED_TOOLS = Object.keys(AI_TOOL_CONFIG);
62
+ function sanitizeRepoName(name) {
63
+ // Strip markdown/HTML special chars to prevent content injection
64
+ return name.replace(/[<>[\]`()|\\]/g, '');
65
+ }
66
+ function fileDescriptionFromName(fileName) {
67
+ return fileName
68
+ .replace(/\.md$/, '')
69
+ .split('-')
70
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
71
+ .join(' ');
72
+ }
73
+ export function generateReference(tool, repoName, contextFolder, contextFiles) {
74
+ const config = AI_TOOL_CONFIG[tool];
75
+ const safeName = sanitizeRepoName(repoName);
76
+ const fileLines = contextFiles.map((f) => {
77
+ const desc = fileDescriptionFromName(f.fileName);
78
+ const isOverview = f.fileName === 'project-overview.md';
79
+ return { path: f.relativePath, desc: isOverview ? `${desc} (full index of all files)` : desc };
80
+ });
81
+ const hasFiles = fileLines.length > 0;
82
+ if (config.format === 'markdown') {
83
+ const lines = [
84
+ config.markerStart,
85
+ '',
86
+ `## Project Context \u2014 ${safeName}`,
87
+ '',
88
+ `This repository has AI-optimized context files generated by RepoWise.`,
89
+ `Before making changes, read the relevant context files in \`${contextFolder}/\` to understand the project's architecture, coding patterns, conventions, and domain knowledge.`,
90
+ '',
91
+ `**Start here:** \`${contextFolder}/project-overview.md\` \u2014 the routing document that describes every context file and when to read it.`,
92
+ '',
93
+ ];
94
+ if (hasFiles) {
95
+ lines.push(`**Core context files:**`, '', ...fileLines.map((f) => `- \`${f.path}\` \u2014 ${f.desc}`), '', `> Additional context files may exist beyond this list. Check \`project-overview.md\` for the complete index.`);
96
+ }
97
+ lines.push('', config.markerEnd);
98
+ return lines.join('\n');
99
+ }
100
+ // plain-text format
101
+ const lines = [
102
+ config.markerStart,
103
+ `# Project Context \u2014 ${safeName}`,
104
+ '#',
105
+ `# This repository has AI-optimized context files generated by RepoWise.`,
106
+ `# Before making changes, read the relevant context files in ${contextFolder}/`,
107
+ `# to understand the project's architecture, coding patterns, conventions, and domain knowledge.`,
108
+ '#',
109
+ `# Start here: ${contextFolder}/project-overview.md`,
110
+ `# The routing document that describes every context file and when to read it.`,
111
+ ];
112
+ if (hasFiles) {
113
+ lines.push('#', `# Core context files:`, ...fileLines.map((f) => `# ${f.path} \u2014 ${f.desc}`), '#', '# Additional context files may exist beyond this list.', '# Check project-overview.md for the complete index.');
114
+ }
115
+ lines.push(config.markerEnd);
116
+ return lines.join('\n');
117
+ }
118
+ export async function updateToolConfig(repoRoot, tool, repoName, contextFolder, contextFiles) {
119
+ const config = AI_TOOL_CONFIG[tool];
120
+ const fullPath = join(repoRoot, config.filePath);
121
+ // Ensure parent directory exists for tools in subdirectories
122
+ const dir = dirname(fullPath);
123
+ if (dir !== repoRoot) {
124
+ await mkdir(dir, { recursive: true });
125
+ }
126
+ const referenceBlock = generateReference(tool, repoName, contextFolder, contextFiles);
127
+ let existing = '';
128
+ let created = true;
129
+ try {
130
+ existing = await readFile(fullPath, 'utf-8');
131
+ created = false;
132
+ }
133
+ catch (err) {
134
+ if (err.code !== 'ENOENT')
135
+ throw err;
136
+ }
137
+ const startIdx = existing.indexOf(config.markerStart);
138
+ const endIdx = existing.indexOf(config.markerEnd);
139
+ let content;
140
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
141
+ // Replace between markers (inclusive)
142
+ const before = existing.slice(0, startIdx);
143
+ const after = existing.slice(endIdx + config.markerEnd.length);
144
+ content = before + referenceBlock + after;
145
+ }
146
+ else {
147
+ // Append to end
148
+ const separator = existing.length > 0 && !existing.endsWith('\n') ? '\n\n' : existing.length > 0 ? '\n' : '';
149
+ content = existing + separator + referenceBlock + '\n';
150
+ }
151
+ await writeFile(fullPath, content, 'utf-8');
152
+ return { created };
153
+ }
154
+ export async function removeToolConfig(repoRoot, tool) {
155
+ const config = AI_TOOL_CONFIG[tool];
156
+ const fullPath = join(repoRoot, config.filePath);
157
+ let existing;
158
+ try {
159
+ existing = await readFile(fullPath, 'utf-8');
160
+ }
161
+ catch (err) {
162
+ if (err.code === 'ENOENT')
163
+ return;
164
+ throw err;
165
+ }
166
+ const startIdx = existing.indexOf(config.markerStart);
167
+ const endIdx = existing.indexOf(config.markerEnd);
168
+ if (startIdx === -1 || endIdx === -1)
169
+ return;
170
+ const before = existing.slice(0, startIdx);
171
+ const after = existing.slice(endIdx + config.markerEnd.length);
172
+ const content = (before + after).replace(/\n{3,}/g, '\n\n').trim() + '\n';
173
+ await writeFile(fullPath, content, 'utf-8');
174
+ }
175
+ export async function scanLocalContextFiles(repoRoot, contextFolder) {
176
+ const folderPath = join(repoRoot, contextFolder);
177
+ try {
178
+ const entries = await readdir(folderPath, { withFileTypes: true });
179
+ return entries
180
+ .filter((e) => e.isFile() && e.name.endsWith('.md'))
181
+ .map((e) => ({
182
+ fileName: e.name,
183
+ relativePath: `${contextFolder}/${e.name}`,
184
+ }))
185
+ .sort((a, b) => a.fileName.localeCompare(b.fileName));
186
+ }
187
+ catch (err) {
188
+ if (err.code === 'ENOENT')
189
+ return [];
190
+ throw err;
191
+ }
192
+ }
193
+ //# sourceMappingURL=ai-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tools.js","sourceRoot":"","sources":["../../../src/lib/ai-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyB1C,MAAM,CAAC,MAAM,cAAc,GAA+B;IACxD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,wBAAwB;QACnC,MAAM,EAAE,YAAY;KACrB;IACD,aAAa,EAAE;QACb,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,uBAAuB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,yBAAyB;QACnC,QAAQ,EAAE,iCAAiC;QAC3C,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,uBAAuB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,gBAAgB;QAC1B,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,wBAAwB;QACnC,MAAM,EAAE,YAAY;KACrB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,aAAa;QACvB,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE,0BAA0B;QACvC,SAAS,EAAE,wBAAwB;QACnC,MAAM,EAAE,YAAY;KACrB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,uBAAuB;QAClC,MAAM,EAAE,UAAU;KACnB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,eAAe;QACzB,WAAW,EAAE,yBAAyB;QACtC,SAAS,EAAE,uBAAuB;QAClC,MAAM,EAAE,UAAU;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAa,MAAM,CAAC,IAAI,CAAC,cAAc,CAAa,CAAC;AAEjF,SAAS,gBAAgB,CAAC,IAAY;IACpC,iEAAiE;IACjE,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,OAAO,QAAQ;SACZ,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAgB,EAChB,aAAqB,EACrB,YAA+B;IAE/B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,KAAK,qBAAqB,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAEtC,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG;YACZ,MAAM,CAAC,WAAW;YAClB,EAAE;YACF,6BAA6B,QAAQ,EAAE;YACvC,EAAE;YACF,uEAAuE;YACvE,+DAA+D,aAAa,mGAAmG;YAC/K,EAAE;YACF,qBAAqB,aAAa,2GAA2G;YAC7I,EAAE;SACH,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CACR,yBAAyB,EACzB,EAAE,EACF,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,EAC3D,EAAE,EACF,8GAA8G,CAC/G,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG;QACZ,MAAM,CAAC,WAAW;QAClB,4BAA4B,QAAQ,EAAE;QACtC,GAAG;QACH,yEAAyE;QACzE,+DAA+D,aAAa,GAAG;QAC/E,iGAAiG;QACjG,GAAG;QACH,iBAAiB,aAAa,sBAAsB;QACpD,iFAAiF;KAClF,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CACR,GAAG,EACH,uBAAuB,EACvB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,EACzD,GAAG,EACH,wDAAwD,EACxD,qDAAqD,CACtD,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,IAAY,EACZ,QAAgB,EAChB,aAAqB,EACrB,YAA+B;IAE/B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjD,6DAA6D;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAEtF,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IAClE,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,OAAe,CAAC;IACpB,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1D,sCAAsC;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,KAAK,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,gBAAgB;QAChB,MAAM,SAAS,GACb,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IACnE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC7D,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAElD,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO;IAE7C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAE1E,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,aAAqB;IAErB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACnD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,QAAQ,EAAE,CAAC,CAAC,IAAI;YAChB,YAAY,EAAE,GAAG,aAAa,IAAI,CAAC,CAAC,IAAI,EAAE;SAC3C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAChE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAMA,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAgBnF"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAWA,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAkCnF"}
@@ -1,15 +1,36 @@
1
- const API_URL = process.env['REPOWISE_API_URL'] ?? 'https://api.repowise.ai';
1
+ import { clearCredentials, getValidCredentials } from './auth.js';
2
+ import { getEnvConfig } from './env.js';
3
+ function getApiUrl() {
4
+ return process.env['REPOWISE_API_URL'] ?? getEnvConfig().apiUrl;
5
+ }
2
6
  export async function apiRequest(path, options) {
3
- const response = await fetch(`${API_URL}${path}`, {
7
+ const credentials = await getValidCredentials();
8
+ if (!credentials) {
9
+ throw new Error('Not logged in. Run `repowise login` first.');
10
+ }
11
+ const response = await fetch(`${getApiUrl()}${path}`, {
4
12
  ...options,
5
13
  headers: {
6
14
  'Content-Type': 'application/json',
15
+ Authorization: `Bearer ${credentials.accessToken}`,
7
16
  ...options?.headers,
8
17
  },
9
18
  });
19
+ if (response.status === 401) {
20
+ await clearCredentials();
21
+ throw new Error('Session expired. Run `repowise login` again.');
22
+ }
10
23
  if (!response.ok) {
11
- const body = (await response.json());
12
- throw new Error(body.error?.message ?? 'Request failed');
24
+ let message = `Request failed with status ${response.status}`;
25
+ try {
26
+ const body = (await response.json());
27
+ if (body.error?.message)
28
+ message = body.error.message;
29
+ }
30
+ catch {
31
+ // Response body is not JSON (e.g. gateway 502/503) — use default message
32
+ }
33
+ throw new Error(message);
13
34
  }
14
35
  const json = (await response.json());
15
36
  return json.data;
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,yBAAyB,CAAC;AAM7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,OAAqB;IACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;QAChD,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,EAAE,OAAO;SACpB;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAa,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,YAAY,EAAE,CAAC,MAAM,CAAC;AAClE,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,OAAqB;IACrE,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;QACpD,GAAG,OAAO;QACV,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,CAAC,WAAW,EAAE;YAClD,GAAG,OAAO,EAAE,OAAO;SACpB;KACF,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,8BAA8B,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAa,CAAC;YACjD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO;gBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgB,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
@@ -1,10 +1,28 @@
1
+ export declare const CLI_CALLBACK_PORT = 19876;
1
2
  export interface StoredCredentials {
2
3
  accessToken: string;
3
4
  refreshToken: string;
4
5
  idToken: string;
5
6
  expiresAt: number;
6
7
  }
8
+ export declare function generateCodeVerifier(): string;
9
+ export declare function generateCodeChallenge(verifier: string): string;
10
+ export declare function generateState(): string;
11
+ export declare function getAuthorizeUrl(codeChallenge: string, state: string): string;
12
+ export interface CallbackResult {
13
+ code: string;
14
+ state: string;
15
+ }
16
+ export declare function startCallbackServer(): Promise<CallbackResult>;
17
+ export declare function exchangeCodeForTokens(code: string, codeVerifier: string): Promise<StoredCredentials>;
18
+ export declare function refreshTokens(refreshToken: string): Promise<StoredCredentials>;
7
19
  export declare function getStoredCredentials(): Promise<StoredCredentials | null>;
8
20
  export declare function storeCredentials(credentials: StoredCredentials): Promise<void>;
9
21
  export declare function clearCredentials(): Promise<void>;
22
+ export declare function getValidCredentials(): Promise<StoredCredentials | null>;
23
+ export declare function performLogin(): Promise<StoredCredentials>;
24
+ export declare function decodeIdToken(idToken: string): {
25
+ email: string;
26
+ tenantId?: string;
27
+ };
10
28
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAO9E;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAmBvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAID,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB5E;AAQD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CA8E7D;AAID,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAID,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2BpF;AAID,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAY9E;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiB7E;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA2B/D;AA0CD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAYnF"}