opencode-puter-auth 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js ADDED
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Puter API Client
3
+ *
4
+ * Handles all communication with Puter.com's AI API
5
+ */
6
+ const DEFAULT_API_URL = 'https://api.puter.com';
7
+ const DEFAULT_TIMEOUT = 120000;
8
+ export class PuterClient {
9
+ authToken;
10
+ config;
11
+ constructor(authToken, config = {}) {
12
+ this.authToken = authToken;
13
+ this.config = config;
14
+ }
15
+ /**
16
+ * Get the API base URL
17
+ */
18
+ get apiUrl() {
19
+ return this.config.api_base_url || DEFAULT_API_URL;
20
+ }
21
+ /**
22
+ * Get the request timeout
23
+ */
24
+ get timeout() {
25
+ return this.config.api_timeout_ms || DEFAULT_TIMEOUT;
26
+ }
27
+ /**
28
+ * Update the auth token
29
+ */
30
+ setAuthToken(token) {
31
+ this.authToken = token;
32
+ }
33
+ /**
34
+ * Send a chat completion request (non-streaming)
35
+ */
36
+ async chat(messages, options = {}) {
37
+ const response = await this.makeRequest('complete', {
38
+ messages,
39
+ model: options.model || 'gpt-5-nano',
40
+ stream: false,
41
+ max_tokens: options.max_tokens,
42
+ temperature: options.temperature,
43
+ tools: options.tools,
44
+ });
45
+ return response.result;
46
+ }
47
+ /**
48
+ * Send a streaming chat completion request
49
+ */
50
+ async *chatStream(messages, options = {}) {
51
+ const controller = new AbortController();
52
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
53
+ try {
54
+ const response = await fetch(`${this.apiUrl}/drivers/call`, {
55
+ method: 'POST',
56
+ headers: {
57
+ 'Content-Type': 'application/json',
58
+ },
59
+ body: JSON.stringify({
60
+ interface: 'puter-chat-completion',
61
+ service: 'ai-chat',
62
+ method: 'complete',
63
+ args: {
64
+ messages,
65
+ model: options.model || 'gpt-5-nano',
66
+ stream: true,
67
+ max_tokens: options.max_tokens,
68
+ temperature: options.temperature,
69
+ tools: options.tools,
70
+ },
71
+ auth_token: this.authToken,
72
+ }),
73
+ signal: controller.signal,
74
+ });
75
+ if (!response.ok) {
76
+ const errorText = await response.text();
77
+ throw new Error(`Puter API error (${response.status}): ${errorText}`);
78
+ }
79
+ if (!response.body) {
80
+ throw new Error('No response body for streaming');
81
+ }
82
+ const reader = response.body.getReader();
83
+ const decoder = new TextDecoder();
84
+ let buffer = '';
85
+ while (true) {
86
+ const { value, done } = await reader.read();
87
+ if (done)
88
+ break;
89
+ buffer += decoder.decode(value, { stream: true });
90
+ const lines = buffer.split('\n');
91
+ buffer = lines.pop() || '';
92
+ for (const line of lines) {
93
+ if (!line.trim())
94
+ continue;
95
+ try {
96
+ const chunk = JSON.parse(line);
97
+ yield chunk;
98
+ if (chunk.done) {
99
+ return;
100
+ }
101
+ }
102
+ catch {
103
+ // Skip malformed JSON lines
104
+ continue;
105
+ }
106
+ }
107
+ }
108
+ // Process any remaining buffer
109
+ if (buffer.trim()) {
110
+ try {
111
+ const chunk = JSON.parse(buffer);
112
+ yield chunk;
113
+ }
114
+ catch {
115
+ // Ignore
116
+ }
117
+ }
118
+ }
119
+ finally {
120
+ clearTimeout(timeoutId);
121
+ }
122
+ }
123
+ /**
124
+ * List available models
125
+ */
126
+ async listModels() {
127
+ try {
128
+ const response = await fetch(`${this.apiUrl}/puterai/chat/models/details`, {
129
+ method: 'GET',
130
+ headers: {
131
+ 'Authorization': `Bearer ${this.authToken}`,
132
+ },
133
+ });
134
+ if (!response.ok) {
135
+ throw new Error(`Failed to fetch models: ${response.status}`);
136
+ }
137
+ const data = await response.json();
138
+ return data.models || data || [];
139
+ }
140
+ catch (error) {
141
+ // Return default models if API fails
142
+ return this.getDefaultModels();
143
+ }
144
+ }
145
+ /**
146
+ * Get default model list (fallback)
147
+ */
148
+ getDefaultModels() {
149
+ return [
150
+ // Claude Models
151
+ { id: 'claude-opus-4-5', name: 'Claude Opus 4.5', provider: 'anthropic', context_window: 200000, max_output_tokens: 64000, supports_streaming: true, supports_tools: true, supports_vision: true },
152
+ { id: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5', provider: 'anthropic', context_window: 200000, max_output_tokens: 64000, supports_streaming: true, supports_tools: true, supports_vision: true },
153
+ { id: 'claude-sonnet-4', name: 'Claude Sonnet 4', provider: 'anthropic', context_window: 200000, max_output_tokens: 64000, supports_streaming: true, supports_tools: true, supports_vision: true },
154
+ { id: 'claude-haiku-4-5', name: 'Claude Haiku 4.5', provider: 'anthropic', context_window: 200000, max_output_tokens: 64000, supports_streaming: true, supports_tools: true, supports_vision: true },
155
+ // GPT Models
156
+ { id: 'gpt-5-nano', name: 'GPT-5 Nano', provider: 'openai', context_window: 128000, max_output_tokens: 16384, supports_streaming: true, supports_tools: true, supports_vision: true },
157
+ { id: 'gpt-5.2', name: 'GPT-5.2', provider: 'openai', context_window: 128000, max_output_tokens: 32768, supports_streaming: true, supports_tools: true, supports_vision: true },
158
+ { id: 'gpt-4o', name: 'GPT-4o', provider: 'openai', context_window: 128000, max_output_tokens: 16384, supports_streaming: true, supports_tools: true, supports_vision: true },
159
+ { id: 'o3-mini', name: 'o3-mini', provider: 'openai', context_window: 128000, max_output_tokens: 32768, supports_streaming: true, supports_tools: true, supports_vision: false },
160
+ // Gemini Models
161
+ { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', provider: 'google', context_window: 1000000, max_output_tokens: 65536, supports_streaming: true, supports_tools: true, supports_vision: true },
162
+ { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', provider: 'google', context_window: 1000000, max_output_tokens: 65536, supports_streaming: true, supports_tools: true, supports_vision: true },
163
+ ];
164
+ }
165
+ /**
166
+ * Make a generic API request to the drivers endpoint
167
+ */
168
+ async makeRequest(method, args) {
169
+ const controller = new AbortController();
170
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
171
+ try {
172
+ const response = await fetch(`${this.apiUrl}/drivers/call`, {
173
+ method: 'POST',
174
+ headers: {
175
+ 'Content-Type': 'application/json',
176
+ },
177
+ body: JSON.stringify({
178
+ interface: 'puter-chat-completion',
179
+ service: 'ai-chat',
180
+ method,
181
+ args,
182
+ auth_token: this.authToken,
183
+ }),
184
+ signal: controller.signal,
185
+ });
186
+ if (!response.ok) {
187
+ const errorText = await response.text();
188
+ throw new Error(`Puter API error (${response.status}): ${errorText}`);
189
+ }
190
+ const data = await response.json();
191
+ return data;
192
+ }
193
+ finally {
194
+ clearTimeout(timeoutId);
195
+ }
196
+ }
197
+ /**
198
+ * Test the connection and auth token
199
+ */
200
+ async testConnection() {
201
+ try {
202
+ const response = await this.chat([{ role: 'user', content: 'Say "OK" and nothing else.' }], { model: 'gpt-5-nano', max_tokens: 10 });
203
+ return !!response.message?.content;
204
+ }
205
+ catch {
206
+ return false;
207
+ }
208
+ }
209
+ }
210
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * opencode-puter-auth - Puter.com OAuth Plugin for OpenCode
3
+ *
4
+ * Provides FREE, UNLIMITED access to Claude Opus 4.5, Sonnet 4.5, GPT-5, Gemini,
5
+ * and 500+ AI models through Puter.com's "User-Pays" model.
6
+ *
7
+ * @author chindris-mihai-alexandru
8
+ * @license MIT
9
+ */
10
+ export { PuterAuthPlugin } from './plugin.js';
11
+ export { PuterClient } from './client.js';
12
+ export { PuterAuthManager } from './auth.js';
13
+ export type { PuterConfig, PuterAccount, PuterChatOptions, PuterChatResponse } from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * opencode-puter-auth - Puter.com OAuth Plugin for OpenCode
3
+ *
4
+ * Provides FREE, UNLIMITED access to Claude Opus 4.5, Sonnet 4.5, GPT-5, Gemini,
5
+ * and 500+ AI models through Puter.com's "User-Pays" model.
6
+ *
7
+ * @author chindris-mihai-alexandru
8
+ * @license MIT
9
+ */
10
+ export { PuterAuthPlugin } from './plugin.js';
11
+ export { PuterClient } from './client.js';
12
+ export { PuterAuthManager } from './auth.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenCode Plugin for Puter.com Authentication
3
+ *
4
+ * This plugin provides FREE, UNLIMITED access to Claude Opus 4.5, Sonnet 4.5,
5
+ * GPT-5, Gemini, and 500+ AI models through Puter.com's "User-Pays" model.
6
+ *
7
+ * @author chindris-mihai-alexandru
8
+ * @license MIT
9
+ */
10
+ import type { Plugin } from '@opencode-ai/plugin';
11
+ /**
12
+ * Main Plugin Export
13
+ */
14
+ export declare const PuterAuthPlugin: Plugin;
15
+ export default PuterAuthPlugin;
16
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAsB,MAAM,qBAAqB,CAAC;AAuDtE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,MAuR7B,CAAC;AAGF,eAAe,eAAe,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,305 @@
1
+ /**
2
+ * OpenCode Plugin for Puter.com Authentication
3
+ *
4
+ * This plugin provides FREE, UNLIMITED access to Claude Opus 4.5, Sonnet 4.5,
5
+ * GPT-5, Gemini, and 500+ AI models through Puter.com's "User-Pays" model.
6
+ *
7
+ * @author chindris-mihai-alexandru
8
+ * @license MIT
9
+ */
10
+ import { tool } from '@opencode-ai/plugin';
11
+ import path from 'node:path';
12
+ import os from 'node:os';
13
+ import http from 'node:http';
14
+ import { URL } from 'node:url';
15
+ import { PuterClient } from './client.js';
16
+ import { PuterAuthManager } from './auth.js';
17
+ import { PuterConfigSchema } from './types.js';
18
+ // Default config directory
19
+ const getConfigDir = () => {
20
+ const xdgConfig = process.env.XDG_CONFIG_HOME;
21
+ if (xdgConfig) {
22
+ return path.join(xdgConfig, 'opencode');
23
+ }
24
+ return path.join(os.homedir(), '.config', 'opencode');
25
+ };
26
+ // Plugin state
27
+ let authManager = null;
28
+ let puterClient = null;
29
+ let pluginConfig = {};
30
+ // OAuth server state
31
+ const CALLBACK_PORT = 19847;
32
+ const AUTH_TIMEOUT_MS = 300000;
33
+ /**
34
+ * Load plugin configuration from puter.json
35
+ */
36
+ async function loadConfig(configDir) {
37
+ const fs = await import('node:fs/promises');
38
+ const configPath = path.join(configDir, 'puter.json');
39
+ try {
40
+ const data = await fs.readFile(configPath, 'utf-8');
41
+ const parsed = JSON.parse(data);
42
+ return PuterConfigSchema.partial().parse(parsed);
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ /**
49
+ * Log a message (respects quiet mode)
50
+ */
51
+ function log(message, level = 'info') {
52
+ if (pluginConfig.quiet_mode)
53
+ return;
54
+ const prefix = level === 'error' ? '❌' : level === 'warn' ? '⚠️' : '🟣';
55
+ console.log(`${prefix} [puter-auth] ${message}`);
56
+ }
57
+ /**
58
+ * Main Plugin Export
59
+ */
60
+ export const PuterAuthPlugin = async (_input) => {
61
+ const configDir = getConfigDir();
62
+ // Load configuration
63
+ pluginConfig = await loadConfig(configDir);
64
+ // Initialize auth manager
65
+ authManager = new PuterAuthManager(configDir, pluginConfig);
66
+ await authManager.init();
67
+ // Initialize client if we have an active account
68
+ const activeAccount = authManager.getActiveAccount();
69
+ if (activeAccount) {
70
+ puterClient = new PuterClient(activeAccount.authToken, pluginConfig);
71
+ log(`Loaded account: ${activeAccount.username}${activeAccount.isTemporary ? ' (temporary)' : ''}`);
72
+ }
73
+ return {
74
+ // ========================================
75
+ // AUTH HOOK - OAuth with Puter
76
+ // ========================================
77
+ auth: {
78
+ provider: 'puter',
79
+ // Load auth credentials for Puter provider
80
+ async loader(_auth, _provider) {
81
+ const account = authManager?.getActiveAccount();
82
+ if (account) {
83
+ return {
84
+ key: account.authToken,
85
+ username: account.username,
86
+ email: account.email,
87
+ };
88
+ }
89
+ return {};
90
+ },
91
+ methods: [
92
+ {
93
+ type: 'oauth',
94
+ label: 'Puter.com (FREE Unlimited AI)',
95
+ async authorize() {
96
+ return new Promise((resolve) => {
97
+ let resolved = false;
98
+ let server = null;
99
+ // Callback handler function
100
+ const callbackPromise = new Promise((resolveCallback) => {
101
+ server = http.createServer(async (req, res) => {
102
+ if (resolved) {
103
+ res.writeHead(200, { 'Content-Type': 'text/html' });
104
+ res.end('<html><body><h1>Already authenticated</h1></body></html>');
105
+ return;
106
+ }
107
+ const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
108
+ if (url.pathname === '/callback') {
109
+ const token = url.searchParams.get('token');
110
+ const username = url.searchParams.get('username') || 'puter_user';
111
+ const email = url.searchParams.get('email') || undefined;
112
+ const isTemp = url.searchParams.get('temp') === 'true';
113
+ if (token) {
114
+ resolved = true;
115
+ const account = {
116
+ username,
117
+ email,
118
+ authToken: token,
119
+ addedAt: Date.now(),
120
+ isTemporary: isTemp,
121
+ };
122
+ // Save account
123
+ if (authManager) {
124
+ await authManager.addAccount(account);
125
+ puterClient = new PuterClient(token, pluginConfig);
126
+ log(`Authenticated as: ${username}`);
127
+ }
128
+ res.writeHead(200, { 'Content-Type': 'text/html' });
129
+ res.end(`
130
+ <!DOCTYPE html>
131
+ <html>
132
+ <head>
133
+ <title>Puter Auth Success</title>
134
+ <style>
135
+ body { font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
136
+ .card { background: white; padding: 40px; border-radius: 16px; text-align: center; box-shadow: 0 10px 40px rgba(0,0,0,0.2); }
137
+ h1 { color: #22c55e; margin: 0 0 16px 0; }
138
+ p { color: #666; margin: 0; }
139
+ .emoji { font-size: 48px; margin-bottom: 16px; }
140
+ </style>
141
+ </head>
142
+ <body>
143
+ <div class="card">
144
+ <div class="emoji">✅</div>
145
+ <h1>Authentication Successful!</h1>
146
+ <p>You can close this window and return to OpenCode.</p>
147
+ </div>
148
+ </body>
149
+ </html>
150
+ `);
151
+ server?.close();
152
+ resolveCallback({ type: 'success', key: token });
153
+ }
154
+ else {
155
+ res.writeHead(400, { 'Content-Type': 'text/html' });
156
+ res.end('<html><body><h1>Missing token</h1></body></html>');
157
+ }
158
+ }
159
+ else if (url.pathname === '/') {
160
+ // Redirect to Puter auth
161
+ const callbackUrl = encodeURIComponent(`http://localhost:${CALLBACK_PORT}/callback`);
162
+ const authUrl = `https://puter.com/auth?redirect=${callbackUrl}`;
163
+ res.writeHead(302, { Location: authUrl });
164
+ res.end();
165
+ }
166
+ else {
167
+ res.writeHead(404);
168
+ res.end('Not found');
169
+ }
170
+ });
171
+ server.listen(CALLBACK_PORT, 'localhost');
172
+ // Timeout handler
173
+ setTimeout(() => {
174
+ if (!resolved) {
175
+ resolved = true;
176
+ server?.close();
177
+ resolveCallback({ type: 'failed' });
178
+ }
179
+ }, AUTH_TIMEOUT_MS);
180
+ server.on('error', () => {
181
+ if (!resolved) {
182
+ resolved = true;
183
+ resolveCallback({ type: 'failed' });
184
+ }
185
+ });
186
+ });
187
+ resolve({
188
+ url: `http://localhost:${CALLBACK_PORT}`,
189
+ instructions: 'Opening browser for Puter.com authentication. Sign in or create a FREE account to get unlimited AI access.',
190
+ method: 'auto',
191
+ callback: () => callbackPromise,
192
+ });
193
+ });
194
+ },
195
+ },
196
+ ],
197
+ },
198
+ // ========================================
199
+ // CUSTOM TOOLS
200
+ // ========================================
201
+ tool: {
202
+ 'puter-models': tool({
203
+ description: 'List all available Puter.com AI models (Claude, GPT, Gemini - all FREE)',
204
+ args: {},
205
+ async execute() {
206
+ if (!puterClient) {
207
+ return 'Not authenticated with Puter. Run: opencode auth login';
208
+ }
209
+ const models = await puterClient.listModels();
210
+ let output = '# Available Puter.com Models (FREE, UNLIMITED)\n\n';
211
+ // Group by provider
212
+ const byProvider = {};
213
+ for (const model of models) {
214
+ const provider = model.provider || 'other';
215
+ if (!byProvider[provider])
216
+ byProvider[provider] = [];
217
+ byProvider[provider].push(model);
218
+ }
219
+ for (const [provider, providerModels] of Object.entries(byProvider)) {
220
+ output += `## ${provider.charAt(0).toUpperCase() + provider.slice(1)}\n\n`;
221
+ for (const model of providerModels) {
222
+ output += `- **${model.id}** - ${model.name}\n`;
223
+ if (model.context_window) {
224
+ output += ` - Context: ${model.context_window.toLocaleString()} tokens\n`;
225
+ }
226
+ }
227
+ output += '\n';
228
+ }
229
+ output += `\nTotal: ${models.length} models available for FREE!`;
230
+ return output;
231
+ },
232
+ }),
233
+ 'puter-account': tool({
234
+ description: 'Show current Puter.com account information',
235
+ args: {},
236
+ async execute() {
237
+ if (!authManager) {
238
+ return 'Puter plugin not initialized';
239
+ }
240
+ const accounts = authManager.getAllAccounts();
241
+ const activeAccount = authManager.getActiveAccount();
242
+ if (accounts.length === 0) {
243
+ return 'No Puter accounts configured. Run: opencode auth login';
244
+ }
245
+ let output = '# Puter.com Accounts\n\n';
246
+ for (let i = 0; i < accounts.length; i++) {
247
+ const account = accounts[i];
248
+ const isActive = account === activeAccount;
249
+ const marker = isActive ? '→ ' : ' ';
250
+ const status = account.isTemporary ? '(temporary)' : '';
251
+ output += `${marker}${i + 1}. **${account.username}** ${status}\n`;
252
+ if (account.email) {
253
+ output += ` Email: ${account.email}\n`;
254
+ }
255
+ if (account.lastUsed) {
256
+ output += ` Last used: ${new Date(account.lastUsed).toLocaleString()}\n`;
257
+ }
258
+ }
259
+ output += '\n---\n';
260
+ output += 'Puter uses the "User-Pays" model - your usage is FREE and UNLIMITED!\n';
261
+ return output;
262
+ },
263
+ }),
264
+ 'puter-chat': tool({
265
+ description: 'Send a chat message using Puter AI (FREE). Use this to access Claude Opus 4.5, GPT-5, Gemini, etc.',
266
+ args: {
267
+ message: tool.schema.string().describe('The message to send to the AI'),
268
+ model: tool.schema.string().optional().describe('Model to use (default: claude-sonnet-4-5). Options: claude-opus-4-5, claude-sonnet-4-5, gpt-5.2, gpt-4o, gemini-2.5-pro, etc.'),
269
+ },
270
+ async execute(args) {
271
+ if (!puterClient) {
272
+ return 'Not authenticated with Puter. Run: opencode auth login';
273
+ }
274
+ const model = args.model || 'claude-sonnet-4-5';
275
+ const messages = [
276
+ { role: 'user', content: args.message },
277
+ ];
278
+ try {
279
+ const response = await puterClient.chat(messages, { model });
280
+ await authManager?.touchActiveAccount();
281
+ const content = response.message?.content || 'No response';
282
+ const usage = response.usage
283
+ ? `\n\n---\n*Model: ${model} | Tokens: ${response.usage.total_tokens}*`
284
+ : '';
285
+ return content + usage;
286
+ }
287
+ catch (error) {
288
+ return `Failed to chat with Puter AI: ${error instanceof Error ? error.message : 'Unknown error'}`;
289
+ }
290
+ },
291
+ }),
292
+ },
293
+ // ========================================
294
+ // EVENT HANDLER
295
+ // ========================================
296
+ async event({ event }) {
297
+ if (pluginConfig.debug) {
298
+ console.log(`[puter-auth] Event: ${event.type}`);
299
+ }
300
+ },
301
+ };
302
+ };
303
+ // Default export for OpenCode
304
+ export default PuterAuthPlugin;
305
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,2BAA2B;AAC3B,MAAM,YAAY,GAAG,GAAW,EAAE;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,eAAe;AACf,IAAI,WAAW,GAA4B,IAAI,CAAC;AAChD,IAAI,WAAW,GAAuB,IAAI,CAAC;AAC3C,IAAI,YAAY,GAAyB,EAAE,CAAC;AAE5C,qBAAqB;AACrB,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,SAAiB;IACzC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,iBAAiB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,GAAG,CAAC,OAAe,EAAE,QAAmC,MAAM;IACrE,IAAI,YAAY,CAAC,UAAU;QAAE,OAAO;IAEpC,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,iBAAiB,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAW,KAAK,EAAE,MAAmB,EAAkB,EAAE;IACnF,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,qBAAqB;IACrB,YAAY,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAE3C,0BAA0B;IAC1B,WAAW,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IAEzB,iDAAiD;IACjD,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACrD,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACrE,GAAG,CAAC,mBAAmB,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IAED,OAAO;QACL,2CAA2C;QAC3C,+BAA+B;QAC/B,2CAA2C;QAC3C,IAAI,EAAE;YACJ,QAAQ,EAAE,OAAO;YAEjB,2CAA2C;YAC3C,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS;gBAC3B,MAAM,OAAO,GAAG,WAAW,EAAE,gBAAgB,EAAE,CAAC;gBAChD,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO;wBACL,GAAG,EAAE,OAAO,CAAC,SAAS;wBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;qBACrB,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,+BAA+B;oBAEtC,KAAK,CAAC,SAAS;wBACb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;4BAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;4BACrB,IAAI,MAAM,GAAuB,IAAI,CAAC;4BAEtC,4BAA4B;4BAC5B,MAAM,eAAe,GAAG,IAAI,OAAO,CAAwD,CAAC,eAAe,EAAE,EAAE;gCAC7G,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;oCAC5C,IAAI,QAAQ,EAAE,CAAC;wCACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;wCACpD,GAAG,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;wCACpE,OAAO;oCACT,CAAC;oCAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,aAAa,EAAE,CAAC,CAAC;oCAEzE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;wCACjC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wCAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC;wCAClE,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;wCACzD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;wCAEvD,IAAI,KAAK,EAAE,CAAC;4CACV,QAAQ,GAAG,IAAI,CAAC;4CAEhB,MAAM,OAAO,GAAiB;gDAC5B,QAAQ;gDACR,KAAK;gDACL,SAAS,EAAE,KAAK;gDAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gDACnB,WAAW,EAAE,MAAM;6CACpB,CAAC;4CAEF,eAAe;4CACf,IAAI,WAAW,EAAE,CAAC;gDAChB,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gDACtC,WAAW,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gDACnD,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;4CACvC,CAAC;4CAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;4CACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;uBAqBP,CAAC,CAAC;4CAEH,MAAM,EAAE,KAAK,EAAE,CAAC;4CAChB,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;wCACnD,CAAC;6CAAM,CAAC;4CACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;4CACpD,GAAG,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;wCAC9D,CAAC;oCACH,CAAC;yCAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;wCAChC,yBAAyB;wCACzB,MAAM,WAAW,GAAG,kBAAkB,CAAC,oBAAoB,aAAa,WAAW,CAAC,CAAC;wCACrF,MAAM,OAAO,GAAG,mCAAmC,WAAW,EAAE,CAAC;wCAEjE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;wCAC1C,GAAG,CAAC,GAAG,EAAE,CAAC;oCACZ,CAAC;yCAAM,CAAC;wCACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;wCACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oCACvB,CAAC;gCACH,CAAC,CAAC,CAAC;gCAEH,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;gCAE1C,kBAAkB;gCAClB,UAAU,CAAC,GAAG,EAAE;oCACd,IAAI,CAAC,QAAQ,EAAE,CAAC;wCACd,QAAQ,GAAG,IAAI,CAAC;wCAChB,MAAM,EAAE,KAAK,EAAE,CAAC;wCAChB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oCACtC,CAAC;gCACH,CAAC,EAAE,eAAe,CAAC,CAAC;gCAEpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oCACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;wCACd,QAAQ,GAAG,IAAI,CAAC;wCAChB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oCACtC,CAAC;gCACH,CAAC,CAAC,CAAC;4BACL,CAAC,CAAC,CAAC;4BAEH,OAAO,CAAC;gCACN,GAAG,EAAE,oBAAoB,aAAa,EAAE;gCACxC,YAAY,EAAE,4GAA4G;gCAC1H,MAAM,EAAE,MAAe;gCACvB,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe;6BAChC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF;aACF;SACF;QAED,2CAA2C;QAC3C,eAAe;QACf,2CAA2C;QAC3C,IAAI,EAAE;YACJ,cAAc,EAAE,IAAI,CAAC;gBACnB,WAAW,EAAE,yEAAyE;gBACtF,IAAI,EAAE,EAAE;gBACR,KAAK,CAAC,OAAO;oBACX,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,OAAO,wDAAwD,CAAC;oBAClE,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;oBAE9C,IAAI,MAAM,GAAG,oDAAoD,CAAC;oBAElE,oBAAoB;oBACpB,MAAM,UAAU,GAAkC,EAAE,CAAC;oBACrD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC;wBAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;4BAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;wBACrD,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnC,CAAC;oBAED,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;wBACpE,MAAM,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;wBAC3E,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;4BACnC,MAAM,IAAI,OAAO,KAAK,CAAC,EAAE,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC;4BAChD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gCACzB,MAAM,IAAI,gBAAgB,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,WAAW,CAAC;4BAC7E,CAAC;wBACH,CAAC;wBACD,MAAM,IAAI,IAAI,CAAC;oBACjB,CAAC;oBAED,MAAM,IAAI,YAAY,MAAM,CAAC,MAAM,6BAA6B,CAAC;oBAEjE,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF,CAAC;YAEF,eAAe,EAAE,IAAI,CAAC;gBACpB,WAAW,EAAE,4CAA4C;gBACzD,IAAI,EAAE,EAAE;gBACR,KAAK,CAAC,OAAO;oBACX,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,OAAO,8BAA8B,CAAC;oBACxC,CAAC;oBAED,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;oBAC9C,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC;oBAErD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC1B,OAAO,wDAAwD,CAAC;oBAClE,CAAC;oBAED,IAAI,MAAM,GAAG,0BAA0B,CAAC;oBAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;wBAC5B,MAAM,QAAQ,GAAG,OAAO,KAAK,aAAa,CAAC;wBAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;wBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;wBAExD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,IAAI,CAAC;wBACnE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;4BAClB,MAAM,IAAI,gBAAgB,OAAO,CAAC,KAAK,IAAI,CAAC;wBAC9C,CAAC;wBACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACrB,MAAM,IAAI,oBAAoB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC;wBAChF,CAAC;oBACH,CAAC;oBAED,MAAM,IAAI,SAAS,CAAC;oBACpB,MAAM,IAAI,wEAAwE,CAAC;oBAEnF,OAAO,MAAM,CAAC;gBAChB,CAAC;aACF,CAAC;YAEF,YAAY,EAAE,IAAI,CAAC;gBACjB,WAAW,EAAE,oGAAoG;gBACjH,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;oBACvE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+HAA+H,CAAC;iBACjL;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,OAAO,wDAAwD,CAAC;oBAClE,CAAC;oBAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC;oBAChD,MAAM,QAAQ,GAAuB;wBACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;qBACxC,CAAC;oBAEF,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;wBAE7D,MAAM,WAAW,EAAE,kBAAkB,EAAE,CAAC;wBAExC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,IAAI,aAAa,CAAC;wBAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK;4BAC1B,CAAC,CAAC,oBAAoB,KAAK,cAAc,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG;4BACvE,CAAC,CAAC,EAAE,CAAC;wBAEP,OAAO,OAAO,GAAG,KAAK,CAAC;oBACzB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;oBACrG,CAAC;gBACH,CAAC;aACF,CAAC;SACH;QAED,2CAA2C;QAC3C,gBAAgB;QAChB,2CAA2C;QAC3C,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE;YACnB,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,8BAA8B;AAC9B,eAAe,eAAe,CAAC"}