@trenchwork/coder 1.4.0 → 1.5.0
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/contracts/v1/agent.d.ts +2 -0
- package/dist/contracts/v1/agent.d.ts.map +1 -1
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +77 -2
- package/dist/core/agent.js.map +1 -1
- package/dist/core/contextManager.d.ts +10 -137
- package/dist/core/contextManager.d.ts.map +1 -1
- package/dist/core/contextManager.js +74 -540
- package/dist/core/contextManager.js.map +1 -1
- package/dist/core/errorClassification.d.ts.map +1 -1
- package/dist/core/errorClassification.js +8 -0
- package/dist/core/errorClassification.js.map +1 -1
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +42 -19
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/keyResolution.d.ts +30 -0
- package/dist/core/keyResolution.d.ts.map +1 -0
- package/dist/core/keyResolution.js +38 -0
- package/dist/core/keyResolution.js.map +1 -0
- package/dist/core/permissionMode.d.ts +17 -2
- package/dist/core/permissionMode.d.ts.map +1 -1
- package/dist/core/permissionMode.js +20 -7
- package/dist/core/permissionMode.js.map +1 -1
- package/dist/core/reasoningFallback.d.ts +22 -0
- package/dist/core/reasoningFallback.d.ts.map +1 -0
- package/dist/core/reasoningFallback.js +22 -0
- package/dist/core/reasoningFallback.js.map +1 -0
- package/dist/core/sessionStore.js +34 -8
- package/dist/core/sessionStore.js.map +1 -1
- package/dist/core/slashCommands.d.ts.map +1 -1
- package/dist/core/slashCommands.js +0 -3
- package/dist/core/slashCommands.js.map +1 -1
- package/dist/core/taskCompletionDetector.d.ts.map +1 -1
- package/dist/core/taskCompletionDetector.js +10 -3
- package/dist/core/taskCompletionDetector.js.map +1 -1
- package/dist/core/toolRuntime.d.ts +1 -0
- package/dist/core/toolRuntime.d.ts.map +1 -1
- package/dist/core/toolRuntime.js +21 -2
- package/dist/core/toolRuntime.js.map +1 -1
- package/dist/core/turnTokenMeter.d.ts +19 -0
- package/dist/core/turnTokenMeter.d.ts.map +1 -0
- package/dist/core/turnTokenMeter.js +36 -0
- package/dist/core/turnTokenMeter.js.map +1 -0
- package/dist/headless/interactiveShell.d.ts +3 -3
- package/dist/headless/interactiveShell.d.ts.map +1 -1
- package/dist/headless/interactiveShell.js +68 -115
- package/dist/headless/interactiveShell.js.map +1 -1
- package/dist/plugins/providers/deepseek/index.js +4 -6
- package/dist/plugins/providers/deepseek/index.js.map +1 -1
- package/dist/providers/openaiChatCompletionsProvider.d.ts.map +1 -1
- package/dist/providers/openaiChatCompletionsProvider.js +33 -26
- package/dist/providers/openaiChatCompletionsProvider.js.map +1 -1
- package/dist/runtime/agentController.d.ts.map +1 -1
- package/dist/runtime/agentController.js +16 -7
- package/dist/runtime/agentController.js.map +1 -1
- package/dist/runtime/agentSession.d.ts.map +1 -1
- package/dist/runtime/agentSession.js +10 -3
- package/dist/runtime/agentSession.js.map +1 -1
- package/dist/tools/bashTools.d.ts +63 -0
- package/dist/tools/bashTools.d.ts.map +1 -1
- package/dist/tools/bashTools.js +186 -77
- package/dist/tools/bashTools.js.map +1 -1
- package/dist/tools/grepTools.d.ts.map +1 -1
- package/dist/tools/grepTools.js +41 -23
- package/dist/tools/grepTools.js.map +1 -1
- package/dist/tools/searchTools.d.ts.map +1 -1
- package/dist/tools/searchTools.js +18 -8
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/webTools.d.ts.map +1 -1
- package/dist/tools/webTools.js +10 -2
- package/dist/tools/webTools.js.map +1 -1
- package/dist/ui/ink/App.d.ts +6 -1
- package/dist/ui/ink/App.d.ts.map +1 -1
- package/dist/ui/ink/App.js +20 -2
- package/dist/ui/ink/App.js.map +1 -1
- package/dist/ui/ink/ChatStatic.d.ts.map +1 -1
- package/dist/ui/ink/ChatStatic.js +9 -2
- package/dist/ui/ink/ChatStatic.js.map +1 -1
- package/dist/ui/ink/InkPromptController.d.ts +8 -8
- package/dist/ui/ink/InkPromptController.d.ts.map +1 -1
- package/dist/ui/ink/InkPromptController.js +19 -11
- package/dist/ui/ink/InkPromptController.js.map +1 -1
- package/dist/ui/ink/StatusLine.d.ts +6 -7
- package/dist/ui/ink/StatusLine.d.ts.map +1 -1
- package/dist/ui/ink/StatusLine.js +9 -9
- package/dist/ui/ink/StatusLine.js.map +1 -1
- package/dist/ui/ink/markdownRender.d.ts +2 -0
- package/dist/ui/ink/markdownRender.d.ts.map +1 -0
- package/dist/ui/ink/markdownRender.js +76 -0
- package/dist/ui/ink/markdownRender.js.map +1 -0
- package/package.json +2 -1
- package/dist/core/hostedAuth.d.ts +0 -88
- package/dist/core/hostedAuth.d.ts.map +0 -1
- package/dist/core/hostedAuth.js +0 -219
- package/dist/core/hostedAuth.js.map +0 -1
package/dist/core/hostedAuth.js
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Hosted-key access — the CLIENT side of "optional sign-in unlocks hosted keys,
|
|
3
|
-
* or bring your own." Keys NEVER ship in this client (Project Glasswing); they
|
|
4
|
-
* live only in the ero.solar AWS backend, exactly like the Tavily search proxy
|
|
5
|
-
* already does (see src/tools/webTools.ts). Sign-in mints a short-lived token;
|
|
6
|
-
* the proxies validate it and use the operator keys.
|
|
7
|
-
*
|
|
8
|
-
* ── CONTRACT (the ero.solar backend implements this; this file codes against it) ──
|
|
9
|
-
* Sign-in (loopback OAuth, increment 2):
|
|
10
|
-
* open https://ero.solar/cli/login?port=<loopbackPort>&state=<csrf>
|
|
11
|
-
* → Google SSO → 302 http://127.0.0.1:<port>/cb?token=<jwt>&email=<e>&state=<csrf>
|
|
12
|
-
* DeepSeek (hosted): POST {HOSTED_DEEPSEEK_PROXY} header `Authorization: Bearer <token>`
|
|
13
|
-
* Tavily (hosted): the existing tavilySearch proxy, same Bearer token
|
|
14
|
-
* The token is short-lived and server-validated; if it 401s the CLI drops to
|
|
15
|
-
* "signed out" and asks the user to /login again or use their own key.
|
|
16
|
-
*
|
|
17
|
-
* THIS MODULE is state + resolution only (increment 1, fully testable). The live
|
|
18
|
-
* sign-in flow and the provider→proxy wiring are increment 2 (backend-gated).
|
|
19
|
-
*/
|
|
20
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, rmSync } from 'node:fs';
|
|
21
|
-
import { createServer } from 'node:http';
|
|
22
|
-
import { randomBytes } from 'node:crypto';
|
|
23
|
-
import { homedir } from 'node:os';
|
|
24
|
-
import { join, resolve } from 'node:path';
|
|
25
|
-
import { getSecretValue } from './secretStore.js';
|
|
26
|
-
// Contract endpoints (the backend the user is building must match these).
|
|
27
|
-
export const HOSTED_LOGIN_URL = 'https://ero.solar/cli/login';
|
|
28
|
-
export const HOSTED_DEEPSEEK_PROXY = 'https://ero.solar/api/deepseek';
|
|
29
|
-
// Resolved per call (not captured at module load) so TRENCHWORK_HOME changes —
|
|
30
|
-
// and tests pointing at a temp dir — take effect.
|
|
31
|
-
function homeDir() {
|
|
32
|
-
return process.env['TRENCHWORK_HOME'] ? resolve(process.env['TRENCHWORK_HOME']) : join(homedir(), '.trenchwork');
|
|
33
|
-
}
|
|
34
|
-
function sessionFile() {
|
|
35
|
-
return join(homeDir(), 'session.json');
|
|
36
|
-
}
|
|
37
|
-
function readFile() {
|
|
38
|
-
// Read the on-disk session first (the future /login writes it; it also holds
|
|
39
|
-
// the own/hosted preference), then let env override the token+email — env
|
|
40
|
-
// lets tests/CI inject a session without touching disk, while still honouring
|
|
41
|
-
// a stored preference.
|
|
42
|
-
let data = {};
|
|
43
|
-
const file = sessionFile();
|
|
44
|
-
if (existsSync(file)) {
|
|
45
|
-
try {
|
|
46
|
-
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
47
|
-
if (parsed && typeof parsed === 'object')
|
|
48
|
-
data = parsed;
|
|
49
|
-
}
|
|
50
|
-
catch { /* corrupt → treat as empty */ }
|
|
51
|
-
}
|
|
52
|
-
const envToken = process.env['TRENCHWORK_HOSTED_TOKEN']?.trim();
|
|
53
|
-
if (envToken) {
|
|
54
|
-
data.token = envToken;
|
|
55
|
-
data.email = process.env['TRENCHWORK_HOSTED_EMAIL']?.trim() || 'you@hosted';
|
|
56
|
-
}
|
|
57
|
-
return data;
|
|
58
|
-
}
|
|
59
|
-
function writeFile(data) {
|
|
60
|
-
const file = sessionFile();
|
|
61
|
-
mkdirSync(homeDir(), { recursive: true, mode: 0o700 });
|
|
62
|
-
const tmp = `${file}.${process.pid}.tmp`;
|
|
63
|
-
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
|
|
64
|
-
renameSync(tmp, file);
|
|
65
|
-
}
|
|
66
|
-
/** The active hosted session (token + email), or null when signed out. */
|
|
67
|
-
export function getHostedSession() {
|
|
68
|
-
const f = readFile();
|
|
69
|
-
return f.token ? { token: f.token, email: f.email || 'you@hosted' } : null;
|
|
70
|
-
}
|
|
71
|
-
/** Persist a hosted session (called by /login once the backend returns a token). */
|
|
72
|
-
export function setHostedSession(session) {
|
|
73
|
-
const f = readFile();
|
|
74
|
-
writeFile({ ...f, token: session.token, email: session.email });
|
|
75
|
-
}
|
|
76
|
-
/** Sign out: drop the token but keep the own/hosted preference. */
|
|
77
|
-
export function clearHostedSession() {
|
|
78
|
-
const f = readFile();
|
|
79
|
-
delete f.token;
|
|
80
|
-
delete f.email;
|
|
81
|
-
if (Object.keys(f).length === 0) {
|
|
82
|
-
try {
|
|
83
|
-
rmSync(sessionFile(), { force: true });
|
|
84
|
-
}
|
|
85
|
-
catch { /* ignore */ }
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
writeFile(f);
|
|
89
|
-
}
|
|
90
|
-
export function prefersOwnKeys() {
|
|
91
|
-
return readFile().preferOwnKeys === true;
|
|
92
|
-
}
|
|
93
|
-
export function setPreferOwnKeys(value) {
|
|
94
|
-
writeFile({ ...readFile(), preferOwnKeys: value });
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Resolve which keys are in effect. Preference order: an explicit "use my own
|
|
98
|
-
* keys" wins when the user actually has a DeepSeek key; otherwise a hosted
|
|
99
|
-
* session is used; otherwise the user's own key; otherwise nothing is set up.
|
|
100
|
-
*/
|
|
101
|
-
export function resolveKeyMode() {
|
|
102
|
-
const session = getHostedSession();
|
|
103
|
-
const ownDeepSeek = Boolean(getSecretValue('DEEPSEEK_API_KEY'));
|
|
104
|
-
const ownTavily = Boolean(getSecretValue('TAVILY_API_KEY'));
|
|
105
|
-
const preferOwnKeys = prefersOwnKeys();
|
|
106
|
-
let mode;
|
|
107
|
-
if (preferOwnKeys && ownDeepSeek)
|
|
108
|
-
mode = 'own';
|
|
109
|
-
else if (session)
|
|
110
|
-
mode = 'hosted';
|
|
111
|
-
else if (ownDeepSeek)
|
|
112
|
-
mode = 'own';
|
|
113
|
-
else
|
|
114
|
-
mode = 'none';
|
|
115
|
-
return { mode, email: session?.email ?? null, signedIn: Boolean(session), ownDeepSeek, ownTavily, preferOwnKeys };
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* The dim welcome/banner line that makes the active key source unmistakable —
|
|
119
|
-
* the user must be able to see at a glance whether they're on hosted keys or
|
|
120
|
-
* their own. Returns null in 'none' mode (the welcome already shows key setup).
|
|
121
|
-
*/
|
|
122
|
-
export function keyModeLine(status = resolveKeyMode()) {
|
|
123
|
-
switch (status.mode) {
|
|
124
|
-
case 'hosted':
|
|
125
|
-
return `Signed in as ${status.email} · using hosted keys` +
|
|
126
|
-
(status.ownDeepSeek ? ' · /account to use your own' : '');
|
|
127
|
-
case 'own': {
|
|
128
|
-
const tav = status.ownTavily ? 'Tavily ✓' : 'Tavily (shared proxy)';
|
|
129
|
-
const base = `Using your own keys · DeepSeek ✓ · ${tav}`;
|
|
130
|
-
return status.signedIn ? `${base} · /account to use hosted` : base;
|
|
131
|
-
}
|
|
132
|
-
default:
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Resolve the DeepSeek endpoint the provider should use. Hosted mode routes
|
|
138
|
-
* through the ero.solar proxy authenticated by the short-lived sign-in token
|
|
139
|
-
* (the real key lives only server-side, Glasswing); otherwise the user's own
|
|
140
|
-
* key hits the API directly. `apiKey` is '' in 'none' mode (caller errors).
|
|
141
|
-
*/
|
|
142
|
-
export function resolveDeepSeekEndpoint() {
|
|
143
|
-
const status = resolveKeyMode();
|
|
144
|
-
if (status.mode === 'hosted') {
|
|
145
|
-
const session = getHostedSession();
|
|
146
|
-
if (session)
|
|
147
|
-
return { apiKey: session.token, baseURL: HOSTED_DEEPSEEK_PROXY, mode: 'hosted' };
|
|
148
|
-
}
|
|
149
|
-
const userKey = (process.env['DEEPSEEK_API_KEY'] || '').trim();
|
|
150
|
-
if (userKey) {
|
|
151
|
-
return { apiKey: userKey, baseURL: process.env['DEEPSEEK_BASE_URL'] || 'https://api.deepseek.com', mode: 'own' };
|
|
152
|
-
}
|
|
153
|
-
return { apiKey: '', baseURL: '', mode: 'none' };
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Loopback-OAuth sign-in (the contract's increment 2). Starts a one-shot
|
|
157
|
-
* 127.0.0.1 server on an ephemeral port, opens the browser to the ero.solar
|
|
158
|
-
* Google-SSO login URL with that port + a CSRF state, and waits for the
|
|
159
|
-
* redirect back to /cb?token=&email=&state=. On match it persists the hosted
|
|
160
|
-
* session. The browser launch is injected (`open`) so the flow is testable
|
|
161
|
-
* against the REAL loopback server without a real browser.
|
|
162
|
-
*
|
|
163
|
-
* Requires the ero.solar backend (SSO + token mint + redirect) to be live; with
|
|
164
|
-
* no backend the browser opens to a not-yet-served endpoint and the wait times
|
|
165
|
-
* out — the caller surfaces that honestly.
|
|
166
|
-
*/
|
|
167
|
-
export function loginViaLoopback(opts) {
|
|
168
|
-
const state = randomBytes(16).toString('hex');
|
|
169
|
-
const loginUrl = opts.loginUrl ?? HOSTED_LOGIN_URL;
|
|
170
|
-
return new Promise((resolveP) => {
|
|
171
|
-
let settled = false;
|
|
172
|
-
const finish = (result) => {
|
|
173
|
-
if (settled)
|
|
174
|
-
return;
|
|
175
|
-
settled = true;
|
|
176
|
-
clearTimeout(timer);
|
|
177
|
-
try {
|
|
178
|
-
server.close();
|
|
179
|
-
}
|
|
180
|
-
catch { /* ignore */ }
|
|
181
|
-
resolveP(result);
|
|
182
|
-
};
|
|
183
|
-
const server = createServer((req, res) => {
|
|
184
|
-
const url = new URL(req.url ?? '/', 'http://127.0.0.1');
|
|
185
|
-
if (url.pathname !== '/cb') {
|
|
186
|
-
res.writeHead(404);
|
|
187
|
-
res.end('not found');
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const token = url.searchParams.get('token') ?? '';
|
|
191
|
-
const email = url.searchParams.get('email') ?? '';
|
|
192
|
-
const gotState = url.searchParams.get('state') ?? '';
|
|
193
|
-
const okPage = '<!doctype html><meta charset="utf-8"><body style="font:16px system-ui;padding:3rem">'
|
|
194
|
-
+ 'Signed in to Trenchwork Coder. You can close this tab and return to the terminal.</body>';
|
|
195
|
-
res.writeHead(200, { 'content-type': 'text/html' });
|
|
196
|
-
res.end(okPage);
|
|
197
|
-
if (gotState !== state) {
|
|
198
|
-
finish({ ok: false, error: 'state mismatch — sign-in rejected (possible CSRF)' });
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
if (!token) {
|
|
202
|
-
finish({ ok: false, error: 'sign-in returned no token' });
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
const session = { token, email: email || 'you@hosted' };
|
|
206
|
-
setHostedSession(session);
|
|
207
|
-
finish({ ok: true, session });
|
|
208
|
-
});
|
|
209
|
-
const timer = setTimeout(() => finish({ ok: false, error: 'timed out waiting for sign-in' }), opts.timeoutMs ?? 120_000);
|
|
210
|
-
server.on('error', (e) => finish({ ok: false, error: `loopback server failed: ${e.message}` }));
|
|
211
|
-
server.listen(0, '127.0.0.1', () => {
|
|
212
|
-
const addr = server.address();
|
|
213
|
-
const port = addr && typeof addr === 'object' ? addr.port : 0;
|
|
214
|
-
const url = `${loginUrl}?port=${port}&state=${state}`;
|
|
215
|
-
Promise.resolve(opts.open(url)).catch(() => { });
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=hostedAuth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hostedAuth.js","sourceRoot":"","sources":["../../src/core/hostedAuth.ts"],"names":[],"mappings":"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"}
|