@codemieai/code 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +375 -325
- package/bin/codemie-claude.js +23 -0
- package/bin/codemie-code.js +49 -11
- package/bin/codemie-codex.js +12 -13
- package/dist/agents/adapters/claude-code.d.ts +5 -0
- package/dist/agents/adapters/claude-code.d.ts.map +1 -1
- package/dist/agents/adapters/claude-code.js +76 -18
- package/dist/agents/adapters/claude-code.js.map +1 -1
- package/dist/agents/adapters/codex.d.ts +5 -0
- package/dist/agents/adapters/codex.d.ts.map +1 -1
- package/dist/agents/adapters/codex.js +75 -17
- package/dist/agents/adapters/codex.js.map +1 -1
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +187 -21
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/config.d.ts.map +1 -1
- package/dist/agents/codemie-code/config.js +29 -27
- package/dist/agents/codemie-code/config.js.map +1 -1
- package/dist/agents/codemie-code/index.d.ts +16 -2
- package/dist/agents/codemie-code/index.d.ts.map +1 -1
- package/dist/agents/codemie-code/index.js +74 -6
- package/dist/agents/codemie-code/index.js.map +1 -1
- package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts +87 -0
- package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts.map +1 -0
- package/dist/agents/codemie-code/modes/contextAwarePlanning.js +957 -0
- package/dist/agents/codemie-code/modes/contextAwarePlanning.js.map +1 -0
- package/dist/agents/codemie-code/modes/planMode.d.ts +116 -0
- package/dist/agents/codemie-code/modes/planMode.d.ts.map +1 -0
- package/dist/agents/codemie-code/modes/planMode.js +537 -0
- package/dist/agents/codemie-code/modes/planMode.js.map +1 -0
- package/dist/agents/codemie-code/prompts.d.ts +29 -0
- package/dist/agents/codemie-code/prompts.d.ts.map +1 -1
- package/dist/agents/codemie-code/prompts.js +129 -0
- package/dist/agents/codemie-code/prompts.js.map +1 -1
- package/dist/agents/codemie-code/storage/todoStorage.d.ts +78 -0
- package/dist/agents/codemie-code/storage/todoStorage.d.ts.map +1 -0
- package/dist/agents/codemie-code/storage/todoStorage.js +225 -0
- package/dist/agents/codemie-code/storage/todoStorage.js.map +1 -0
- package/dist/agents/codemie-code/tokenUtils.js +1 -1
- package/dist/agents/codemie-code/tokenUtils.js.map +1 -1
- package/dist/agents/codemie-code/tools/index.d.ts +26 -0
- package/dist/agents/codemie-code/tools/index.d.ts.map +1 -1
- package/dist/agents/codemie-code/tools/index.js +182 -14
- package/dist/agents/codemie-code/tools/index.js.map +1 -1
- package/dist/agents/codemie-code/tools/planning.d.ts +53 -0
- package/dist/agents/codemie-code/tools/planning.d.ts.map +1 -0
- package/dist/agents/codemie-code/tools/planning.js +224 -0
- package/dist/agents/codemie-code/tools/planning.js.map +1 -0
- package/dist/agents/codemie-code/types.d.ts +170 -6
- package/dist/agents/codemie-code/types.d.ts.map +1 -1
- package/dist/agents/codemie-code/types.js.map +1 -1
- package/dist/agents/codemie-code/ui/progressTracker.d.ts +125 -0
- package/dist/agents/codemie-code/ui/progressTracker.d.ts.map +1 -0
- package/dist/agents/codemie-code/ui/progressTracker.js +343 -0
- package/dist/agents/codemie-code/ui/progressTracker.js.map +1 -0
- package/dist/agents/codemie-code/ui/todoPanel.d.ts +112 -0
- package/dist/agents/codemie-code/ui/todoPanel.d.ts.map +1 -0
- package/dist/agents/codemie-code/ui/todoPanel.js +318 -0
- package/dist/agents/codemie-code/ui/todoPanel.js.map +1 -0
- package/dist/agents/codemie-code/ui.d.ts +106 -10
- package/dist/agents/codemie-code/ui.d.ts.map +1 -1
- package/dist/agents/codemie-code/ui.js +913 -129
- package/dist/agents/codemie-code/ui.js.map +1 -1
- package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts +87 -0
- package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts.map +1 -0
- package/dist/agents/codemie-code/utils/progressionEnforcer.js +293 -0
- package/dist/agents/codemie-code/utils/progressionEnforcer.js.map +1 -0
- package/dist/agents/codemie-code/utils/todoParser.d.ts +41 -0
- package/dist/agents/codemie-code/utils/todoParser.d.ts.map +1 -0
- package/dist/agents/codemie-code/utils/todoParser.js +305 -0
- package/dist/agents/codemie-code/utils/todoParser.js.map +1 -0
- package/dist/agents/codemie-code/utils/todoValidator.d.ts +65 -0
- package/dist/agents/codemie-code/utils/todoValidator.d.ts.map +1 -0
- package/dist/agents/codemie-code/utils/todoValidator.js +249 -0
- package/dist/agents/codemie-code/utils/todoValidator.js.map +1 -0
- package/dist/agents/codemie-code/validators/planValidator.d.ts +94 -0
- package/dist/agents/codemie-code/validators/planValidator.d.ts.map +1 -0
- package/dist/agents/codemie-code/validators/planValidator.js +281 -0
- package/dist/agents/codemie-code/validators/planValidator.js.map +1 -0
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +7 -5
- package/dist/agents/registry.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +170 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +40 -13
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +209 -16
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/env.js +3 -3
- package/dist/cli/commands/env.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +2 -1
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +15 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +177 -11
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/tools.d.ts +6 -0
- package/dist/cli/commands/tools.d.ts.map +1 -0
- package/dist/cli/commands/tools.js +244 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/commands/version.js +1 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/commands/workflow.d.ts +6 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +424 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/index.js +39 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/clients/adapters/github.d.ts +17 -0
- package/dist/clients/adapters/github.d.ts.map +1 -0
- package/dist/clients/adapters/github.js +150 -0
- package/dist/clients/adapters/github.js.map +1 -0
- package/dist/clients/adapters/gitlab.d.ts +17 -0
- package/dist/clients/adapters/gitlab.d.ts.map +1 -0
- package/dist/clients/adapters/gitlab.js +147 -0
- package/dist/clients/adapters/gitlab.js.map +1 -0
- package/dist/clients/registry.d.ts +20 -0
- package/dist/clients/registry.d.ts.map +1 -0
- package/dist/clients/registry.js +27 -0
- package/dist/clients/registry.js.map +1 -0
- package/dist/tools/detector.d.ts +33 -0
- package/dist/tools/detector.d.ts.map +1 -0
- package/dist/tools/detector.js +145 -0
- package/dist/tools/detector.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manager.d.ts +21 -0
- package/dist/tools/manager.d.ts.map +1 -0
- package/dist/tools/manager.js +104 -0
- package/dist/tools/manager.js.map +1 -0
- package/dist/tools/registry.d.ts +8 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +36 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types/sso.d.ts +42 -0
- package/dist/types/sso.d.ts.map +1 -0
- package/dist/types/sso.js +2 -0
- package/dist/types/sso.js.map +1 -0
- package/dist/utils/agent-compatibility.d.ts +32 -0
- package/dist/utils/agent-compatibility.d.ts.map +1 -0
- package/dist/utils/agent-compatibility.js +140 -0
- package/dist/utils/agent-compatibility.js.map +1 -0
- package/dist/utils/codemie-integration-validator.d.ts +17 -0
- package/dist/utils/codemie-integration-validator.d.ts.map +1 -0
- package/dist/utils/codemie-integration-validator.js +105 -0
- package/dist/utils/codemie-integration-validator.js.map +1 -0
- package/dist/utils/codemie-model-fetcher.d.ts +11 -0
- package/dist/utils/codemie-model-fetcher.d.ts.map +1 -0
- package/dist/utils/codemie-model-fetcher.js +242 -0
- package/dist/utils/codemie-model-fetcher.js.map +1 -0
- package/dist/utils/config-loader.d.ts +23 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +73 -27
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/credential-store.d.ts +16 -0
- package/dist/utils/credential-store.d.ts.map +1 -0
- package/dist/utils/credential-store.js +109 -0
- package/dist/utils/credential-store.js.map +1 -0
- package/dist/utils/first-time.d.ts +1 -1
- package/dist/utils/first-time.d.ts.map +1 -1
- package/dist/utils/first-time.js +52 -71
- package/dist/utils/first-time.js.map +1 -1
- package/dist/utils/health-checker.d.ts.map +1 -1
- package/dist/utils/health-checker.js +5 -1
- package/dist/utils/health-checker.js.map +1 -1
- package/dist/utils/model-fetcher.d.ts.map +1 -1
- package/dist/utils/model-fetcher.js +15 -2
- package/dist/utils/model-fetcher.js.map +1 -1
- package/dist/utils/sso-auth.d.ts +15 -0
- package/dist/utils/sso-auth.d.ts.map +1 -0
- package/dist/utils/sso-auth.js +207 -0
- package/dist/utils/sso-auth.js.map +1 -0
- package/dist/utils/sso-gateway.d.ts +47 -0
- package/dist/utils/sso-gateway.d.ts.map +1 -0
- package/dist/utils/sso-gateway.js +298 -0
- package/dist/utils/sso-gateway.js.map +1 -0
- package/dist/workflows/detector.d.ts +37 -0
- package/dist/workflows/detector.d.ts.map +1 -0
- package/dist/workflows/detector.js +160 -0
- package/dist/workflows/detector.js.map +1 -0
- package/dist/workflows/index.d.ts +8 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +8 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/installer.d.ts +24 -0
- package/dist/workflows/installer.d.ts.map +1 -0
- package/dist/workflows/installer.js +105 -0
- package/dist/workflows/installer.js.map +1 -0
- package/dist/workflows/registry.d.ts +29 -0
- package/dist/workflows/registry.d.ts.map +1 -0
- package/dist/workflows/registry.js +54 -0
- package/dist/workflows/registry.js.map +1 -0
- package/dist/workflows/templates/github/metadata.d.ts +6 -0
- package/dist/workflows/templates/github/metadata.d.ts.map +1 -0
- package/dist/workflows/templates/github/metadata.js +111 -0
- package/dist/workflows/templates/github/metadata.js.map +1 -0
- package/dist/workflows/templates/gitlab/metadata.d.ts +6 -0
- package/dist/workflows/templates/gitlab/metadata.d.ts.map +1 -0
- package/dist/workflows/templates/gitlab/metadata.js +14 -0
- package/dist/workflows/templates/gitlab/metadata.js.map +1 -0
- package/dist/workflows/types.d.ts +71 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +5 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +19 -6
- package/src/workflows/templates/github/code-ci.yml +529 -0
- package/src/workflows/templates/github/inline-fix.yml +665 -0
- package/src/workflows/templates/github/pr-review.yml +677 -0
- package/.claude/agents/README.md +0 -298
- package/.claude/agents/release-manager.md +0 -857
- package/.codemie/guides/git-workflow.md +0 -493
- package/CLAUDE.md +0 -225
- package/config.example.json +0 -10
- package/dist/agents/codemie-code/streaming/events.d.ts +0 -7
- package/dist/agents/codemie-code/streaming/events.d.ts.map +0 -1
- package/dist/agents/codemie-code/streaming/events.js +0 -7
- package/dist/agents/codemie-code/streaming/events.js.map +0 -1
- package/dist/agents/codemie-code/streaming/formatter.d.ts +0 -2
- package/dist/agents/codemie-code/streaming/formatter.d.ts.map +0 -1
- package/dist/agents/codemie-code/streaming/formatter.js +0 -2
- package/dist/agents/codemie-code/streaming/formatter.js.map +0 -1
- package/dist/agents/codemie-code/streaming/ui.d.ts +0 -2
- package/dist/agents/codemie-code/streaming/ui.d.ts.map +0 -1
- package/dist/agents/codemie-code/streaming/ui.js +0 -2
- package/dist/agents/codemie-code/streaming/ui.js.map +0 -1
- package/dist/agents/codemie-code/tools/command.d.ts +0 -2
- package/dist/agents/codemie-code/tools/command.d.ts.map +0 -1
- package/dist/agents/codemie-code/tools/command.js +0 -2
- package/dist/agents/codemie-code/tools/command.js.map +0 -1
- package/dist/agents/codemie-code/tools/filesystem.d.ts +0 -2
- package/dist/agents/codemie-code/tools/filesystem.d.ts.map +0 -1
- package/dist/agents/codemie-code/tools/filesystem.js +0 -2
- package/dist/agents/codemie-code/tools/filesystem.js.map +0 -1
- package/dist/agents/codemie-code/tools/git.d.ts +0 -2
- package/dist/agents/codemie-code/tools/git.d.ts.map +0 -1
- package/dist/agents/codemie-code/tools/git.js +0 -2
- package/dist/agents/codemie-code/tools/git.js.map +0 -1
- package/dist/agents/codemie-code/tools/security.d.ts +0 -2
- package/dist/agents/codemie-code/tools/security.d.ts.map +0 -1
- package/dist/agents/codemie-code/tools/security.js +0 -2
- package/dist/agents/codemie-code/tools/security.js.map +0 -1
- package/eslint.config.mjs +0 -43
- package/scripts/README.md +0 -80
- package/scripts/release.sh +0 -156
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { createServer } from 'http';
|
|
2
|
+
import { URL } from 'url';
|
|
3
|
+
import open from 'open';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { CredentialStore } from './credential-store.js';
|
|
6
|
+
export class CodeMieSSO {
|
|
7
|
+
server;
|
|
8
|
+
callbackResult;
|
|
9
|
+
codeMieUrl;
|
|
10
|
+
async authenticate(config) {
|
|
11
|
+
this.codeMieUrl = config.codeMieUrl;
|
|
12
|
+
try {
|
|
13
|
+
// 1. Start local callback server
|
|
14
|
+
const port = await this.startLocalServer();
|
|
15
|
+
// 2. Construct SSO URL (following plugin pattern)
|
|
16
|
+
const codeMieBase = this.ensureApiBase(config.codeMieUrl);
|
|
17
|
+
const ssoUrl = `${codeMieBase}/v1/auth/login/${port}`;
|
|
18
|
+
// 3. Launch browser
|
|
19
|
+
console.log(chalk.dim(`Opening browser for authentication...`));
|
|
20
|
+
await open(ssoUrl);
|
|
21
|
+
// 4. Wait for callback with timeout
|
|
22
|
+
const result = await this.waitForCallback(config.timeout || 120000);
|
|
23
|
+
// 5. Store credentials if successful
|
|
24
|
+
if (result.success && result.apiUrl && result.cookies) {
|
|
25
|
+
const credentials = {
|
|
26
|
+
cookies: result.cookies,
|
|
27
|
+
apiUrl: result.apiUrl,
|
|
28
|
+
expiresAt: Date.now() + (24 * 60 * 60 * 1000) // 24 hours
|
|
29
|
+
};
|
|
30
|
+
const store = CredentialStore.getInstance();
|
|
31
|
+
await store.storeSSOCredentials(credentials);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: error instanceof Error ? error.message : String(error)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
this.cleanup();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async getStoredCredentials() {
|
|
46
|
+
const store = CredentialStore.getInstance();
|
|
47
|
+
const credentials = await store.retrieveSSOCredentials();
|
|
48
|
+
// Check if credentials are expired
|
|
49
|
+
if (credentials && credentials.expiresAt && Date.now() > credentials.expiresAt) {
|
|
50
|
+
await store.clearSSOCredentials();
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return credentials;
|
|
54
|
+
}
|
|
55
|
+
async clearStoredCredentials() {
|
|
56
|
+
const store = CredentialStore.getInstance();
|
|
57
|
+
await store.clearSSOCredentials();
|
|
58
|
+
}
|
|
59
|
+
ensureApiBase(rawUrl) {
|
|
60
|
+
let base = rawUrl.replace(/\/$/, '');
|
|
61
|
+
// If user entered only host, append the known API context
|
|
62
|
+
if (!/\/code-assistant-api(\/|$)/i.test(base)) {
|
|
63
|
+
base = `${base}/code-assistant-api`;
|
|
64
|
+
}
|
|
65
|
+
return base;
|
|
66
|
+
}
|
|
67
|
+
async startLocalServer() {
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
this.server = createServer((req, res) => {
|
|
70
|
+
if (!req.url)
|
|
71
|
+
return;
|
|
72
|
+
const address = this.server.address();
|
|
73
|
+
const port = typeof address === 'object' && address ? address.port : 0;
|
|
74
|
+
const url = new URL(req.url, `http://localhost:${port}`);
|
|
75
|
+
// Handle the OAuth callback
|
|
76
|
+
this.handleCallback(url).then(result => {
|
|
77
|
+
this.callbackResult = result;
|
|
78
|
+
// Send success page
|
|
79
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
80
|
+
res.end(`
|
|
81
|
+
<!DOCTYPE html>
|
|
82
|
+
<html>
|
|
83
|
+
<head>
|
|
84
|
+
<meta charset="UTF-8">
|
|
85
|
+
<title>CodeMie Authentication</title>
|
|
86
|
+
<style>
|
|
87
|
+
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
|
|
88
|
+
.success { color: #28a745; }
|
|
89
|
+
.error { color: #dc3545; }
|
|
90
|
+
</style>
|
|
91
|
+
</head>
|
|
92
|
+
<body>
|
|
93
|
+
<h2 class="${result.success ? 'success' : 'error'}">
|
|
94
|
+
${result.success ? '✅ Authentication Successful' : '❌ Authentication Failed'}
|
|
95
|
+
</h2>
|
|
96
|
+
<p>You can close this window and return to your terminal.</p>
|
|
97
|
+
${result.error ? `<p class="error">Error: ${result.error}</p>` : ''}
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|
|
100
|
+
`);
|
|
101
|
+
this.server.close();
|
|
102
|
+
}).catch(error => {
|
|
103
|
+
this.callbackResult = { success: false, error: error.message };
|
|
104
|
+
res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
105
|
+
res.end(`
|
|
106
|
+
<!DOCTYPE html>
|
|
107
|
+
<html>
|
|
108
|
+
<head>
|
|
109
|
+
<meta charset="UTF-8">
|
|
110
|
+
<title>CodeMie Authentication Error</title>
|
|
111
|
+
</head>
|
|
112
|
+
<body>
|
|
113
|
+
<h2>❌ Authentication Failed</h2>
|
|
114
|
+
<p>Error: ${error.message}</p>
|
|
115
|
+
<p>You can close this window and return to your terminal.</p>
|
|
116
|
+
</body>
|
|
117
|
+
</html>
|
|
118
|
+
`);
|
|
119
|
+
this.server.close();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
this.server.listen(0, () => {
|
|
123
|
+
const address = this.server.address();
|
|
124
|
+
const port = typeof address === 'object' && address ? address.port : 0;
|
|
125
|
+
resolve(port);
|
|
126
|
+
});
|
|
127
|
+
this.server.on('error', reject);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async handleCallback(url) {
|
|
131
|
+
try {
|
|
132
|
+
const query = url.searchParams;
|
|
133
|
+
let raw = query.get('token') || query.get('auth') || query.get('data');
|
|
134
|
+
if (!raw) {
|
|
135
|
+
// Try to extract from URL-encoded query
|
|
136
|
+
const decoded = decodeURIComponent(url.search);
|
|
137
|
+
const match = /(?:^|[?&])token=([^&]+)/.exec(decoded);
|
|
138
|
+
if (match && match[1])
|
|
139
|
+
raw = match[1];
|
|
140
|
+
}
|
|
141
|
+
if (!raw) {
|
|
142
|
+
throw new Error('Missing token parameter in OAuth callback');
|
|
143
|
+
}
|
|
144
|
+
// Decode base64 token (following plugin pattern)
|
|
145
|
+
const token = JSON.parse(Buffer.from(raw, 'base64').toString('ascii'));
|
|
146
|
+
if (!token.cookies) {
|
|
147
|
+
throw new Error('Token missing cookies field');
|
|
148
|
+
}
|
|
149
|
+
// Try to fetch config.js to resolve actual API URL
|
|
150
|
+
let apiUrl = this.ensureApiBase(this.codeMieUrl);
|
|
151
|
+
try {
|
|
152
|
+
const configResponse = await fetch(`${apiUrl}/config.js`, {
|
|
153
|
+
headers: {
|
|
154
|
+
'cookie': Object.entries(token.cookies)
|
|
155
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
156
|
+
.join(';')
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (configResponse.ok) {
|
|
160
|
+
const configText = await configResponse.text();
|
|
161
|
+
const viteApiMatch = /VITE_API_URL:\s*"([^"]+)"/.exec(configText);
|
|
162
|
+
if (viteApiMatch && viteApiMatch[1]) {
|
|
163
|
+
apiUrl = viteApiMatch[1].replace(/\/$/, '');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
// Silently fallback to default API URL - config.js fetch is optional
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
success: true,
|
|
172
|
+
apiUrl,
|
|
173
|
+
cookies: token.cookies
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
error: error instanceof Error ? error.message : String(error)
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async waitForCallback(timeout) {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
const timer = setTimeout(() => {
|
|
186
|
+
reject(new Error('Authentication timeout - no response received'));
|
|
187
|
+
}, timeout);
|
|
188
|
+
const checkResult = () => {
|
|
189
|
+
if (this.callbackResult) {
|
|
190
|
+
clearTimeout(timer);
|
|
191
|
+
resolve(this.callbackResult);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
setTimeout(checkResult, 100);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
checkResult();
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
cleanup() {
|
|
201
|
+
if (this.server) {
|
|
202
|
+
this.server.close();
|
|
203
|
+
delete this.server;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=sso-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-auth.js","sourceRoot":"","sources":["../../src/utils/sso-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Authentication Gateway for SSO-enabled Claude binary
|
|
3
|
+
*
|
|
4
|
+
* This creates a local HTTP server that proxies requests from the claude binary
|
|
5
|
+
* to the codemie API, adding SSO authentication cookies in the process.
|
|
6
|
+
*/
|
|
7
|
+
export interface GatewayConfig {
|
|
8
|
+
targetApiUrl: string;
|
|
9
|
+
port?: number;
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
clientType?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class SSOGateway {
|
|
14
|
+
private server;
|
|
15
|
+
private credentials;
|
|
16
|
+
private config;
|
|
17
|
+
private actualPort;
|
|
18
|
+
constructor(config: GatewayConfig);
|
|
19
|
+
/**
|
|
20
|
+
* Start the gateway server on a random available port
|
|
21
|
+
*/
|
|
22
|
+
start(): Promise<{
|
|
23
|
+
port: number;
|
|
24
|
+
url: string;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Stop the gateway server
|
|
28
|
+
*/
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Handle incoming requests from claude binary
|
|
32
|
+
*/
|
|
33
|
+
private handleRequest;
|
|
34
|
+
/**
|
|
35
|
+
* Read request body from incoming request
|
|
36
|
+
*/
|
|
37
|
+
private readRequestBody;
|
|
38
|
+
/**
|
|
39
|
+
* Make HTTP request without async promise executor
|
|
40
|
+
*/
|
|
41
|
+
private makeHttpRequest;
|
|
42
|
+
/**
|
|
43
|
+
* Find an available port for the gateway server
|
|
44
|
+
*/
|
|
45
|
+
private findAvailablePort;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sso-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-gateway.d.ts","sourceRoot":"","sources":["../../src/utils/sso-gateway.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAa;gBAEnB,MAAM,EAAE,aAAa;IAIjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAiDrD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;OAEG;YACW,aAAa;IA6K3B;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,eAAe;IA4C7B;;OAEG;YACW,iBAAiB;CAsBhC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Authentication Gateway for SSO-enabled Claude binary
|
|
3
|
+
*
|
|
4
|
+
* This creates a local HTTP server that proxies requests from the claude binary
|
|
5
|
+
* to the codemie API, adding SSO authentication cookies in the process.
|
|
6
|
+
*/
|
|
7
|
+
import { createServer } from 'http';
|
|
8
|
+
import { CredentialStore } from './credential-store.js';
|
|
9
|
+
import { logger } from './logger.js';
|
|
10
|
+
export class SSOGateway {
|
|
11
|
+
server = null;
|
|
12
|
+
credentials = null;
|
|
13
|
+
config;
|
|
14
|
+
actualPort = 0;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Start the gateway server on a random available port
|
|
20
|
+
*/
|
|
21
|
+
async start() {
|
|
22
|
+
// Load SSO credentials
|
|
23
|
+
const store = CredentialStore.getInstance();
|
|
24
|
+
this.credentials = await store.retrieveSSOCredentials();
|
|
25
|
+
if (!this.credentials) {
|
|
26
|
+
throw new Error('SSO credentials not found. Please run: codemie auth login');
|
|
27
|
+
}
|
|
28
|
+
// Find available port
|
|
29
|
+
this.actualPort = this.config.port || await this.findAvailablePort();
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
this.server = createServer((req, res) => {
|
|
32
|
+
this.handleRequest(req, res).catch(error => {
|
|
33
|
+
logger.error('Gateway request error:', error);
|
|
34
|
+
res.statusCode = 500;
|
|
35
|
+
res.end('Internal Server Error');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
this.server.on('error', (error) => {
|
|
39
|
+
if (error.code === 'EADDRINUSE') {
|
|
40
|
+
// Try a different random port
|
|
41
|
+
this.actualPort = 0; // Let system assign
|
|
42
|
+
this.server?.listen(this.actualPort, 'localhost');
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
reject(error);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
this.server.listen(this.actualPort, 'localhost', () => {
|
|
49
|
+
const address = this.server?.address();
|
|
50
|
+
if (typeof address === 'object' && address) {
|
|
51
|
+
this.actualPort = address.port;
|
|
52
|
+
}
|
|
53
|
+
const gatewayUrl = `http://localhost:${this.actualPort}`;
|
|
54
|
+
if (this.config.debug) {
|
|
55
|
+
logger.info(`[DEBUG] SSO Gateway started on ${gatewayUrl}`);
|
|
56
|
+
logger.info(`[DEBUG] Proxying to: ${this.config.targetApiUrl}`);
|
|
57
|
+
}
|
|
58
|
+
resolve({ port: this.actualPort, url: gatewayUrl });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stop the gateway server
|
|
64
|
+
*/
|
|
65
|
+
async stop() {
|
|
66
|
+
if (this.server) {
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
this.server.close(() => {
|
|
69
|
+
if (this.config.debug) {
|
|
70
|
+
logger.info('[DEBUG] SSO Gateway stopped');
|
|
71
|
+
}
|
|
72
|
+
resolve();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Handle incoming requests from claude binary
|
|
79
|
+
*/
|
|
80
|
+
async handleRequest(req, res) {
|
|
81
|
+
if (!this.credentials) {
|
|
82
|
+
res.statusCode = 401;
|
|
83
|
+
res.end('SSO credentials not available');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
// Construct target URL by properly joining base URL with request path
|
|
88
|
+
// This ensures we preserve both the API path and query parameters
|
|
89
|
+
const requestUrl = req.url || '/';
|
|
90
|
+
let targetUrl;
|
|
91
|
+
// If targetApiUrl already includes path components (like /code-assistant-api),
|
|
92
|
+
// we need to append the request path correctly
|
|
93
|
+
if (this.config.targetApiUrl.endsWith('/')) {
|
|
94
|
+
// Remove leading slash from request URL to avoid double slashes
|
|
95
|
+
targetUrl = `${this.config.targetApiUrl}${requestUrl.startsWith('/') ? requestUrl.slice(1) : requestUrl}`;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Ensure proper slash separation
|
|
99
|
+
targetUrl = `${this.config.targetApiUrl}${requestUrl.startsWith('/') ? requestUrl : '/' + requestUrl}`;
|
|
100
|
+
}
|
|
101
|
+
// Prepare headers for forwarding
|
|
102
|
+
const forwardHeaders = {};
|
|
103
|
+
// Copy relevant headers from claude
|
|
104
|
+
if (req.headers) {
|
|
105
|
+
Object.entries(req.headers).forEach(([key, value]) => {
|
|
106
|
+
if (key.toLowerCase() !== 'host' && key.toLowerCase() !== 'connection') {
|
|
107
|
+
forwardHeaders[key] = Array.isArray(value) ? value[0] : value || '';
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Add SSO authentication cookies
|
|
112
|
+
const cookieHeader = Object.entries(this.credentials.cookies)
|
|
113
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
114
|
+
.join('; ');
|
|
115
|
+
forwardHeaders['Cookie'] = cookieHeader;
|
|
116
|
+
// Add CodeMie integration header for ai-run-sso
|
|
117
|
+
try {
|
|
118
|
+
const { ConfigLoader } = await import('./config-loader.js');
|
|
119
|
+
const config = await ConfigLoader.load();
|
|
120
|
+
if (config.codeMieIntegration?.id && config.provider === 'ai-run-sso') {
|
|
121
|
+
forwardHeaders['X-CodeMie-Integration'] = config.codeMieIntegration.id;
|
|
122
|
+
if (this.config.debug) {
|
|
123
|
+
console.log(`[DEBUG] Added CodeMie integration header: ${config.codeMieIntegration.id}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
// Non-fatal error - continue without integration header
|
|
129
|
+
if (this.config.debug) {
|
|
130
|
+
console.log(`[DEBUG] Could not load config for integration header: ${error}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Add CodeMie client type header for request tracking
|
|
134
|
+
if (this.config.clientType) {
|
|
135
|
+
forwardHeaders['X-CodeMie-Client'] = this.config.clientType;
|
|
136
|
+
if (this.config.debug) {
|
|
137
|
+
console.log(`[DEBUG] Added CodeMie client header: ${this.config.clientType}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Handle request body for POST/PUT requests
|
|
141
|
+
let body = '';
|
|
142
|
+
if (req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH') {
|
|
143
|
+
body = await this.readRequestBody(req);
|
|
144
|
+
}
|
|
145
|
+
if (this.config.debug) {
|
|
146
|
+
console.log(`[DEBUG] About to fetch: ${targetUrl}`);
|
|
147
|
+
console.log(`[DEBUG] Method: ${req.method || 'GET'}`);
|
|
148
|
+
console.log(`[DEBUG] Cookie header present: ${!!forwardHeaders['Cookie']}`);
|
|
149
|
+
}
|
|
150
|
+
// Use native Node.js https module for better SSL control (following codemie-model-fetcher pattern)
|
|
151
|
+
// Always disable SSL verification to handle enterprise certificates like codemie-model-fetcher does
|
|
152
|
+
const https = await import('https');
|
|
153
|
+
const { URL } = await import('url');
|
|
154
|
+
const parsedUrl = new URL(targetUrl);
|
|
155
|
+
const requestOptions = {
|
|
156
|
+
hostname: parsedUrl.hostname,
|
|
157
|
+
port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
|
|
158
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
159
|
+
method: req.method || 'GET',
|
|
160
|
+
headers: forwardHeaders,
|
|
161
|
+
rejectUnauthorized: false, // Always allow self-signed certificates like codemie-model-fetcher
|
|
162
|
+
timeout: 30000
|
|
163
|
+
};
|
|
164
|
+
if (this.config.debug) {
|
|
165
|
+
console.log(`[DEBUG] Using native https with SSL verification disabled (like codemie-model-fetcher)`);
|
|
166
|
+
}
|
|
167
|
+
const responseData = await this.makeHttpRequest(https, parsedUrl, requestOptions, body);
|
|
168
|
+
// Create a Response-like object
|
|
169
|
+
const response = new Response(responseData.data, {
|
|
170
|
+
status: responseData.statusCode || 200,
|
|
171
|
+
statusText: responseData.statusMessage || 'OK',
|
|
172
|
+
headers: responseData.headers
|
|
173
|
+
});
|
|
174
|
+
// Forward response status and headers
|
|
175
|
+
res.statusCode = response.status;
|
|
176
|
+
// Copy response headers
|
|
177
|
+
response.headers.forEach((value, key) => {
|
|
178
|
+
// Skip headers that might cause issues
|
|
179
|
+
if (!['transfer-encoding', 'connection'].includes(key.toLowerCase())) {
|
|
180
|
+
res.setHeader(key, value);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
// Stream response body
|
|
184
|
+
if (response.body) {
|
|
185
|
+
const reader = response.body.getReader();
|
|
186
|
+
const pump = async () => {
|
|
187
|
+
const { done, value } = await reader.read();
|
|
188
|
+
if (done) {
|
|
189
|
+
res.end();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
res.write(Buffer.from(value));
|
|
193
|
+
return pump();
|
|
194
|
+
};
|
|
195
|
+
await pump();
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
res.end();
|
|
199
|
+
}
|
|
200
|
+
if (this.config.debug) {
|
|
201
|
+
logger.info(`[DEBUG] Proxied ${req.method} ${req.url} -> ${response.status}`);
|
|
202
|
+
// Log request details for OpenAPI spec creation
|
|
203
|
+
console.log(`\n=== REQUEST DETAILS ===`);
|
|
204
|
+
console.log(`Method: ${req.method}`);
|
|
205
|
+
console.log(`Original URL: ${req.url}`);
|
|
206
|
+
console.log(`Target URL: ${targetUrl}`);
|
|
207
|
+
console.log(`Headers:`, JSON.stringify(forwardHeaders, null, 2));
|
|
208
|
+
if (body) {
|
|
209
|
+
console.log(`Body:`, body);
|
|
210
|
+
}
|
|
211
|
+
console.log(`Response Status: ${response.status}`);
|
|
212
|
+
console.log(`======================\n`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
logger.error('Gateway proxy error:', error);
|
|
217
|
+
if (this.config.debug) {
|
|
218
|
+
console.log(`[DEBUG] Proxy error for request: ${req.url}`);
|
|
219
|
+
console.log(`[DEBUG] Error details:`, error);
|
|
220
|
+
}
|
|
221
|
+
res.statusCode = 502;
|
|
222
|
+
res.end('Bad Gateway');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Read request body from incoming request
|
|
227
|
+
*/
|
|
228
|
+
async readRequestBody(req) {
|
|
229
|
+
return new Promise((resolve, reject) => {
|
|
230
|
+
let body = '';
|
|
231
|
+
req.on('data', chunk => {
|
|
232
|
+
body += chunk.toString();
|
|
233
|
+
});
|
|
234
|
+
req.on('end', () => {
|
|
235
|
+
resolve(body);
|
|
236
|
+
});
|
|
237
|
+
req.on('error', reject);
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Make HTTP request without async promise executor
|
|
242
|
+
*/
|
|
243
|
+
async makeHttpRequest(https, parsedUrl, requestOptions, body) {
|
|
244
|
+
const protocol = parsedUrl.protocol === 'https:' ? https : await import('http');
|
|
245
|
+
return new Promise((resolve, reject) => {
|
|
246
|
+
const req = protocol.request(requestOptions, (res) => {
|
|
247
|
+
const chunks = [];
|
|
248
|
+
res.on('data', (chunk) => {
|
|
249
|
+
chunks.push(Buffer.from(chunk));
|
|
250
|
+
});
|
|
251
|
+
res.on('end', () => {
|
|
252
|
+
resolve({
|
|
253
|
+
statusCode: res.statusCode,
|
|
254
|
+
statusMessage: res.statusMessage,
|
|
255
|
+
data: Buffer.concat(chunks),
|
|
256
|
+
headers: res.headers
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
req.on('error', (error) => {
|
|
261
|
+
reject(error);
|
|
262
|
+
});
|
|
263
|
+
req.on('timeout', () => {
|
|
264
|
+
req.destroy();
|
|
265
|
+
reject(new Error('Request timeout'));
|
|
266
|
+
});
|
|
267
|
+
// Write body for POST/PUT requests
|
|
268
|
+
if (body) {
|
|
269
|
+
req.write(body);
|
|
270
|
+
}
|
|
271
|
+
req.end();
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Find an available port for the gateway server
|
|
276
|
+
*/
|
|
277
|
+
async findAvailablePort(startPort = 3001) {
|
|
278
|
+
return new Promise((resolve, reject) => {
|
|
279
|
+
const server = createServer();
|
|
280
|
+
server.listen(0, 'localhost', () => {
|
|
281
|
+
const address = server.address();
|
|
282
|
+
const port = typeof address === 'object' && address ? address.port : startPort;
|
|
283
|
+
server.close(() => {
|
|
284
|
+
resolve(port);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
server.on('error', (error) => {
|
|
288
|
+
if (error.code === 'EADDRINUSE') {
|
|
289
|
+
resolve(this.findAvailablePort(startPort + 1));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
reject(error);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=sso-gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-gateway.js","sourceRoot":"","sources":["../../src/utils/sso-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VCS provider detection utilities
|
|
3
|
+
*/
|
|
4
|
+
import type { VCSProvider, VCSDetectionResult } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Detect VCS provider from git remote URL
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectVCSProvider(cwd?: string): VCSDetectionResult;
|
|
9
|
+
/**
|
|
10
|
+
* Get workflow directory for a specific provider
|
|
11
|
+
*/
|
|
12
|
+
export declare function getWorkflowDir(provider: VCSProvider, cwd?: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Check if workflow directory exists
|
|
15
|
+
*/
|
|
16
|
+
export declare function workflowDirExists(provider: VCSProvider, cwd?: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Create workflow directory if it doesn't exist
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureWorkflowDir(provider: VCSProvider, cwd?: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* List installed workflows
|
|
23
|
+
*/
|
|
24
|
+
export declare function listInstalledWorkflows(provider: VCSProvider, cwd?: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Check if a specific workflow is installed
|
|
27
|
+
*/
|
|
28
|
+
export declare function isWorkflowInstalled(workflowId: string, provider: VCSProvider, cwd?: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Get git repository information
|
|
31
|
+
*/
|
|
32
|
+
export declare function getGitRepoInfo(cwd?: string): {
|
|
33
|
+
owner: string | null;
|
|
34
|
+
repo: string | null;
|
|
35
|
+
url: string | null;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/workflows/detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,kBAAkB,CA2CjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAKzF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAG7F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAQ5F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAiBnG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,WAAW,EACrB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG;IAC3D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAqCA"}
|