ftown-bridge 0.9.5 → 0.10.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/centrifugo-client.js +2 -1
- package/dist/centrifugo-client.js.map +1 -1
- package/dist/create-ftown-session.d.ts +41 -1
- package/dist/create-ftown-session.js +67 -18
- package/dist/create-ftown-session.js.map +1 -1
- package/dist/ftown-env-cli.d.ts +32 -0
- package/dist/ftown-env-cli.js +179 -0
- package/dist/ftown-env-cli.js.map +1 -0
- package/dist/index.js +27 -8
- package/dist/index.js.map +1 -1
- package/dist/install-ftown-env-cli.d.ts +3 -0
- package/dist/install-ftown-env-cli.js +30 -0
- package/dist/install-ftown-env-cli.js.map +1 -0
- package/dist/local-api-server.d.ts +14 -1
- package/dist/local-api-server.js +28 -6
- package/dist/local-api-server.js.map +1 -1
- package/dist/provider-env-store.d.ts +25 -0
- package/dist/provider-env-store.js +66 -0
- package/dist/provider-env-store.js.map +1 -0
- package/dist/session-wire.d.ts +11 -0
- package/dist/session-wire.js +14 -0
- package/dist/session-wire.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/package.json +2 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Centrifuge } from 'centrifuge';
|
|
2
2
|
import WebSocket from 'ws';
|
|
3
3
|
import { hostname } from 'node:os';
|
|
4
|
+
import { toWireSession } from './session-wire.js';
|
|
4
5
|
const MAX_PUBLISH_BYTES = 460_000;
|
|
5
6
|
function byteLen(str) {
|
|
6
7
|
return Buffer.byteLength(str, 'utf8');
|
|
@@ -73,7 +74,7 @@ export class CentrifugoClient {
|
|
|
73
74
|
try {
|
|
74
75
|
await this.client.publish(channel, {
|
|
75
76
|
type: 'session_update',
|
|
76
|
-
session,
|
|
77
|
+
session: toWireSession(session),
|
|
77
78
|
timestamp: new Date().toISOString(),
|
|
78
79
|
});
|
|
79
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"centrifugo-client.js","sourceRoot":"","sources":["../src/centrifugo-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"centrifugo-client.js","sourceRoot":"","sources":["../src/centrifugo-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,7 +45,47 @@ interface OrchestratorBriefingParams {
|
|
|
45
45
|
}
|
|
46
46
|
/** Compact pointer injected into an orchestrator agent's first input. */
|
|
47
47
|
export declare function buildOrchestratorBriefing(params: OrchestratorBriefingParams): string;
|
|
48
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Provider API tokens live on the bridge machine under provider-specific keys
|
|
50
|
+
* (ZAI_API_TOKEN, KIMI_API_TOKEN, DEEPSEEK_API_TOKEN, FIREWORKS_API_TOKEN) so
|
|
51
|
+
* secrets never travel through the browser or the spawn command. A flavor's
|
|
52
|
+
* source token may arrive from three places, resolved last-wins:
|
|
53
|
+
* processEnv (the bridge's own environment), storeEnv (~/.ftown/env.json), and
|
|
54
|
+
* inputEnv (the per-create body). The matching token is mapped onto the
|
|
55
|
+
* Anthropic auth var the CLI expects.
|
|
56
|
+
*/
|
|
57
|
+
export interface ProviderEnvSources {
|
|
58
|
+
inputEnv?: Record<string, string | undefined>;
|
|
59
|
+
storeEnv?: Record<string, string | undefined>;
|
|
60
|
+
processEnv: Record<string, string | undefined>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Raised when a MAPPED provider flavor is requested but its source token is
|
|
64
|
+
* absent from every configured source. The message names the provider, the
|
|
65
|
+
* env-var KEY, and the `ftown env set` remedy — NEVER a token value.
|
|
66
|
+
*/
|
|
67
|
+
export declare class ProviderAuthMissingError extends Error {
|
|
68
|
+
readonly provider: string;
|
|
69
|
+
readonly source: string;
|
|
70
|
+
readonly fix: string;
|
|
71
|
+
constructor(provider: string, source: string, fix: string);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* TOTAL resolver: returns {} for an unmapped flavor (plain
|
|
75
|
+
* claude/cursor/codex/shell/opencode or undefined) OR when the source token is
|
|
76
|
+
* absent in every source. Otherwise maps the source token onto the flavor's
|
|
77
|
+
* Anthropic auth target.
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveProviderAuthEnv(shellType: ShellType | undefined, sources: ProviderEnvSources): Record<string, string>;
|
|
80
|
+
/**
|
|
81
|
+
* Non-throwing guard twin: returns the ProviderAuthMissingError a mapped flavor
|
|
82
|
+
* would raise when its source token is absent everywhere, or undefined when the
|
|
83
|
+
* flavor is unmapped or a token is present. Used by resurrection to re-block a
|
|
84
|
+
* dead session whose token has since disappeared.
|
|
85
|
+
*/
|
|
86
|
+
export declare function findMissingProviderAuth(shellType: ShellType | undefined, sources: ProviderEnvSources): ProviderAuthMissingError | undefined;
|
|
87
|
+
/** Throwing guard: surfaces the missing-token error for a mapped flavor. */
|
|
88
|
+
export declare function assertProviderAuthAvailable(shellType: ShellType | undefined, sources: ProviderEnvSources): void;
|
|
49
89
|
export declare function createFtownSession(deps: CreateFtownSessionDeps, input: CreateFtownSessionInput): Promise<Session>;
|
|
50
90
|
/** Map a Local API JSON body into create input. */
|
|
51
91
|
export declare function parseCreateSessionBody(body: Record<string, unknown>, callerSessionId?: string): CreateFtownSessionInput;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
2
|
import { buildSessionCommand } from './agent-commands.js';
|
|
3
3
|
import { ensureCodexWorkdirTrust } from './codex-installer.js';
|
|
4
|
+
import { PROVIDER_AUTH_ENV, loadProviderEnv } from './provider-env-store.js';
|
|
4
5
|
import { registerSessionWorkspace } from './session-registry.js';
|
|
5
6
|
export async function resolveParentSessionId(store, parentSessionId) {
|
|
6
7
|
if (!parentSessionId)
|
|
@@ -32,27 +33,67 @@ export function buildOrchestratorBriefing(params) {
|
|
|
32
33
|
`check on demand with ftown-harness mail read.`);
|
|
33
34
|
}
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* matching token onto the Anthropic auth var the CLI expects. Returns an empty
|
|
39
|
-
* object for unknown/absent mappings (plain claude/cursor/codex/shell).
|
|
36
|
+
* Raised when a MAPPED provider flavor is requested but its source token is
|
|
37
|
+
* absent from every configured source. The message names the provider, the
|
|
38
|
+
* env-var KEY, and the `ftown env set` remedy — NEVER a token value.
|
|
40
39
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
export class ProviderAuthMissingError extends Error {
|
|
41
|
+
provider;
|
|
42
|
+
source;
|
|
43
|
+
fix;
|
|
44
|
+
constructor(provider, source, fix) {
|
|
45
|
+
super(`Provider '${provider}' requires a machine token, but ${source} is not set ` +
|
|
46
|
+
`in the bridge env, ~/.ftown/env.json, or the create request. Fix: ${fix}`);
|
|
47
|
+
this.name = 'ProviderAuthMissingError';
|
|
48
|
+
this.provider = provider;
|
|
49
|
+
this.source = source;
|
|
50
|
+
this.fix = fix;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Last-wins merge of the three sources for SOURCE-token lookup: inputEnv beats
|
|
55
|
+
* storeEnv beats processEnv (object-spread order — later spreads override).
|
|
56
|
+
*/
|
|
57
|
+
function mergeProviderSources(sources) {
|
|
58
|
+
return { ...sources.processEnv, ...(sources.storeEnv ?? {}), ...(sources.inputEnv ?? {}) };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* TOTAL resolver: returns {} for an unmapped flavor (plain
|
|
62
|
+
* claude/cursor/codex/shell/opencode or undefined) OR when the source token is
|
|
63
|
+
* absent in every source. Otherwise maps the source token onto the flavor's
|
|
64
|
+
* Anthropic auth target.
|
|
65
|
+
*/
|
|
66
|
+
export function resolveProviderAuthEnv(shellType, sources) {
|
|
67
|
+
const mapping = PROVIDER_AUTH_ENV[shellType ?? ''];
|
|
49
68
|
if (!mapping)
|
|
50
69
|
return {};
|
|
51
|
-
const token =
|
|
70
|
+
const token = mergeProviderSources(sources)[mapping.source];
|
|
52
71
|
if (!token)
|
|
53
72
|
return {};
|
|
54
73
|
return { [mapping.target]: token };
|
|
55
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Non-throwing guard twin: returns the ProviderAuthMissingError a mapped flavor
|
|
77
|
+
* would raise when its source token is absent everywhere, or undefined when the
|
|
78
|
+
* flavor is unmapped or a token is present. Used by resurrection to re-block a
|
|
79
|
+
* dead session whose token has since disappeared.
|
|
80
|
+
*/
|
|
81
|
+
export function findMissingProviderAuth(shellType, sources) {
|
|
82
|
+
const mapping = PROVIDER_AUTH_ENV[shellType ?? ''];
|
|
83
|
+
if (!mapping)
|
|
84
|
+
return undefined;
|
|
85
|
+
const token = mergeProviderSources(sources)[mapping.source];
|
|
86
|
+
if (token)
|
|
87
|
+
return undefined;
|
|
88
|
+
const provider = shellType ?? '';
|
|
89
|
+
return new ProviderAuthMissingError(provider, mapping.source, `ftown env set ${provider} <token>`);
|
|
90
|
+
}
|
|
91
|
+
/** Throwing guard: surfaces the missing-token error for a mapped flavor. */
|
|
92
|
+
export function assertProviderAuthAvailable(shellType, sources) {
|
|
93
|
+
const missing = findMissingProviderAuth(shellType, sources);
|
|
94
|
+
if (missing)
|
|
95
|
+
throw missing;
|
|
96
|
+
}
|
|
56
97
|
export async function createFtownSession(deps, input) {
|
|
57
98
|
// Base command (no prompt arg) — persisted on the session and used for the
|
|
58
99
|
// default name; the prompt-bearing launch command must not be replayed on revive.
|
|
@@ -68,10 +109,18 @@ export async function createFtownSession(deps, input) {
|
|
|
68
109
|
}
|
|
69
110
|
}
|
|
70
111
|
const isAgent = input.shellType !== 'shell';
|
|
71
|
-
// Provider API tokens are read from the bridge's environment
|
|
72
|
-
//
|
|
73
|
-
// supplied env (base URL, model
|
|
74
|
-
|
|
112
|
+
// Provider API tokens are read from the bridge's environment, the
|
|
113
|
+
// ~/.ftown/env.json store, and the per-create input (last-wins) and mapped
|
|
114
|
+
// onto the Anthropic auth var here — so the UI-supplied env (base URL, model
|
|
115
|
+
// overrides) never carries a secret. Fail loudly BEFORE persisting the
|
|
116
|
+
// session when a mapped flavor has no token anywhere.
|
|
117
|
+
const sources = {
|
|
118
|
+
processEnv: process.env,
|
|
119
|
+
storeEnv: loadProviderEnv(),
|
|
120
|
+
inputEnv: input.env,
|
|
121
|
+
};
|
|
122
|
+
assertProviderAuthAvailable(input.shellType, sources);
|
|
123
|
+
const providerAuth = resolveProviderAuthEnv(input.shellType, sources);
|
|
75
124
|
const isOrchestratorAgent = input.orchestrator && isAgent;
|
|
76
125
|
const sessionEnv = input.env || Object.keys(providerAuth).length > 0 || isOrchestratorAgent
|
|
77
126
|
? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-ftown-session.js","sourceRoot":"","sources":["../src/create-ftown-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAqCjE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAmB,EACnB,eAAmC;IAEnC,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,EAAE,CAAC;AACjD,CAAC;AASD,uEAAuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,OAAO,CACL,kCAAkC,MAAM,CAAC,SAAS,MAAM,MAAM,CAAC,OAAO,KAAK;QAC3E,sBAAsB,MAAM,CAAC,UAAU,MAAM,MAAM,CAAC,QAAQ,KAAK;QACjE,2FAA2F;QAC3F,6FAA6F;QAC7F,uFAAuF;QACvF,0FAA0F;QAC1F,iDAAiD,CAClD,CAAC;AACJ,CAAC;AAOD,yEAAyE;AACzE,MAAM,UAAU,yBAAyB,CAAC,MAAkC;IAC1E,OAAO,CACL,iEAAiE,MAAM,CAAC,WAAW,IAAI;QACvF,IAAI,MAAM,CAAC,SAAS,sDAAsD;QAC1E,0FAA0F;QAC1F,sFAAsF;QACtF,uFAAuF;QACvF,uFAAuF;QACvF,+CAA+C,CAChD,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"create-ftown-session.js","sourceRoot":"","sources":["../src/create-ftown-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/** Mask all but the last 4 chars; tokens of length <=4 are fully masked. */
|
|
3
|
+
export declare function maskToken(value: string): string;
|
|
4
|
+
/** Resolve a provider flavor to its source env-var KEY. Throws on unknown. */
|
|
5
|
+
export declare function resolveProviderSource(provider: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the token for `set` without exposing it on argv.
|
|
8
|
+
*
|
|
9
|
+
* When `positional` is a real value (defined and not the "-" stdin sentinel) it
|
|
10
|
+
* is used verbatim (trimmed) and `onArgvToken` is invoked so the caller can warn
|
|
11
|
+
* that an argv token leaks into `ps`/shell history. Otherwise the token is read
|
|
12
|
+
* from stdin via `readStdin` (piped, keeping it out of `ps` output and shell
|
|
13
|
+
* history). Throws a clear error when no non-empty token is found.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveSetToken(positional: string | undefined, readStdin: () => Promise<string>, onArgvToken?: () => void): Promise<string>;
|
|
16
|
+
export type DoctorStatus = 'env.json' | 'process-env' | 'missing';
|
|
17
|
+
export interface DoctorFlavorEntry {
|
|
18
|
+
flavor: string;
|
|
19
|
+
source: string;
|
|
20
|
+
status: DoctorStatus;
|
|
21
|
+
}
|
|
22
|
+
export interface DoctorReport {
|
|
23
|
+
flavors: DoctorFlavorEntry[];
|
|
24
|
+
blocked: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Classify each flavor's token: stored in env.json wins over the process env;
|
|
28
|
+
* a flavor absent from BOTH is "missing" and listed under `blocked`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildDoctorReport(store: Record<string, string>, processEnv: Record<string, string | undefined>): DoctorReport;
|
|
31
|
+
/** Dispatch a single command. Throws on bad input; main() maps that to exit 1. */
|
|
32
|
+
export declare function run(argv: string[]): Promise<void>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `ftown env` — manage per-provider machine tokens in ~/.ftown/env.json.
|
|
4
|
+
*
|
|
5
|
+
* Installed to ~/.ftown/ftown-env by ftown-bridge (alongside a sibling copy of
|
|
6
|
+
* provider-env-store.js). Imports ONLY ./provider-env-store.js (plus node
|
|
7
|
+
* builtins) so a single sibling copy makes the installed CLI self-sufficient.
|
|
8
|
+
* Every token value is masked before it touches stdout — raw secrets never print.
|
|
9
|
+
*/
|
|
10
|
+
import { pathToFileURL } from 'node:url';
|
|
11
|
+
import { PROVIDER_AUTH_ENV, PROVIDER_FLAVORS, listProviderEnv, removeProviderToken, setProviderToken, } from './provider-env-store.js';
|
|
12
|
+
/** Mask all but the last 4 chars; tokens of length <=4 are fully masked. */
|
|
13
|
+
export function maskToken(value) {
|
|
14
|
+
if (value.length <= 4)
|
|
15
|
+
return '****';
|
|
16
|
+
return `****${value.slice(-4)}`;
|
|
17
|
+
}
|
|
18
|
+
/** Resolve a provider flavor to its source env-var KEY. Throws on unknown. */
|
|
19
|
+
export function resolveProviderSource(provider) {
|
|
20
|
+
const mapping = PROVIDER_AUTH_ENV[provider];
|
|
21
|
+
if (!mapping) {
|
|
22
|
+
throw new Error(`Unknown provider "${provider}" — use one of: ${PROVIDER_FLAVORS.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
return mapping.source;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the token for `set` without exposing it on argv.
|
|
28
|
+
*
|
|
29
|
+
* When `positional` is a real value (defined and not the "-" stdin sentinel) it
|
|
30
|
+
* is used verbatim (trimmed) and `onArgvToken` is invoked so the caller can warn
|
|
31
|
+
* that an argv token leaks into `ps`/shell history. Otherwise the token is read
|
|
32
|
+
* from stdin via `readStdin` (piped, keeping it out of `ps` output and shell
|
|
33
|
+
* history). Throws a clear error when no non-empty token is found.
|
|
34
|
+
*/
|
|
35
|
+
export async function resolveSetToken(positional, readStdin, onArgvToken) {
|
|
36
|
+
const fromArgv = positional !== undefined && positional !== '-';
|
|
37
|
+
if (fromArgv)
|
|
38
|
+
onArgvToken?.();
|
|
39
|
+
const raw = fromArgv ? positional : await readStdin();
|
|
40
|
+
const token = (raw ?? '').trim();
|
|
41
|
+
if (!token) {
|
|
42
|
+
throw new Error('No token provided — pass it as an argument or pipe it via stdin ' +
|
|
43
|
+
'(e.g. `printf %s "$TOKEN" | ftown env set <provider> -`)');
|
|
44
|
+
}
|
|
45
|
+
return token;
|
|
46
|
+
}
|
|
47
|
+
/** Read all of process.stdin to end, decoded as UTF-8 (trimming is the caller's job). */
|
|
48
|
+
async function readStdin() {
|
|
49
|
+
const chunks = [];
|
|
50
|
+
for await (const chunk of process.stdin) {
|
|
51
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
52
|
+
}
|
|
53
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Classify each flavor's token: stored in env.json wins over the process env;
|
|
57
|
+
* a flavor absent from BOTH is "missing" and listed under `blocked`.
|
|
58
|
+
*/
|
|
59
|
+
export function buildDoctorReport(store, processEnv) {
|
|
60
|
+
const flavors = PROVIDER_FLAVORS.map((flavor) => {
|
|
61
|
+
const source = PROVIDER_AUTH_ENV[flavor].source;
|
|
62
|
+
let status;
|
|
63
|
+
if (store[source])
|
|
64
|
+
status = 'env.json';
|
|
65
|
+
else if (processEnv[source])
|
|
66
|
+
status = 'process-env';
|
|
67
|
+
else
|
|
68
|
+
status = 'missing';
|
|
69
|
+
return { flavor, source, status };
|
|
70
|
+
});
|
|
71
|
+
const blocked = flavors.filter((f) => f.status === 'missing').map((f) => f.flavor);
|
|
72
|
+
return { flavors, blocked };
|
|
73
|
+
}
|
|
74
|
+
/** Positional args, skipping flags and the values of value-taking flags. */
|
|
75
|
+
function positionals(args, valueFlags) {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (let i = 0; i < args.length; i++) {
|
|
78
|
+
const a = args[i];
|
|
79
|
+
if (a.startsWith('--')) {
|
|
80
|
+
if (valueFlags.includes(a))
|
|
81
|
+
i++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
out.push(a);
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
function usage() {
|
|
89
|
+
console.error(`Usage: ftown env <command> [options]
|
|
90
|
+
|
|
91
|
+
Commands:
|
|
92
|
+
set <provider> [token] Store a machine token for a provider
|
|
93
|
+
ls List configured provider tokens (masked)
|
|
94
|
+
rm <provider> Remove a stored provider token
|
|
95
|
+
doctor Report which providers are configured / blocked
|
|
96
|
+
|
|
97
|
+
Providers: ${PROVIDER_FLAVORS.join(' | ')}
|
|
98
|
+
|
|
99
|
+
Recommended (keeps the token out of \`ps\` and shell history): omit the token
|
|
100
|
+
positional and read it from stdin —
|
|
101
|
+
ftown env set zai then paste the token and press Ctrl-D
|
|
102
|
+
printf %s "$TOKEN" | ftown env set zai - pipe it (the "-" forces stdin)
|
|
103
|
+
|
|
104
|
+
Tokens live in ~/.ftown/env.json (mode 0o600). Values are always masked on output.`);
|
|
105
|
+
}
|
|
106
|
+
/** Dispatch a single command. Throws on bad input; main() maps that to exit 1. */
|
|
107
|
+
export async function run(argv) {
|
|
108
|
+
const cmd = argv[0];
|
|
109
|
+
const rest = argv.slice(1);
|
|
110
|
+
switch (cmd) {
|
|
111
|
+
case 'set': {
|
|
112
|
+
const positional = positionals(rest, []);
|
|
113
|
+
const provider = positional[0];
|
|
114
|
+
if (!provider) {
|
|
115
|
+
throw new Error('Usage: ftown env set <provider> [token] (omit the token to read it from stdin)');
|
|
116
|
+
}
|
|
117
|
+
const source = resolveProviderSource(provider);
|
|
118
|
+
const token = await resolveSetToken(positional[1], readStdin, () => console.error('ftown-env: warning: the token was passed as an argument, which exposes it to ' +
|
|
119
|
+
'`ps` and shell history. Prefer stdin: `printf %s "$TOKEN" | ftown env set <provider> -`.'));
|
|
120
|
+
setProviderToken(source, token);
|
|
121
|
+
console.log(`set ${source} (${maskToken(token)}) for ${provider}`);
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
case 'ls': {
|
|
125
|
+
const store = listProviderEnv();
|
|
126
|
+
const keys = Object.keys(store);
|
|
127
|
+
if (keys.length === 0) {
|
|
128
|
+
console.log('(no provider tokens configured)');
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
for (const key of keys)
|
|
132
|
+
console.log(`${key} ${maskToken(store[key])}`);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'rm': {
|
|
136
|
+
const positional = positionals(rest, []);
|
|
137
|
+
const provider = positional[0];
|
|
138
|
+
if (!provider)
|
|
139
|
+
throw new Error('Usage: ftown env rm <provider>');
|
|
140
|
+
const source = resolveProviderSource(provider);
|
|
141
|
+
const existed = removeProviderToken(source);
|
|
142
|
+
console.log(existed ? `removed ${source} for ${provider}` : `${source} (${provider}) was not set`);
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'doctor': {
|
|
146
|
+
const report = buildDoctorReport(listProviderEnv(), process.env);
|
|
147
|
+
for (const f of report.flavors) {
|
|
148
|
+
console.log(`${f.flavor.padEnd(9)} ${f.source.padEnd(20)} ${f.status}`);
|
|
149
|
+
}
|
|
150
|
+
console.log(`blocked: ${report.blocked.length ? report.blocked.join(', ') : '(none)'}`);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
default:
|
|
154
|
+
usage();
|
|
155
|
+
throw new Error(cmd ? `Unknown command "${cmd}"` : 'No command given');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function main() {
|
|
159
|
+
const argv = process.argv.slice(2);
|
|
160
|
+
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
161
|
+
usage();
|
|
162
|
+
process.exit(argv.length === 0 ? 1 : 0);
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
await run(argv);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
169
|
+
console.error(`ftown-env: ${msg}`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Only run as a script (installed CLI / `node dist/ftown-env-cli.js`), never on
|
|
174
|
+
// import — tests import the exported helpers without triggering the dispatcher.
|
|
175
|
+
const entry = process.argv[1];
|
|
176
|
+
if (entry && import.meta.url === pathToFileURL(entry).href) {
|
|
177
|
+
void main();
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ftown-env-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ftown-env-cli.js","sourceRoot":"","sources":["../src/ftown-env-cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,qBAAqB,QAAQ,mBAAmB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAA8B,EAC9B,SAAgC,EAChC,WAAwB;IAExB,MAAM,QAAQ,GAAG,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,GAAG,CAAC;IAChE,IAAI,QAAQ;QAAE,WAAW,EAAE,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,kEAAkE;YAChE,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAeD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA6B,EAC7B,UAA8C;IAE9C,MAAM,OAAO,GAAwB,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAChD,IAAI,MAAoB,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,MAAM,GAAG,UAAU,CAAC;aAClC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,MAAM,GAAG,aAAa,CAAC;;YAC/C,MAAM,GAAG,SAAS,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAC5E,SAAS,WAAW,CAAC,IAAc,EAAE,UAAoB;IACvD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK;IACZ,OAAO,CAAC,KAAK,CAAC;;;;;;;;aAQH,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;;mFAO0C,CAAC,CAAC;AACrF,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CACjE,OAAO,CAAC,KAAK,CACX,+EAA+E;gBAC7E,0FAA0F,CAC7F,CACF,CAAC;YACF,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;YACnE,MAAM;QACR,CAAC;QAED,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,MAAM;YACR,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM;QACR,CAAC;QAED,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,MAAM,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,QAAQ,eAAe,CAAC,CAAC;YACnG,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,MAAM;QACR,CAAC;QAED;YACE,KAAK,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClE,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,gFAAgF;AAChF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,IAAI,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,KAAK,IAAI,EAAE,CAAC;AACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { promisify } from 'node:util';
|
|
|
9
9
|
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
10
10
|
import { randomBytes } from 'node:crypto';
|
|
11
11
|
import { CentrifugoClient } from './centrifugo-client.js';
|
|
12
|
+
import { toWireSession } from './session-wire.js';
|
|
12
13
|
import { ProcessRunner } from './claude-runner.js';
|
|
13
14
|
import { SessionStore } from './session-store.js';
|
|
14
15
|
import { MailStore } from './mail-store.js';
|
|
@@ -22,8 +23,10 @@ import { installNotifyScript } from './install-notify-script.js';
|
|
|
22
23
|
import { installFtownSkill } from './install-ftown-skill.js';
|
|
23
24
|
import { installFtownSessionsCli } from './install-ftown-cli.js';
|
|
24
25
|
import { installFtownWorkflowsCli } from './install-ftown-workflows-cli.js';
|
|
26
|
+
import { installFtownEnvCli } from './install-ftown-env-cli.js';
|
|
25
27
|
import { registerSessionWorkspace, unregisterSession } from './session-registry.js';
|
|
26
|
-
import { createFtownSession } from './create-ftown-session.js';
|
|
28
|
+
import { createFtownSession, findMissingProviderAuth } from './create-ftown-session.js';
|
|
29
|
+
import { loadProviderEnv } from './provider-env-store.js';
|
|
27
30
|
import { removeFtownSession } from './remove-ftown-session.js';
|
|
28
31
|
import { buildSessionCommand } from './agent-commands.js';
|
|
29
32
|
import { isTmuxAvailable, killTmuxSession, listFtownTmuxSessions } from './tmux.js';
|
|
@@ -187,6 +190,11 @@ program
|
|
|
187
190
|
: resolve(__dirname, '..', 'dist', 'workflow-runner-cli.js');
|
|
188
191
|
const workflowsCliPath = installFtownWorkflowsCli(workflowsCliBundlePath);
|
|
189
192
|
console.log(`[Bridge] Installed workflows CLI at ${workflowsCliPath}`);
|
|
193
|
+
const envCliBundlePath = existsSync(resolve(__dirname, 'ftown-env-cli.js'))
|
|
194
|
+
? resolve(__dirname, 'ftown-env-cli.js')
|
|
195
|
+
: resolve(__dirname, '..', 'dist', 'ftown-env-cli.js');
|
|
196
|
+
const envCliPath = installFtownEnvCli(envCliBundlePath);
|
|
197
|
+
console.log(`[Bridge] Installed env CLI at ${envCliPath}`);
|
|
190
198
|
const bridgeStateDir = join(homedir(), '.ftown');
|
|
191
199
|
const bridgePointerPath = join(bridgeStateDir, 'bridge.json');
|
|
192
200
|
try {
|
|
@@ -452,7 +460,7 @@ program
|
|
|
452
460
|
initialInputDelay: payload.initialInputDelay,
|
|
453
461
|
orchestrator: payload.orchestrator,
|
|
454
462
|
});
|
|
455
|
-
response = { requestId: command.requestId, success: true, data: { session } };
|
|
463
|
+
response = { requestId: command.requestId, success: true, data: { session: toWireSession(session) } };
|
|
456
464
|
break;
|
|
457
465
|
}
|
|
458
466
|
case 'stop_session': {
|
|
@@ -480,7 +488,7 @@ program
|
|
|
480
488
|
}
|
|
481
489
|
case 'list_sessions': {
|
|
482
490
|
const sessions = await store.listSessions();
|
|
483
|
-
response = { requestId: command.requestId, success: true, data: { sessions } };
|
|
491
|
+
response = { requestId: command.requestId, success: true, data: { sessions: sessions.map(toWireSession) } };
|
|
484
492
|
break;
|
|
485
493
|
}
|
|
486
494
|
case 'get_history': {
|
|
@@ -490,7 +498,7 @@ program
|
|
|
490
498
|
break;
|
|
491
499
|
}
|
|
492
500
|
const session = await store.loadSession(payload.sessionId);
|
|
493
|
-
response = { requestId: command.requestId, success: true, data: { session } };
|
|
501
|
+
response = { requestId: command.requestId, success: true, data: { session: session ? toWireSession(session) : session } };
|
|
494
502
|
break;
|
|
495
503
|
}
|
|
496
504
|
case 'retry_session': {
|
|
@@ -525,7 +533,7 @@ program
|
|
|
525
533
|
parentSessionId: existingSession.parentSessionId,
|
|
526
534
|
});
|
|
527
535
|
centrifugo.subscribeToTerminalInput(userId, existingSession.id, (sid, data) => { runner.write(sid, data); }, (sid, cols, rows) => { handleClientResize(sid, cols, rows); }, (sid) => { publishScreenDump(sid); });
|
|
528
|
-
response = { requestId: command.requestId, success: true, data: { session: existingSession } };
|
|
536
|
+
response = { requestId: command.requestId, success: true, data: { session: toWireSession(existingSession) } };
|
|
529
537
|
break;
|
|
530
538
|
}
|
|
531
539
|
case 'update_session_parent': {
|
|
@@ -557,7 +565,7 @@ program
|
|
|
557
565
|
target.updatedAt = new Date().toISOString();
|
|
558
566
|
await store.saveSession(target);
|
|
559
567
|
await centrifugo.publishSessionUpdate(userId, target);
|
|
560
|
-
response = { requestId: command.requestId, success: true, data: { session: target } };
|
|
568
|
+
response = { requestId: command.requestId, success: true, data: { session: toWireSession(target) } };
|
|
561
569
|
break;
|
|
562
570
|
}
|
|
563
571
|
case 'rename_session': {
|
|
@@ -575,7 +583,7 @@ program
|
|
|
575
583
|
sessionToRename.updatedAt = new Date().toISOString();
|
|
576
584
|
await store.saveSession(sessionToRename);
|
|
577
585
|
await centrifugo.publishSessionUpdate(userId, sessionToRename);
|
|
578
|
-
response = { requestId: command.requestId, success: true, data: { session: sessionToRename } };
|
|
586
|
+
response = { requestId: command.requestId, success: true, data: { session: toWireSession(sessionToRename) } };
|
|
579
587
|
break;
|
|
580
588
|
}
|
|
581
589
|
case 'remove_session': {
|
|
@@ -636,8 +644,9 @@ program
|
|
|
636
644
|
console.error(`[Bridge] Failed to publish command response:`, err);
|
|
637
645
|
}
|
|
638
646
|
}
|
|
639
|
-
async function markSessionDead(session) {
|
|
647
|
+
async function markSessionDead(session, reason) {
|
|
640
648
|
session.status = 'error';
|
|
649
|
+
session.errorReason = reason;
|
|
641
650
|
session.updatedAt = new Date().toISOString();
|
|
642
651
|
await store.saveSession(session);
|
|
643
652
|
await centrifugo.publishSessionUpdate(userId, session);
|
|
@@ -657,6 +666,7 @@ program
|
|
|
657
666
|
})) {
|
|
658
667
|
session.status = 'running';
|
|
659
668
|
session.bridgeId = bridgeId;
|
|
669
|
+
session.errorReason = undefined;
|
|
660
670
|
session.updatedAt = new Date().toISOString();
|
|
661
671
|
await store.saveSession(session);
|
|
662
672
|
await centrifugo.publishSessionUpdate(userId, session);
|
|
@@ -691,9 +701,18 @@ program
|
|
|
691
701
|
cursorSessionId: session.cursorSessionId,
|
|
692
702
|
codexSessionId: session.codexSessionId,
|
|
693
703
|
});
|
|
704
|
+
const miss = findMissingProviderAuth(session.shellType, {
|
|
705
|
+
processEnv: process.env,
|
|
706
|
+
storeEnv: loadProviderEnv(),
|
|
707
|
+
});
|
|
708
|
+
if (miss) {
|
|
709
|
+
await markSessionDead(session, miss.message);
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
694
712
|
session.status = 'running';
|
|
695
713
|
session.bridgeId = bridgeId;
|
|
696
714
|
session.runtime = runner.getPreferredRuntime();
|
|
715
|
+
session.errorReason = undefined;
|
|
697
716
|
session.updatedAt = new Date().toISOString();
|
|
698
717
|
await store.saveSession(session);
|
|
699
718
|
await centrifugo.publishSessionUpdate(userId, session);
|