flow-agent-bridge 0.2.5 → 0.3.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/api.d.ts +20 -6
- package/dist/api.js +45 -3
- package/dist/api.js.map +1 -1
- package/dist/index.js +47 -13
- package/dist/index.js.map +1 -1
- package/dist/setup.js +55 -21
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AgentLoginResponse, AgentRegisterPollResponse, AgentRegisterStartResponse, ChannelDTO, FileDTO, MessageDTO, MessagePage, UserDTO, WorkspaceDTO, WorkspaceMemberDTO } from '@flow/shared';
|
|
2
2
|
export declare class FlowApiError extends Error {
|
|
3
3
|
readonly status: number;
|
|
4
4
|
readonly code: string;
|
|
@@ -26,10 +26,24 @@ export declare class FlowApi {
|
|
|
26
26
|
downloadFile(fileId: string): Promise<Buffer>;
|
|
27
27
|
uploadFile(workspaceId: string, filename: string, mimeType: string, data: Buffer): Promise<FileDTO>;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
30
|
-
export declare function
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
/** A fresh agent secret key (the agent's password-equivalent, shown/stored once). */
|
|
30
|
+
export declare function newAgentKey(): string;
|
|
31
|
+
export interface RegisterInput {
|
|
32
|
+
username: string;
|
|
33
|
+
key: string;
|
|
34
|
+
name: string;
|
|
35
|
+
sponsorEmail: string;
|
|
33
36
|
description?: string;
|
|
34
37
|
avatarUrl?: string;
|
|
35
|
-
}
|
|
38
|
+
}
|
|
39
|
+
/** Unauthenticated: open a pairing request → pairing code + poll credentials. */
|
|
40
|
+
export declare function startAgentRegistration(serverUrl: string, input: RegisterInput): Promise<AgentRegisterStartResponse>;
|
|
41
|
+
export declare function pollAgentRegistration(serverUrl: string, requestId: string, pollSecret: string): Promise<AgentRegisterPollResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* Poll until the sponsor resolves the request (approve/deny) or it expires.
|
|
44
|
+
* The approved response carries the agent token exactly once — don't lose it
|
|
45
|
+
* (recovery: `flow-agent-bridge login` with the username + key).
|
|
46
|
+
*/
|
|
47
|
+
export declare function waitForApproval(serverUrl: string, start: AgentRegisterStartResponse): Promise<AgentRegisterPollResponse>;
|
|
48
|
+
/** Unauthenticated: username + key → fresh agent token (revokes prior tokens). */
|
|
49
|
+
export declare function agentLogin(serverUrl: string, username: string, key: string): Promise<AgentLoginResponse>;
|
package/dist/api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Minimal /v1 REST client speaking the agent bearer token.
|
|
2
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
3
3
|
const USER_MENTION_RE = /<@([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})>/g;
|
|
4
4
|
export class FlowApiError extends Error {
|
|
5
5
|
status;
|
|
@@ -116,8 +116,16 @@ export class FlowApi {
|
|
|
116
116
|
return (await res.json());
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
// ---- On-demand registration (AGENT_MEMBERS.md) ------------------
|
|
120
|
+
// The agent registers like a person: username + secret key + a human sponsor
|
|
121
|
+
// (by email). The server opens a pairing request; the sponsor approves the
|
|
122
|
+
// matching code inside Flow while the agent polls.
|
|
123
|
+
/** A fresh agent secret key (the agent's password-equivalent, shown/stored once). */
|
|
124
|
+
export function newAgentKey() {
|
|
125
|
+
return `flow-agent-key-${randomBytes(24).toString('base64url')}`;
|
|
126
|
+
}
|
|
127
|
+
/** Unauthenticated: open a pairing request → pairing code + poll credentials. */
|
|
128
|
+
export async function startAgentRegistration(serverUrl, input) {
|
|
121
129
|
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/register`, {
|
|
122
130
|
method: 'POST',
|
|
123
131
|
headers: { 'content-type': 'application/json' },
|
|
@@ -127,4 +135,38 @@ export async function registerAgent(serverUrl, input) {
|
|
|
127
135
|
await parseError(res);
|
|
128
136
|
return (await res.json());
|
|
129
137
|
}
|
|
138
|
+
export async function pollAgentRegistration(serverUrl, requestId, pollSecret) {
|
|
139
|
+
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/register/${requestId}`, {
|
|
140
|
+
headers: { authorization: `Bearer ${pollSecret}` },
|
|
141
|
+
});
|
|
142
|
+
if (!res.ok)
|
|
143
|
+
await parseError(res);
|
|
144
|
+
return (await res.json());
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Poll until the sponsor resolves the request (approve/deny) or it expires.
|
|
148
|
+
* The approved response carries the agent token exactly once — don't lose it
|
|
149
|
+
* (recovery: `flow-agent-bridge login` with the username + key).
|
|
150
|
+
*/
|
|
151
|
+
export async function waitForApproval(serverUrl, start) {
|
|
152
|
+
for (;;) {
|
|
153
|
+
const res = await pollAgentRegistration(serverUrl, start.requestId, start.pollSecret);
|
|
154
|
+
if (res.status !== 'pending')
|
|
155
|
+
return res;
|
|
156
|
+
if (Date.now() > Date.parse(start.expiresAt))
|
|
157
|
+
return { status: 'expired' };
|
|
158
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Unauthenticated: username + key → fresh agent token (revokes prior tokens). */
|
|
162
|
+
export async function agentLogin(serverUrl, username, key) {
|
|
163
|
+
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/login`, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers: { 'content-type': 'application/json' },
|
|
166
|
+
body: JSON.stringify({ username, key }),
|
|
167
|
+
});
|
|
168
|
+
if (!res.ok)
|
|
169
|
+
await parseError(res);
|
|
170
|
+
return (await res.json());
|
|
171
|
+
}
|
|
130
172
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,25 +2,30 @@
|
|
|
2
2
|
// flow-agent-bridge CLI:
|
|
3
3
|
// flow-agent-bridge [config.json] the one command: if the config
|
|
4
4
|
// exists, run the daemon; if not,
|
|
5
|
-
// interactive setup (
|
|
6
|
-
//
|
|
5
|
+
// interactive setup (register →
|
|
6
|
+
// sponsor approval → save) then run.
|
|
7
7
|
// Default config path: ./agent.json
|
|
8
8
|
// flow-agent-bridge run <config.json> start the daemon (no setup)
|
|
9
|
-
// flow-agent-bridge register --server <url> --
|
|
10
|
-
// [--description <text>] [--avatar <url>]
|
|
11
|
-
// (
|
|
9
|
+
// flow-agent-bridge register --server <url> --sponsor <email> --username <handle>
|
|
10
|
+
// --name <name> [--key <secret>] [--description <text>] [--avatar <url>]
|
|
11
|
+
// (prints a pairing code and blocks until the sponsor approves inside Flow;
|
|
12
|
+
// --key omitted → a fresh key is generated and printed)
|
|
13
|
+
// flow-agent-bridge login --server <url> --username <handle> --key <secret>
|
|
14
|
+
// (mints a fresh agent token, revoking the old one — the lost-agent.json path)
|
|
12
15
|
// flow-agent-bridge mcp (internal) the flow MCP stdio server
|
|
13
16
|
import fs from 'node:fs';
|
|
14
17
|
import { loadConfig } from './config.js';
|
|
15
18
|
import { AgentBridge } from './bridge.js';
|
|
16
|
-
import {
|
|
19
|
+
import { agentLogin, newAgentKey, startAgentRegistration, waitForApproval } from './api.js';
|
|
17
20
|
import { runMcpServer } from './mcp-server.js';
|
|
18
21
|
import { runSetup } from './setup.js';
|
|
19
22
|
function usage() {
|
|
20
23
|
console.error('usage:\n' +
|
|
21
24
|
' flow-agent-bridge [config.json] setup (if missing) + run — default ./agent.json\n' +
|
|
22
25
|
' flow-agent-bridge run <config.json>\n' +
|
|
23
|
-
' flow-agent-bridge register --server <url> --
|
|
26
|
+
' flow-agent-bridge register --server <url> --sponsor <email> --username <handle> --name <name>\n' +
|
|
27
|
+
' [--key <secret>] [--description <text>] [--avatar <url>]\n' +
|
|
28
|
+
' flow-agent-bridge login --server <url> --username <handle> --key <secret>\n');
|
|
24
29
|
process.exit(2);
|
|
25
30
|
}
|
|
26
31
|
function flag(args, name) {
|
|
@@ -33,19 +38,48 @@ async function main() {
|
|
|
33
38
|
return runMcpServer();
|
|
34
39
|
if (cmd === 'register') {
|
|
35
40
|
const server = flag(rest, 'server');
|
|
36
|
-
const
|
|
41
|
+
const sponsor = flag(rest, 'sponsor');
|
|
42
|
+
const username = flag(rest, 'username');
|
|
37
43
|
const name = flag(rest, 'name');
|
|
38
|
-
if (!server || !
|
|
44
|
+
if (!server || !sponsor || !username || !name)
|
|
39
45
|
usage();
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
const key = flag(rest, 'key') ?? newAgentKey();
|
|
47
|
+
const generatedKey = !flag(rest, 'key');
|
|
48
|
+
const start = await startAgentRegistration(server, {
|
|
49
|
+
username,
|
|
50
|
+
key,
|
|
51
|
+
name,
|
|
52
|
+
sponsorEmail: sponsor,
|
|
43
53
|
...(flag(rest, 'description') ? { description: flag(rest, 'description') } : {}),
|
|
44
54
|
...(flag(rest, 'avatar') ? { avatarUrl: flag(rest, 'avatar') } : {}),
|
|
45
55
|
});
|
|
56
|
+
console.log(`pairing code: ${start.code}`);
|
|
57
|
+
console.log(`waiting for ${sponsor} to approve inside Flow (they must see the SAME code)…`);
|
|
58
|
+
const res = await waitForApproval(server, start);
|
|
59
|
+
if (res.status !== 'approved' || !res.agentToken) {
|
|
60
|
+
throw new Error(res.status === 'denied' ? 'the sponsor denied the request' : 'the request expired — re-run register');
|
|
61
|
+
}
|
|
46
62
|
console.log(`registered ${res.user.displayName} <@${res.user.id}> in workspace "${res.workspace.name}"`);
|
|
47
63
|
console.log('');
|
|
48
|
-
console.log('agent token (
|
|
64
|
+
console.log('agent token (put it in your bridge config as "agentToken"):');
|
|
65
|
+
console.log(` ${res.agentToken}`);
|
|
66
|
+
if (generatedKey) {
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log('agent key (shown ONCE — with the username, this recovers a lost token via `login`):');
|
|
69
|
+
console.log(` username: ${username}`);
|
|
70
|
+
console.log(` key: ${key}`);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (cmd === 'login') {
|
|
75
|
+
const server = flag(rest, 'server');
|
|
76
|
+
const username = flag(rest, 'username');
|
|
77
|
+
const key = flag(rest, 'key');
|
|
78
|
+
if (!server || !username || !key)
|
|
79
|
+
usage();
|
|
80
|
+
const res = await agentLogin(server, username, key);
|
|
81
|
+
console.log(`logged in as ${res.user.displayName} <@${res.user.id}>`);
|
|
82
|
+
console.log('fresh agent token (the previous token is now revoked):');
|
|
49
83
|
console.log(` ${res.agentToken}`);
|
|
50
84
|
return;
|
|
51
85
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,yBAAyB;AACzB,2EAA2E;AAC3E,4EAA4E;AAC5E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.js
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
|
-
// Interactive first-run setup:
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
1
|
+
// Interactive first-run setup (AGENT_MEMBERS.md): register the agent like a
|
|
2
|
+
// person — name, username + key, and a human sponsor by email — then show the
|
|
3
|
+
// pairing code and wait for the sponsor to approve inside Flow. Saves
|
|
4
|
+
// agent.json and hands back the path so the caller starts the daemon
|
|
5
|
+
// immediately. Advanced knobs (permissionMode, allowedTools, eventScope, …)
|
|
6
|
+
// are edited in the saved file.
|
|
6
7
|
import fs from 'node:fs';
|
|
7
8
|
import path from 'node:path';
|
|
8
9
|
import readline from 'node:readline/promises';
|
|
9
|
-
import { FlowApi,
|
|
10
|
+
import { FlowApi, newAgentKey, startAgentRegistration, waitForApproval } from './api.js';
|
|
10
11
|
import { expandHome } from './config.js';
|
|
11
12
|
async function ask(rl, q, def) {
|
|
12
13
|
const suffix = def ? ` [${def}]` : '';
|
|
13
14
|
const answer = (await rl.question(`${q}${suffix}: `)).trim();
|
|
14
15
|
return answer || def || '';
|
|
15
16
|
}
|
|
17
|
+
/** Best-effort username from the display name: "Repo Bot!" → "repo-bot". */
|
|
18
|
+
function slugify(name) {
|
|
19
|
+
return name
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
22
|
+
.replace(/^[-._]+|[-._]+$/g, '')
|
|
23
|
+
.slice(0, 32);
|
|
24
|
+
}
|
|
16
25
|
export async function runSetup(configPath) {
|
|
17
26
|
if (!process.stdin.isTTY) {
|
|
18
27
|
throw new Error(`no config at ${configPath} and stdin is not a TTY — run interactively or pass a config path`);
|
|
@@ -21,31 +30,52 @@ export async function runSetup(configPath) {
|
|
|
21
30
|
try {
|
|
22
31
|
console.log('No config found — setting up a new agent.\n');
|
|
23
32
|
const serverUrl = (await ask(rl, 'Flow server URL', process.env.FLOW_SERVER_URL ?? 'https://app.flowtoo.org')).replace(/\/+$/, '');
|
|
24
|
-
|
|
25
|
-
while (!key.startsWith('flow-agent-')) {
|
|
26
|
-
key = await ask(rl, 'Invite key (flow-agent-…) — or an agent token (flow-agent-token-…, from "Regenerate token") to reuse an existing agent');
|
|
27
|
-
if (!key.startsWith('flow-agent-'))
|
|
28
|
-
console.log(' that does not look like a flow-agent-… key or token');
|
|
29
|
-
}
|
|
33
|
+
const existing = await ask(rl, 'Existing agent token (flow-agent-token-…) to reuse — or press enter to register');
|
|
30
34
|
let agentToken;
|
|
31
|
-
|
|
35
|
+
let agentUsername;
|
|
36
|
+
let agentKey;
|
|
37
|
+
if (existing.startsWith('flow-agent-token-')) {
|
|
32
38
|
// Existing agent: validate the token and skip registration.
|
|
33
39
|
console.log('\nAgent token detected — verifying…');
|
|
34
|
-
const me = await new FlowApi(serverUrl,
|
|
40
|
+
const me = await new FlowApi(serverUrl, existing).me();
|
|
35
41
|
console.log(`connecting as existing agent ${me.displayName} <@${me.id}>\n`);
|
|
36
|
-
agentToken =
|
|
42
|
+
agentToken = existing;
|
|
37
43
|
}
|
|
38
44
|
else {
|
|
39
|
-
|
|
45
|
+
let name = '';
|
|
46
|
+
while (!name)
|
|
47
|
+
name = await ask(rl, 'Agent name (shown in Flow, e.g. RepoBot)');
|
|
48
|
+
let username = '';
|
|
49
|
+
while (!/^[a-z0-9][a-z0-9._-]{2,31}$/.test(username)) {
|
|
50
|
+
username = (await ask(rl, 'Username (the agent’s handle — its durable login)', slugify(name))).toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
let sponsorEmail = '';
|
|
53
|
+
while (!sponsorEmail.includes('@')) {
|
|
54
|
+
sponsorEmail = await ask(rl, 'Sponsor email (YOUR Flow login — you approve and are responsible for this agent)');
|
|
55
|
+
}
|
|
40
56
|
const description = await ask(rl, 'Description (optional)');
|
|
57
|
+
const key = newAgentKey();
|
|
41
58
|
console.log('\nRegistering…');
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
const start = await startAgentRegistration(serverUrl, {
|
|
60
|
+
username,
|
|
61
|
+
key,
|
|
62
|
+
name,
|
|
63
|
+
sponsorEmail,
|
|
45
64
|
...(description ? { description } : {}),
|
|
46
65
|
});
|
|
47
|
-
console.log(
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(` pairing code: ${start.code}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
console.log(`Now approve this request inside Flow (as ${sponsorEmail}) — a prompt is waiting there.`);
|
|
70
|
+
console.log('Only approve if it shows the SAME code. Waiting (expires in 10 minutes)…');
|
|
71
|
+
const res = await waitForApproval(serverUrl, start);
|
|
72
|
+
if (res.status !== 'approved' || !res.agentToken) {
|
|
73
|
+
throw new Error(res.status === 'denied' ? 'the sponsor denied the request' : 'the request expired — run setup again');
|
|
74
|
+
}
|
|
75
|
+
console.log(`\napproved! registered ${res.user.displayName} <@${res.user.id}> in workspace "${res.workspace.name}"\n`);
|
|
48
76
|
agentToken = res.agentToken;
|
|
77
|
+
agentUsername = username;
|
|
78
|
+
agentKey = key;
|
|
49
79
|
}
|
|
50
80
|
let kind = '';
|
|
51
81
|
while (!['claude', 'codex', 'demo'].includes(kind)) {
|
|
@@ -54,6 +84,10 @@ export async function runSetup(configPath) {
|
|
|
54
84
|
const config = {
|
|
55
85
|
serverUrl,
|
|
56
86
|
agentToken,
|
|
87
|
+
// username + key are the agent's durable credentials: `flow-agent-bridge
|
|
88
|
+
// login` re-mints a token from them if agent.json's token is ever lost.
|
|
89
|
+
...(agentUsername ? { agentUsername } : {}),
|
|
90
|
+
...(agentKey ? { agentKey } : {}),
|
|
57
91
|
runtime: { kind },
|
|
58
92
|
};
|
|
59
93
|
if (kind !== 'demo') {
|
|
@@ -73,7 +107,7 @@ export async function runSetup(configPath) {
|
|
|
73
107
|
}
|
|
74
108
|
const abs = path.resolve(configPath);
|
|
75
109
|
fs.writeFileSync(abs, JSON.stringify(config, null, 2) + '\n', { mode: 0o600 });
|
|
76
|
-
console.log(`\nSaved ${abs} (contains the agent token — keep it private).`);
|
|
110
|
+
console.log(`\nSaved ${abs} (contains the agent token and key — keep it private).`);
|
|
77
111
|
console.log('Edit it any time for permissions, event scope, progress mode, etc. (see AGENT_MEMBERS.md).\n');
|
|
78
112
|
return abs;
|
|
79
113
|
}
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flow-agent-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Flow agent bridge: joins a Flow workspace as a first-class AI agent and execs a coding-agent CLI (Claude Code, Codex) headlessly per conversation",
|
|
6
6
|
"license": "MIT",
|