ftown-bridge 0.9.4 → 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/claude-trust.d.ts +11 -0
- package/dist/claude-trust.js +47 -0
- package/dist/claude-trust.js.map +1 -0
- package/dist/create-ftown-session.d.ts +41 -0
- package/dist/create-ftown-session.js +83 -5
- 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/dist/workflow-runner-cli.js +9 -2
- package/dist/workflow-runner-cli.js.map +1 -1
- 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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-trust `dir` for Claude Code so a spawned worker does not block on the
|
|
3
|
+
* interactive "Do you trust this folder?" dialog — which `--dangerously-skip-permissions`
|
|
4
|
+
* does NOT dismiss. Sets `projects[dir].hasTrustDialogAccepted = true` in `~/.claude.json`,
|
|
5
|
+
* preserving every other field, via an atomic temp+rename. Best-effort: never throws.
|
|
6
|
+
*
|
|
7
|
+
* Scoped to ftown-workflows workers (non-interactive automation). The claude config keys
|
|
8
|
+
* projects by REAL path (e.g. `/private/tmp`, not `/tmp`), so we trust the realpath.
|
|
9
|
+
* Mirrors the bridge's `ensureCodexWorkdirTrust`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ensureClaudeWorkdirTrust(dir: string): void;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Pre-trust `dir` for Claude Code so a spawned worker does not block on the
|
|
6
|
+
* interactive "Do you trust this folder?" dialog — which `--dangerously-skip-permissions`
|
|
7
|
+
* does NOT dismiss. Sets `projects[dir].hasTrustDialogAccepted = true` in `~/.claude.json`,
|
|
8
|
+
* preserving every other field, via an atomic temp+rename. Best-effort: never throws.
|
|
9
|
+
*
|
|
10
|
+
* Scoped to ftown-workflows workers (non-interactive automation). The claude config keys
|
|
11
|
+
* projects by REAL path (e.g. `/private/tmp`, not `/tmp`), so we trust the realpath.
|
|
12
|
+
* Mirrors the bridge's `ensureCodexWorkdirTrust`.
|
|
13
|
+
*/
|
|
14
|
+
export function ensureClaudeWorkdirTrust(dir) {
|
|
15
|
+
let real = dir;
|
|
16
|
+
try {
|
|
17
|
+
real = realpathSync(dir);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Path may not exist yet; fall back to the input verbatim.
|
|
21
|
+
}
|
|
22
|
+
const configPath = join(homedir(), '.claude.json');
|
|
23
|
+
let cfg = {};
|
|
24
|
+
try {
|
|
25
|
+
cfg = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Missing or unreadable — start fresh; claude fills in the rest on launch.
|
|
29
|
+
cfg = {};
|
|
30
|
+
}
|
|
31
|
+
if (!cfg.projects || typeof cfg.projects !== 'object')
|
|
32
|
+
cfg.projects = {};
|
|
33
|
+
const existing = cfg.projects[real];
|
|
34
|
+
if (existing && existing.hasTrustDialogAccepted === true)
|
|
35
|
+
return; // already trusted
|
|
36
|
+
cfg.projects[real] = { ...(existing ?? {}), hasTrustDialogAccepted: true };
|
|
37
|
+
const tmpPath = `${configPath}.ftw-tmp`;
|
|
38
|
+
try {
|
|
39
|
+
writeFileSync(tmpPath, JSON.stringify(cfg, null, 2));
|
|
40
|
+
renameSync(tmpPath, configPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Best-effort: if we cannot persist trust the worker may hit the dialog, but the
|
|
44
|
+
// workflow run must not crash.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=claude-trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-trust.js","sourceRoot":"","sources":["../src/claude-trust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IAEnD,IAAI,GAAG,GAAiB,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAiB,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;QAC3E,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,IAAI,QAAQ,CAAC,sBAAsB,KAAK,IAAI;QAAE,OAAO,CAAC,kBAAkB;IAEpF,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;IAE3E,MAAM,OAAO,GAAG,GAAG,UAAU,UAAU,CAAC;IACxC,IAAI,CAAC;QACH,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,iFAAiF;QACjF,+BAA+B;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -45,6 +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
|
+
/**
|
|
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;
|
|
48
89
|
export declare function createFtownSession(deps: CreateFtownSessionDeps, input: CreateFtownSessionInput): Promise<Session>;
|
|
49
90
|
/** Map a Local API JSON body into create input. */
|
|
50
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)
|
|
@@ -31,6 +32,68 @@ export function buildOrchestratorBriefing(params) {
|
|
|
31
32
|
`their messages arrive automatically as [ftown mail] context at your turn boundaries; ` +
|
|
32
33
|
`check on demand with ftown-harness mail read.`);
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
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.
|
|
39
|
+
*/
|
|
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 ?? ''];
|
|
68
|
+
if (!mapping)
|
|
69
|
+
return {};
|
|
70
|
+
const token = mergeProviderSources(sources)[mapping.source];
|
|
71
|
+
if (!token)
|
|
72
|
+
return {};
|
|
73
|
+
return { [mapping.target]: token };
|
|
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
|
+
}
|
|
34
97
|
export async function createFtownSession(deps, input) {
|
|
35
98
|
// Base command (no prompt arg) — persisted on the session and used for the
|
|
36
99
|
// default name; the prompt-bearing launch command must not be replayed on revive.
|
|
@@ -46,11 +109,26 @@ export async function createFtownSession(deps, input) {
|
|
|
46
109
|
}
|
|
47
110
|
}
|
|
48
111
|
const isAgent = input.shellType !== 'shell';
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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);
|
|
124
|
+
const isOrchestratorAgent = input.orchestrator && isAgent;
|
|
125
|
+
const sessionEnv = input.env || Object.keys(providerAuth).length > 0 || isOrchestratorAgent
|
|
126
|
+
? {
|
|
127
|
+
...(input.env ?? {}),
|
|
128
|
+
...providerAuth,
|
|
129
|
+
...(isOrchestratorAgent ? { FTOWN_ORCHESTRATOR: '1' } : {}),
|
|
130
|
+
}
|
|
131
|
+
: undefined;
|
|
54
132
|
const sessionId = uuidv4();
|
|
55
133
|
const session = {
|
|
56
134
|
id: sessionId,
|
|
@@ -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;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAA4B,EAC5B,KAA8B;IAE9B,2EAA2E;IAC3E,kFAAkF;IAClF,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAE1C,IAAI,eAAmC,CAAC;IACxC,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,eAAe,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QAClF,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YACpE,UAAU,GAAG,aAAa,EAAE,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC;IAC5C,6EAA6E;IAC7E,
|
|
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":"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"}
|