@reepoe/plugin 1.1.5 ā 1.1.8
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/bin/metrics.js +3 -3
- package/bin/reepoe.js +31 -132
- package/bin/start.js +28 -5
- package/lib/activation-client.js +9 -1
- package/package.json +1 -1
package/bin/metrics.js
CHANGED
|
@@ -24,9 +24,9 @@ async function showMetrics() {
|
|
|
24
24
|
console.log('\nš Loading your ReePoe metrics...\n');
|
|
25
25
|
|
|
26
26
|
try {
|
|
27
|
-
// Use per-user metrics endpoint
|
|
28
|
-
const
|
|
29
|
-
const res = await axios.get(`${
|
|
27
|
+
// Use per-user metrics endpoint with api_base from activation
|
|
28
|
+
const API_BASE = activation.api_base || 'https://reepoe-api.onrender.com';
|
|
29
|
+
const res = await axios.get(`${API_BASE}/api/metrics/user/${activation.email}`);
|
|
30
30
|
const data = res.data;
|
|
31
31
|
|
|
32
32
|
// Per-user endpoint returns the correct structure already
|
package/bin/reepoe.js
CHANGED
|
@@ -1,143 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
* ReePoe CLI - Main command wrapper
|
|
4
|
-
* Manages ReePoe binary execution and queries
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { spawn } = require('child_process');
|
|
8
|
-
const path = require('path');
|
|
2
|
+
const axios = require('axios');
|
|
9
3
|
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
10
5
|
const os = require('os');
|
|
11
6
|
|
|
12
|
-
|
|
13
|
-
function getBinaryPath() {
|
|
14
|
-
const platform = os.platform();
|
|
15
|
-
const arch = os.arch();
|
|
16
|
-
|
|
17
|
-
let binaryName;
|
|
18
|
-
if (platform === 'darwin') {
|
|
19
|
-
binaryName = arch === 'arm64' ? 'reepoe-macos-arm64' : 'reepoe-macos-x64';
|
|
20
|
-
} else if (platform === 'linux') {
|
|
21
|
-
binaryName = 'reepoe-linux-x64';
|
|
22
|
-
} else if (platform === 'win32') {
|
|
23
|
-
binaryName = 'reepoe-windows.exe';
|
|
24
|
-
} else {
|
|
25
|
-
console.error(`ā Unsupported platform: ${platform}`);
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const binaryPath = path.join(__dirname, '../binaries', binaryName);
|
|
30
|
-
|
|
31
|
-
if (!fs.existsSync(binaryPath)) {
|
|
32
|
-
console.error(`ā Binary not found: ${binaryPath}`);
|
|
33
|
-
console.error(` Platform: ${platform}-${arch}`);
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return binaryPath;
|
|
38
|
-
}
|
|
7
|
+
const ACTIVATION_FILE = path.join(os.homedir(), '.reepoe', 'activation.json');
|
|
39
8
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
showHelp();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (args[0] === 'version' || args[0] === '--version') {
|
|
51
|
-
console.log('ReePoe Plugin v1.0.0');
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (args[0] === 'query') {
|
|
56
|
-
// Direct query command
|
|
57
|
-
const query = args.slice(1).join(' ');
|
|
58
|
-
makeQuery(query);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// For other commands, pass through to binary
|
|
63
|
-
console.log('ā¹ļø Use specific commands: reepoe-start, reepoe-stop, reepoe-status');
|
|
64
|
-
console.log(' Or: reepoe query "your question here"');
|
|
9
|
+
function loadActivation() {
|
|
10
|
+
if (!fs.existsSync(ACTIVATION_FILE)) {
|
|
11
|
+
console.error('ā Not activated. Run: reepoe-start');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
return JSON.parse(fs.readFileSync(ACTIVATION_FILE, 'utf8'));
|
|
65
15
|
}
|
|
66
16
|
|
|
67
|
-
function
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
MANAGEMENT:
|
|
85
|
-
reepoe-start Start server in background
|
|
86
|
-
reepoe-stop Stop server
|
|
87
|
-
reepoe-status Check if server is running
|
|
88
|
-
|
|
89
|
-
MORE INFO:
|
|
90
|
-
Documentation: https://reepoe.com/docs
|
|
91
|
-
API: http://localhost:<port>/describe
|
|
92
|
-
`);
|
|
17
|
+
async function query(instruction) {
|
|
18
|
+
const activation = loadActivation();
|
|
19
|
+
const API_BASE = activation.api_base || 'http://localhost:8000';
|
|
20
|
+
|
|
21
|
+
console.log(`š¤ ReePoe processing: "${instruction}"`);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const response = await axios.post(`${API_BASE}/query`, {
|
|
25
|
+
instruction,
|
|
26
|
+
user_email: activation.email
|
|
27
|
+
}, { timeout: 60000 });
|
|
28
|
+
|
|
29
|
+
console.log(response.data.response || JSON.stringify(response.data, null, 2));
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error('ā Query failed:', error.response?.data?.detail || error.message);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
93
34
|
}
|
|
94
35
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// Read config to get port
|
|
100
|
-
let port = 8000;
|
|
101
|
-
if (fs.existsSync(configPath)) {
|
|
102
|
-
try {
|
|
103
|
-
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
104
|
-
port = config.api?.port || 8000;
|
|
105
|
-
} catch (e) {
|
|
106
|
-
// Use default port
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Load activation to get user email for per-user metrics
|
|
111
|
-
let userEmail = null;
|
|
112
|
-
const activationPath = path.join(os.homedir(), '.reepoe', 'activation.json');
|
|
113
|
-
if (fs.existsSync(activationPath)) {
|
|
114
|
-
try {
|
|
115
|
-
const activation = JSON.parse(fs.readFileSync(activationPath, 'utf8'));
|
|
116
|
-
userEmail = activation.email;
|
|
117
|
-
} catch (e) {
|
|
118
|
-
// No activation or invalid - metrics will be aggregate only
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const url = `http://localhost:${port}/query`;
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
console.log(`\nš¤ ReePoe processing: "${query}"\n`);
|
|
126
|
-
const requestBody = { instruction: query };
|
|
127
|
-
if (userEmail) {
|
|
128
|
-
requestBody.user_email = userEmail;
|
|
129
|
-
}
|
|
130
|
-
const response = await axios.post(url, requestBody);
|
|
131
|
-
console.log(response.data.response || response.data);
|
|
132
|
-
} catch (error) {
|
|
133
|
-
if (error.code === 'ECONNREFUSED') {
|
|
134
|
-
console.error('ā ReePoe server not running. Start it with: reepoe-start');
|
|
135
|
-
} else {
|
|
136
|
-
console.error(`ā Query failed: ${error.message}`);
|
|
137
|
-
}
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
36
|
+
const args = process.argv.slice(2);
|
|
37
|
+
if (args.length === 0) {
|
|
38
|
+
console.log('Usage: reepoe query "your question"');
|
|
39
|
+
process.exit(1);
|
|
140
40
|
}
|
|
141
41
|
|
|
142
|
-
|
|
143
|
-
|
|
42
|
+
query(args.join(' '));
|
package/bin/start.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* ReePoe Start -
|
|
3
|
+
* ReePoe Start - Hybrid local/cloud startup
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { spawn } = require('child_process');
|
|
@@ -9,6 +9,15 @@ const fs = require('fs');
|
|
|
9
9
|
const os = require('os');
|
|
10
10
|
const axios = require('axios');
|
|
11
11
|
|
|
12
|
+
// Detect cloud environment
|
|
13
|
+
function isCloudEnvironment() {
|
|
14
|
+
return !!(
|
|
15
|
+
process.env.REPL_ID || // Replit
|
|
16
|
+
process.env.CODESPACE_NAME || // GitHub Codespaces
|
|
17
|
+
process.env.GITPOD_WORKSPACE_ID // Gitpod
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
12
21
|
// Get binary path
|
|
13
22
|
function getBinaryPath() {
|
|
14
23
|
const platform = os.platform();
|
|
@@ -23,7 +32,8 @@ function getBinaryPath() {
|
|
|
23
32
|
binaryName = 'reepoe-windows.exe';
|
|
24
33
|
}
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
const binaryPath = path.join(__dirname, '../binaries', binaryName);
|
|
36
|
+
return fs.existsSync(binaryPath) ? binaryPath : null;
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
// Check if server is already running
|
|
@@ -181,6 +191,19 @@ async function main() {
|
|
|
181
191
|
console.log('ā¹ļø No configuration found, using defaults');
|
|
182
192
|
}
|
|
183
193
|
|
|
194
|
+
// Detect cloud environment
|
|
195
|
+
const isCloud = isCloudEnvironment();
|
|
196
|
+
|
|
197
|
+
if (isCloud) {
|
|
198
|
+
// Cloud environment - skip local server
|
|
199
|
+
console.log('\nāļø Cloud environment detected');
|
|
200
|
+
console.log('š” Using production ReePoe API: https://reepoe-api.onrender.com\n');
|
|
201
|
+
console.log('ā
Ready to use!');
|
|
202
|
+
console.log('\nš” Try:');
|
|
203
|
+
console.log(' reepoe query "test query"\n');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
184
207
|
// Check if already running
|
|
185
208
|
const running = await isServerRunning(port);
|
|
186
209
|
if (running) {
|
|
@@ -193,9 +216,9 @@ async function main() {
|
|
|
193
216
|
// Get binary path
|
|
194
217
|
const binaryPath = getBinaryPath();
|
|
195
218
|
|
|
196
|
-
if (!
|
|
197
|
-
console.error(`ā ReePoe binary not found
|
|
198
|
-
console.error(' Try reinstalling: npm install -g
|
|
219
|
+
if (!binaryPath) {
|
|
220
|
+
console.error(`ā ReePoe binary not found for ${os.platform()}-${os.arch()}`);
|
|
221
|
+
console.error(' Try reinstalling: npm install -g reepoe');
|
|
199
222
|
process.exit(1);
|
|
200
223
|
}
|
|
201
224
|
|
package/lib/activation-client.js
CHANGED
|
@@ -231,12 +231,20 @@ class ActivationClient {
|
|
|
231
231
|
fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
+
// Detect cloud environment
|
|
235
|
+
const isCloud = !!(
|
|
236
|
+
process.env.REPL_ID ||
|
|
237
|
+
process.env.CODESPACE_NAME ||
|
|
238
|
+
process.env.GITPOD_WORKSPACE_ID
|
|
239
|
+
);
|
|
240
|
+
|
|
234
241
|
const data = {
|
|
235
242
|
email: activationData.user?.email || activationData.email,
|
|
236
243
|
token: activationData.token,
|
|
237
244
|
activated_at: activationData.user?.activated_at || new Date().toISOString(),
|
|
238
245
|
expires_at: activationData.user?.expires_at,
|
|
239
|
-
status: activationData.user?.status || 'active'
|
|
246
|
+
status: activationData.user?.status || 'active',
|
|
247
|
+
api_base: isCloud ? 'https://reepoe-api.onrender.com' : 'http://localhost:8000'
|
|
240
248
|
};
|
|
241
249
|
|
|
242
250
|
fs.writeFileSync(this.activationFile, JSON.stringify(data, null, 2), { mode: 0o600 });
|