noterai 0.1.0 → 0.1.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/bin/noter.js +85 -25
- package/bin/noter.js.map +1 -1
- package/package.json +1 -1
package/bin/noter.js
CHANGED
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
// 4. Injects all context into the running server
|
|
9
9
|
import { createApp, listenServer } from '../packages/server/dist/index.js';
|
|
10
10
|
import { loadConfig } from '../packages/server/dist/config.js';
|
|
11
|
-
import { resolveRepoContext
|
|
11
|
+
import { resolveRepoContext } from '../packages/server/dist/repoContext.js';
|
|
12
12
|
import { stateManager } from '../packages/server/dist/stateManager.js';
|
|
13
13
|
import { execSync } from 'child_process';
|
|
14
|
-
import { resolve, dirname } from 'path';
|
|
14
|
+
import { resolve, dirname, basename } from 'path';
|
|
15
15
|
import { fileURLToPath } from 'url';
|
|
16
16
|
import { existsSync, readFileSync } from 'fs';
|
|
17
17
|
const __filename = fileURLToPath(import.meta.url);
|
|
@@ -19,9 +19,9 @@ const __dirname = dirname(__filename);
|
|
|
19
19
|
const ROOT = resolve(__dirname, '..');
|
|
20
20
|
const CLIENT_DIST = resolve(ROOT, 'packages/client/dist');
|
|
21
21
|
const PACKAGE_JSON = resolve(ROOT, 'package.json');
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
const MAX_PORT_ATTEMPTS = 10;
|
|
23
|
+
const ORIGINAL_STDOUT_WRITE = process.stdout.write.bind(process.stdout);
|
|
24
|
+
const ORIGINAL_STDERR_WRITE = process.stderr.write.bind(process.stderr);
|
|
25
25
|
function logError(msg) {
|
|
26
26
|
console.error(`[noter] ${msg}`);
|
|
27
27
|
}
|
|
@@ -80,61 +80,121 @@ Examples:
|
|
|
80
80
|
console.log(help);
|
|
81
81
|
}
|
|
82
82
|
async function build() {
|
|
83
|
-
log('Building client...');
|
|
83
|
+
console.log('Building client...');
|
|
84
84
|
execSync('pnpm run build', { cwd: resolve(ROOT, 'packages/client'), stdio: 'inherit' });
|
|
85
|
-
log('Building server...');
|
|
85
|
+
console.log('Building server...');
|
|
86
86
|
execSync('pnpm run build', { cwd: resolve(ROOT, 'packages/server'), stdio: 'inherit' });
|
|
87
|
-
log('Build complete.');
|
|
87
|
+
console.log('Build complete.');
|
|
88
|
+
}
|
|
89
|
+
/** Temporarily suppress stdout/stderr noise during adapter initialization.
|
|
90
|
+
* Error-path logs (crash traces, adapter failures) are preserved on stderr
|
|
91
|
+
* by only suppressing during the narrow window around createApp(). */
|
|
92
|
+
function suppressOutput() {
|
|
93
|
+
const noop = () => true;
|
|
94
|
+
process.stdout.write = noop;
|
|
95
|
+
process.stderr.write = noop;
|
|
96
|
+
}
|
|
97
|
+
function restoreOutput() {
|
|
98
|
+
process.stdout.write = ORIGINAL_STDOUT_WRITE;
|
|
99
|
+
process.stderr.write = ORIGINAL_STDERR_WRITE;
|
|
88
100
|
}
|
|
89
101
|
async function serve(openBrowser) {
|
|
90
102
|
// Auto-build if client dist is missing
|
|
91
103
|
if (!existsSync(CLIENT_DIST)) {
|
|
92
|
-
|
|
104
|
+
restoreOutput();
|
|
105
|
+
console.log('Client build not found. Building...');
|
|
106
|
+
suppressOutput();
|
|
93
107
|
await build();
|
|
94
108
|
}
|
|
95
109
|
// Resolve repo context BEFORE starting the server
|
|
96
110
|
const cwd = process.cwd();
|
|
97
111
|
const repoCtx = resolveRepoContext(cwd);
|
|
98
|
-
// Log startup context
|
|
99
|
-
for (const line of formatStartupLog(repoCtx)) {
|
|
100
|
-
log(line);
|
|
101
|
-
}
|
|
102
112
|
// Store repo context in state manager so it's available to all routes/LLM prompts
|
|
103
113
|
stateManager.setRepoContext(repoCtx);
|
|
104
114
|
// Lazy-load config to pick up env vars (including PORT)
|
|
105
115
|
const cfg = loadConfig();
|
|
106
116
|
const { default: express } = await import('express');
|
|
117
|
+
// Suppress noisy [Server], [GenericAdapter], [noter] output during adapter init
|
|
118
|
+
suppressOutput();
|
|
107
119
|
const appServer = await createApp();
|
|
120
|
+
restoreOutput();
|
|
108
121
|
// Serve static frontend in production
|
|
109
122
|
appServer.app.use(express.static(CLIENT_DIST));
|
|
110
123
|
// Express v5 SPA fallback — catch-all route using {*path} parameter
|
|
111
124
|
appServer.app.get('{*path}', (_req, res) => {
|
|
112
125
|
res.sendFile(resolve(CLIENT_DIST, 'index.html'));
|
|
113
126
|
});
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
127
|
+
// Port fallback: try configured port, then increment up to MAX_PORT_ATTEMPTS times
|
|
128
|
+
const configuredPort = cfg.port;
|
|
129
|
+
let resolvedPort = configuredPort;
|
|
130
|
+
let started = false;
|
|
131
|
+
for (let attempt = 0; attempt < MAX_PORT_ATTEMPTS; attempt++) {
|
|
132
|
+
const tryPort = configuredPort + attempt;
|
|
133
|
+
try {
|
|
134
|
+
// Suppress "Server running on port" message from listenServer
|
|
135
|
+
suppressOutput();
|
|
136
|
+
await listenServer(appServer, tryPort);
|
|
137
|
+
restoreOutput();
|
|
138
|
+
resolvedPort = tryPort;
|
|
139
|
+
started = true;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
restoreOutput();
|
|
144
|
+
const msg = err.message;
|
|
145
|
+
if (msg.includes('EADDRINUSE')) {
|
|
146
|
+
// Port occupied, try next
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// Non-EADDRINUSE error — fatal
|
|
150
|
+
logError(msg);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
117
153
|
}
|
|
118
|
-
|
|
119
|
-
|
|
154
|
+
if (!started) {
|
|
155
|
+
const lo = configuredPort;
|
|
156
|
+
const hi = configuredPort + MAX_PORT_ATTEMPTS - 1;
|
|
157
|
+
console.log(`✖ no available port found in range ${lo}–${hi}`);
|
|
120
158
|
process.exit(1);
|
|
121
159
|
}
|
|
122
|
-
|
|
160
|
+
// Build clean startup block
|
|
161
|
+
const version = getVersion();
|
|
162
|
+
const divider = '─'.repeat(33);
|
|
163
|
+
const repoLine = repoCtx.repoRoot ? basename(repoCtx.repoRoot) : basename(cwd);
|
|
164
|
+
const agentsLine = repoCtx.instructionsFile ? `${repoCtx.instructionsFile} loaded` : 'none';
|
|
165
|
+
const harnessName = cfg.activeSource;
|
|
166
|
+
let harnessLine = harnessName;
|
|
167
|
+
if (repoCtx.autoAttachedSession) {
|
|
168
|
+
harnessLine += ` (session: ${repoCtx.autoAttachedSession.sessionId})`;
|
|
169
|
+
}
|
|
170
|
+
else if (repoCtx.repoRoot) {
|
|
171
|
+
harnessLine += ' (no session)';
|
|
172
|
+
}
|
|
173
|
+
let portLine = `http://localhost:${resolvedPort}`;
|
|
174
|
+
if (resolvedPort !== configuredPort) {
|
|
175
|
+
portLine += ` (${configuredPort} was in use)`;
|
|
176
|
+
}
|
|
177
|
+
console.log(`noter v${version}`);
|
|
178
|
+
console.log(divider);
|
|
179
|
+
console.log(`repo ${repoLine}`);
|
|
180
|
+
console.log(`agents ${agentsLine}`);
|
|
181
|
+
console.log(`harness ${harnessLine}`);
|
|
182
|
+
console.log(`port ${portLine}`);
|
|
183
|
+
console.log(divider);
|
|
184
|
+
console.log('ready. press ctrl+c to stop.');
|
|
123
185
|
if (openBrowser) {
|
|
124
|
-
const url = `http://localhost:${
|
|
125
|
-
log(`Opening browser at ${url}`);
|
|
186
|
+
const url = `http://localhost:${resolvedPort}`;
|
|
126
187
|
const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
127
188
|
try {
|
|
128
189
|
execSync(`${opener} ${url}`);
|
|
129
190
|
}
|
|
130
191
|
catch {
|
|
131
|
-
|
|
192
|
+
console.error(`Could not open browser. Visit ${url} manually.`);
|
|
132
193
|
}
|
|
133
194
|
}
|
|
134
|
-
log('Press Ctrl+C to stop.');
|
|
135
195
|
// Graceful shutdown handlers
|
|
136
196
|
const shutdown = async (signal) => {
|
|
137
|
-
|
|
197
|
+
console.error(`Received ${signal}, shutting down gracefully...`);
|
|
138
198
|
try {
|
|
139
199
|
await appServer.close();
|
|
140
200
|
}
|
|
@@ -183,7 +243,7 @@ async function main() {
|
|
|
183
243
|
break;
|
|
184
244
|
}
|
|
185
245
|
case 'dev':
|
|
186
|
-
log('Starting development mode...');
|
|
246
|
+
console.log('Starting development mode...');
|
|
187
247
|
try {
|
|
188
248
|
execSync('pnpm run dev', { cwd: ROOT, stdio: 'inherit' });
|
|
189
249
|
}
|
package/bin/noter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noter.js","sourceRoot":"","sources":["noter.ts"],"names":[],"mappings":";AACA,uCAAuC;AACvC,EAAE;AACF,wDAAwD;AACxD,mCAAmC;AACnC,uDAAuD;AACvD,qDAAqD;AACrD,mDAAmD;AAEnD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"noter.js","sourceRoot":"","sources":["noter.ts"],"names":[],"mappings":"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"}
|