flow-agent-bridge 0.7.0 → 0.8.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/README.md +14 -12
- package/dist/api.d.ts +7 -11
- package/dist/api.js +11 -30
- package/dist/api.js.map +1 -1
- package/dist/index.js +30 -61
- package/dist/index.js.map +1 -1
- package/dist/setup.d.ts +1 -1
- package/dist/setup.js +22 -27
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,34 +14,36 @@ Flow WS ──> flow-agent-bridge daemon ──spawn──> claude -p --resume <
|
|
|
14
14
|
## Install & run
|
|
15
15
|
|
|
16
16
|
```sh
|
|
17
|
-
npx flow-agent-bridge
|
|
17
|
+
npx flow-agent-bridge <invite-code> # no install; setup on first run, daemon after
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
Get the `<invite-code>` from Flow: click **Invite your Agent** at the bottom of
|
|
21
|
+
the sidebar and copy the one-time `npx flow-agent-bridge flow-K7P2-9QMR` command it
|
|
22
|
+
shows. The first run asks only **agent name, handle, harness** (claude / codex /
|
|
23
|
+
demo), then redeems the code and joins the workspace **immediately** — no
|
|
24
|
+
approval step. The code is exchanged for a permanent agent token, the config is
|
|
25
|
+
saved to `agent.json` (chmod 600) next to where you ran it, and the daemon
|
|
26
|
+
starts. The agent gets a random avatar the sponsor can change inside Flow.
|
|
27
|
+
Subsequent runs just start the daemon.
|
|
26
28
|
|
|
27
29
|
Every prompt can be pre-answered with a flag, so the whole thing runs
|
|
28
30
|
unattended:
|
|
29
31
|
|
|
30
32
|
```sh
|
|
31
|
-
npx flow-agent-bridge --name RepoBot --handle repobot
|
|
32
|
-
--sponsor you@example.com --harness claude
|
|
33
|
+
npx flow-agent-bridge --invite flow-K7P2-9QMR --name RepoBot --handle repobot --harness claude
|
|
33
34
|
```
|
|
34
35
|
|
|
35
36
|
| Flag | Default | Meaning |
|
|
36
37
|
|---|---|---|
|
|
37
|
-
| `--
|
|
38
|
+
| `--invite` | prompted (or the positional `<invite-code>`) | the one-time invite code |
|
|
39
|
+
| `--name` / `--handle` / `--harness` | prompted | agent name, @handle, runtime |
|
|
38
40
|
| `--server` (or `--host`) | `https://app.flowtoo.org` | Flow server URL |
|
|
39
|
-
| `--token` | — | reuse an existing `flow-agent-token-…` (skips
|
|
41
|
+
| `--token` | — | reuse an existing `flow-agent-token-…` (skips onboarding) |
|
|
40
42
|
| `--description` | none | one-line agent description |
|
|
41
43
|
| `--cwd` | current directory | working directory the agent runs in (its identity) |
|
|
42
44
|
|
|
43
45
|
Already have an agent? `--token flow-agent-token-…` reconnects as it and skips
|
|
44
|
-
|
|
46
|
+
onboarding.
|
|
45
47
|
|
|
46
48
|
## What you get
|
|
47
49
|
|
package/dist/api.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentLoginResponse,
|
|
1
|
+
import type { AgentLoginResponse, AgentRedeemResponse, ArtifactDTO, 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;
|
|
@@ -45,22 +45,18 @@ export declare class FlowApi {
|
|
|
45
45
|
}
|
|
46
46
|
/** A fresh agent secret key (the agent's password-equivalent, shown/stored once). */
|
|
47
47
|
export declare function newAgentKey(): string;
|
|
48
|
-
export interface
|
|
48
|
+
export interface RedeemInput {
|
|
49
|
+
code: string;
|
|
49
50
|
username: string;
|
|
50
51
|
key: string;
|
|
51
52
|
name: string;
|
|
52
|
-
sponsorEmail: string;
|
|
53
53
|
description?: string;
|
|
54
|
-
avatarUrl?: string;
|
|
55
54
|
}
|
|
56
|
-
/** Unauthenticated: open a pairing request → pairing code + poll credentials. */
|
|
57
|
-
export declare function startAgentRegistration(serverUrl: string, input: RegisterInput): Promise<AgentRegisterStartResponse>;
|
|
58
|
-
export declare function pollAgentRegistration(serverUrl: string, requestId: string, pollSecret: string): Promise<AgentRegisterPollResponse>;
|
|
59
55
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
56
|
+
* Redeem a one-time invite code (the code IS the auth). Returns the agent token
|
|
57
|
+
* synchronously — don't lose it (recovery: `flow-agent-bridge login` with the
|
|
58
|
+
* username + key).
|
|
63
59
|
*/
|
|
64
|
-
export declare function
|
|
60
|
+
export declare function redeemAgentInvite(serverUrl: string, input: RedeemInput): Promise<AgentRedeemResponse>;
|
|
65
61
|
/** Unauthenticated: username + key → fresh agent token (revokes prior tokens). */
|
|
66
62
|
export declare function agentLogin(serverUrl: string, username: string, key: string): Promise<AgentLoginResponse>;
|
package/dist/api.js
CHANGED
|
@@ -147,17 +147,21 @@ export class FlowApi {
|
|
|
147
147
|
return (await res.json());
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
-
// ----
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
//
|
|
150
|
+
// ---- Invite-code onboarding (AGENT_MEMBERS.md) ------------------
|
|
151
|
+
// A human member generates a one-time invite code inside Flow; the agent
|
|
152
|
+
// redeems it with its durable credentials (username + secret key) and joins
|
|
153
|
+
// immediately — no sponsor approval. The code carries the sponsor + workspace.
|
|
154
154
|
/** A fresh agent secret key (the agent's password-equivalent, shown/stored once). */
|
|
155
155
|
export function newAgentKey() {
|
|
156
156
|
return `flow-agent-key-${randomBytes(24).toString('base64url')}`;
|
|
157
157
|
}
|
|
158
|
-
/**
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
/**
|
|
159
|
+
* Redeem a one-time invite code (the code IS the auth). Returns the agent token
|
|
160
|
+
* synchronously — don't lose it (recovery: `flow-agent-bridge login` with the
|
|
161
|
+
* username + key).
|
|
162
|
+
*/
|
|
163
|
+
export async function redeemAgentInvite(serverUrl, input) {
|
|
164
|
+
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/redeem`, {
|
|
161
165
|
method: 'POST',
|
|
162
166
|
headers: { 'content-type': 'application/json' },
|
|
163
167
|
body: JSON.stringify(input),
|
|
@@ -166,29 +170,6 @@ export async function startAgentRegistration(serverUrl, input) {
|
|
|
166
170
|
await parseError(res);
|
|
167
171
|
return (await res.json());
|
|
168
172
|
}
|
|
169
|
-
export async function pollAgentRegistration(serverUrl, requestId, pollSecret) {
|
|
170
|
-
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/register/${requestId}`, {
|
|
171
|
-
headers: { authorization: `Bearer ${pollSecret}` },
|
|
172
|
-
});
|
|
173
|
-
if (!res.ok)
|
|
174
|
-
await parseError(res);
|
|
175
|
-
return (await res.json());
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Poll until the sponsor resolves the request (approve/deny) or it expires.
|
|
179
|
-
* The approved response carries the agent token exactly once — don't lose it
|
|
180
|
-
* (recovery: `flow-agent-bridge login` with the username + key).
|
|
181
|
-
*/
|
|
182
|
-
export async function waitForApproval(serverUrl, start) {
|
|
183
|
-
for (;;) {
|
|
184
|
-
const res = await pollAgentRegistration(serverUrl, start.requestId, start.pollSecret);
|
|
185
|
-
if (res.status !== 'pending')
|
|
186
|
-
return res;
|
|
187
|
-
if (Date.now() > Date.parse(start.expiresAt))
|
|
188
|
-
return { status: 'expired' };
|
|
189
|
-
await new Promise((r) => setTimeout(r, 2000));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
173
|
/** Unauthenticated: username + key → fresh agent token (revokes prior tokens). */
|
|
193
174
|
export async function agentLogin(serverUrl, username, key) {
|
|
194
175
|
const res = await fetch(`${serverUrl.replace(/\/+$/, '')}/v1/agents/login`, {
|
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,WAAW,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
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// flow-agent-bridge CLI:
|
|
3
|
-
// flow-agent-bridge
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// Default config
|
|
3
|
+
// flow-agent-bridge <invite-code> the one command: redeem a one-time
|
|
4
|
+
// invite code (generated in Flow →
|
|
5
|
+
// “Invite your Agent”). Streamlined
|
|
6
|
+
// setup asks name, handle, harness →
|
|
7
|
+
// joins immediately → save, then runs
|
|
8
|
+
// the daemon. Default config: ./agent.json
|
|
9
|
+
// flow-agent-bridge [config.json] if the config exists, run the daemon;
|
|
10
|
+
// if not, run setup (prompts for the
|
|
11
|
+
// invite code) then run.
|
|
9
12
|
// Skip any prompt with a flag:
|
|
10
|
-
// --name --handle --
|
|
13
|
+
// --invite --name --handle --harness
|
|
11
14
|
// --server --token --description --cwd
|
|
12
15
|
// flow-agent-bridge run <config.json> start the daemon (no setup)
|
|
13
|
-
// flow-agent-bridge register --server <url> --sponsor <email> --username <handle>
|
|
14
|
-
// --name <name> [--key <secret>] [--description <text>] [--avatar <url>]
|
|
15
|
-
// (prints a pairing code and blocks until the sponsor approves inside Flow;
|
|
16
|
-
// --key omitted → a fresh key is generated and printed)
|
|
17
16
|
// flow-agent-bridge login --server <url> --username <handle> --key <secret>
|
|
18
17
|
// (mints a fresh agent token, revoking the old one — the lost-agent.json path)
|
|
19
18
|
// flow-agent-bridge mcp-init [config.json]
|
|
@@ -22,18 +21,19 @@
|
|
|
22
21
|
import fs from 'node:fs';
|
|
23
22
|
import { loadConfig } from './config.js';
|
|
24
23
|
import { AgentBridge } from './bridge.js';
|
|
25
|
-
import { agentLogin
|
|
24
|
+
import { agentLogin } from './api.js';
|
|
26
25
|
import { runMcpServer } from './mcp-server.js';
|
|
27
26
|
import { runMcpInit } from './mcp-init.js';
|
|
28
27
|
import { runSetup } from './setup.js';
|
|
28
|
+
/** An invite code positional (`flow-XXXX-XXXX`), told apart from a config path. */
|
|
29
|
+
const INVITE_CODE_RE = /^flow-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/;
|
|
29
30
|
function usage() {
|
|
30
31
|
console.error('usage:\n' +
|
|
32
|
+
' flow-agent-bridge <invite-code> redeem an invite (from Flow) + run — default ./agent.json\n' +
|
|
31
33
|
' flow-agent-bridge [config.json] setup (if missing) + run — default ./agent.json\n' +
|
|
32
|
-
' setup flags (skip a prompt): --name --handle --
|
|
34
|
+
' setup flags (skip a prompt): --invite --name --handle --harness\n' +
|
|
33
35
|
' --server --token --description --cwd\n' +
|
|
34
36
|
' flow-agent-bridge run <config.json>\n' +
|
|
35
|
-
' flow-agent-bridge register --server <url> --sponsor <email> --username <handle> --name <name>\n' +
|
|
36
|
-
' [--key <secret>] [--description <text>] [--avatar <url>]\n' +
|
|
37
37
|
' flow-agent-bridge login --server <url> --username <handle> --key <secret>\n' +
|
|
38
38
|
' flow-agent-bridge mcp-init [config.json] write ./.mcp.json for MCP clients (claude CLI)\n');
|
|
39
39
|
process.exit(2);
|
|
@@ -42,24 +42,25 @@ function flag(args, name) {
|
|
|
42
42
|
const i = args.indexOf(`--${name}`);
|
|
43
43
|
return i >= 0 ? args[i + 1] : undefined;
|
|
44
44
|
}
|
|
45
|
-
/**
|
|
46
|
-
function
|
|
45
|
+
/** Non-flag tokens (flags all take a value, so skip `--x val` pairs). */
|
|
46
|
+
function allPositionals(args) {
|
|
47
|
+
const out = [];
|
|
47
48
|
for (let i = 0; i < args.length; i++) {
|
|
48
49
|
const a = args[i];
|
|
49
50
|
if (a.startsWith('--'))
|
|
50
51
|
i++; // skip the flag's value too
|
|
51
52
|
else
|
|
52
|
-
|
|
53
|
+
out.push(a);
|
|
53
54
|
}
|
|
54
|
-
return
|
|
55
|
+
return out;
|
|
55
56
|
}
|
|
56
|
-
function parseSetupOptions(args) {
|
|
57
|
+
function parseSetupOptions(args, invite) {
|
|
57
58
|
return {
|
|
58
59
|
serverUrl: flag(args, 'server') ?? flag(args, 'host'),
|
|
59
60
|
token: flag(args, 'token'),
|
|
61
|
+
invite: invite ?? flag(args, 'invite'),
|
|
60
62
|
name: flag(args, 'name'),
|
|
61
63
|
username: flag(args, 'username') ?? flag(args, 'handle'),
|
|
62
|
-
sponsor: flag(args, 'sponsor'),
|
|
63
64
|
harness: flag(args, 'harness') ?? flag(args, 'runtime'),
|
|
64
65
|
description: flag(args, 'description'),
|
|
65
66
|
cwd: flag(args, 'cwd'),
|
|
@@ -82,41 +83,6 @@ async function main() {
|
|
|
82
83
|
return runMcpServer();
|
|
83
84
|
if (cmd === 'mcp-init')
|
|
84
85
|
return runMcpInit(rest[0] ?? 'agent.json');
|
|
85
|
-
if (cmd === 'register') {
|
|
86
|
-
const server = flag(rest, 'server');
|
|
87
|
-
const sponsor = flag(rest, 'sponsor');
|
|
88
|
-
const username = flag(rest, 'username');
|
|
89
|
-
const name = flag(rest, 'name');
|
|
90
|
-
if (!server || !sponsor || !username || !name)
|
|
91
|
-
usage();
|
|
92
|
-
const key = flag(rest, 'key') ?? newAgentKey();
|
|
93
|
-
const generatedKey = !flag(rest, 'key');
|
|
94
|
-
const start = await startAgentRegistration(server, {
|
|
95
|
-
username,
|
|
96
|
-
key,
|
|
97
|
-
name,
|
|
98
|
-
sponsorEmail: sponsor,
|
|
99
|
-
...(flag(rest, 'description') ? { description: flag(rest, 'description') } : {}),
|
|
100
|
-
...(flag(rest, 'avatar') ? { avatarUrl: flag(rest, 'avatar') } : {}),
|
|
101
|
-
});
|
|
102
|
-
console.log(`pairing code: ${start.code}`);
|
|
103
|
-
console.log(`waiting for ${sponsor} to approve inside Flow (they must see the SAME code)…`);
|
|
104
|
-
const res = await waitForApproval(server, start);
|
|
105
|
-
if (res.status !== 'approved' || !res.agentToken) {
|
|
106
|
-
throw new Error(res.status === 'denied' ? 'the sponsor denied the request' : 'the request expired — re-run register');
|
|
107
|
-
}
|
|
108
|
-
console.log(`registered ${res.user.displayName} <@${res.user.id}> in workspace "${res.workspace.name}"`);
|
|
109
|
-
console.log('');
|
|
110
|
-
console.log('agent token (put it in your bridge config as "agentToken"):');
|
|
111
|
-
console.log(` ${res.agentToken}`);
|
|
112
|
-
if (generatedKey) {
|
|
113
|
-
console.log('');
|
|
114
|
-
console.log('agent key (shown ONCE — with the username, this recovers a lost token via `login`):');
|
|
115
|
-
console.log(` username: ${username}`);
|
|
116
|
-
console.log(` key: ${key}`);
|
|
117
|
-
}
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
86
|
if (cmd === 'login') {
|
|
121
87
|
const server = flag(rest, 'server');
|
|
122
88
|
const username = flag(rest, 'username');
|
|
@@ -138,13 +104,16 @@ async function main() {
|
|
|
138
104
|
usage();
|
|
139
105
|
return startDaemon(configPath);
|
|
140
106
|
}
|
|
141
|
-
// Default path: setup (if the config is missing) + run.
|
|
142
|
-
//
|
|
143
|
-
//
|
|
107
|
+
// Default path: setup (if the config is missing) + run. A positional that
|
|
108
|
+
// looks like an invite code (`flow-XXXX-XXXX`) is the invite; any other
|
|
109
|
+
// positional is the config path (default ./agent.json). Everything else is a
|
|
110
|
+
// setup flag, so `npx flow-agent-bridge flow-K7P2-9QMR --harness codex` works bare.
|
|
144
111
|
const args = cmd === undefined ? [] : [cmd, ...rest];
|
|
145
|
-
const
|
|
112
|
+
const positionals = allPositionals(args);
|
|
113
|
+
const invite = positionals.find((p) => INVITE_CODE_RE.test(p));
|
|
114
|
+
const configPath = positionals.find((p) => p !== invite) ?? 'agent.json';
|
|
146
115
|
if (!fs.existsSync(configPath))
|
|
147
|
-
await runSetup(configPath, parseSetupOptions(args));
|
|
116
|
+
await runSetup(configPath, parseSetupOptions(args, invite));
|
|
148
117
|
return startDaemon(configPath);
|
|
149
118
|
}
|
|
150
119
|
main().catch((err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,yBAAyB;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
export interface SetupOptions {
|
|
3
3
|
serverUrl?: string | undefined;
|
|
4
4
|
token?: string | undefined;
|
|
5
|
+
invite?: string | undefined;
|
|
5
6
|
name?: string | undefined;
|
|
6
7
|
username?: string | undefined;
|
|
7
|
-
sponsor?: string | undefined;
|
|
8
8
|
harness?: string | undefined;
|
|
9
9
|
description?: string | undefined;
|
|
10
10
|
cwd?: string | undefined;
|
package/dist/setup.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
// Interactive first-run setup (AGENT_MEMBERS.md):
|
|
2
|
-
//
|
|
3
|
-
// 15) asks only
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// edited in the saved file.
|
|
1
|
+
// Interactive first-run setup (AGENT_MEMBERS.md): onboard the agent with a
|
|
2
|
+
// one-time invite code and hand back a ready-to-run agent.json. The streamlined
|
|
3
|
+
// flow (phase 15) asks only what a person must decide — the invite code (usually
|
|
4
|
+
// passed as the positional arg), then agent name, handle, harness — and redeems
|
|
5
|
+
// the code to join immediately (no sponsor approval; the code carries the
|
|
6
|
+
// sponsor + workspace). Everything else (server URL, an existing token to
|
|
7
|
+
// reuse, a description, the working directory) has a sensible default and is
|
|
8
|
+
// overridable with a CLI flag. Advanced knobs (permissionMode, allowedTools,
|
|
9
|
+
// eventScope, …) are edited in the saved file.
|
|
10
10
|
import fs from 'node:fs';
|
|
11
11
|
import path from 'node:path';
|
|
12
12
|
import readline from 'node:readline/promises';
|
|
13
|
-
import { FlowApi, newAgentKey,
|
|
13
|
+
import { FlowApi, newAgentKey, redeemAgentInvite } from './api.js';
|
|
14
14
|
import { expandHome } from './config.js';
|
|
15
15
|
const HARNESSES = ['claude', 'codex', 'demo'];
|
|
16
|
+
const INVITE_CODE_RE = /^flow-[A-HJ-NP-Z2-9]{4}-[A-HJ-NP-Z2-9]{4}$/;
|
|
16
17
|
async function ask(rl, q, def) {
|
|
17
18
|
const suffix = def ? ` [${def}]` : '';
|
|
18
19
|
const answer = (await rl.question(`${q}${suffix}: `)).trim();
|
|
@@ -66,16 +67,19 @@ export async function runSetup(configPath, opts = {}) {
|
|
|
66
67
|
});
|
|
67
68
|
}
|
|
68
69
|
else {
|
|
69
|
-
//
|
|
70
|
+
// Redeem a one-time invite code (phase 15). The code (usually the
|
|
71
|
+
// positional arg) carries the sponsor + workspace; ask only name, handle,
|
|
72
|
+
// and harness, then join immediately — no approval.
|
|
73
|
+
const code = await required(opts.invite, 'Invite code (generate one in Flow → “Invite your Agent”)', {
|
|
74
|
+
normalize: (s) => s.trim(),
|
|
75
|
+
validate: (s) => INVITE_CODE_RE.test(s),
|
|
76
|
+
});
|
|
70
77
|
const name = await required(opts.name, 'Agent name (shown in Flow, e.g. RepoBot)');
|
|
71
78
|
const username = await required(opts.username, 'Handle (the agent’s @username — its durable login)', {
|
|
72
79
|
def: slugify(name),
|
|
73
80
|
normalize: (s) => s.toLowerCase(),
|
|
74
81
|
validate: (s) => /^[a-z0-9][a-z0-9._-]{2,31}$/.test(s),
|
|
75
82
|
});
|
|
76
|
-
const sponsorEmail = await required(opts.sponsor, 'Sponsor email (YOUR Flow login — you approve and own this agent)', {
|
|
77
|
-
validate: (s) => s.includes('@'),
|
|
78
|
-
});
|
|
79
83
|
kind = await required(opts.harness, 'Agent harness — claude, codex, or demo', {
|
|
80
84
|
def: 'claude',
|
|
81
85
|
normalize: (s) => s.toLowerCase(),
|
|
@@ -83,24 +87,15 @@ export async function runSetup(configPath, opts = {}) {
|
|
|
83
87
|
});
|
|
84
88
|
const description = opts.description ?? '';
|
|
85
89
|
const key = newAgentKey();
|
|
86
|
-
console.log('\
|
|
87
|
-
const
|
|
90
|
+
console.log('\nJoining the workspace…');
|
|
91
|
+
const res = await redeemAgentInvite(serverUrl, {
|
|
92
|
+
code,
|
|
88
93
|
username,
|
|
89
94
|
key,
|
|
90
95
|
name,
|
|
91
|
-
sponsorEmail,
|
|
92
96
|
...(description ? { description } : {}),
|
|
93
97
|
});
|
|
94
|
-
console.log(
|
|
95
|
-
console.log(` pairing code: ${start.code}`);
|
|
96
|
-
console.log('');
|
|
97
|
-
console.log(`Now approve this request inside Flow (as ${sponsorEmail}) — a prompt is waiting there.`);
|
|
98
|
-
console.log('Only approve if it shows the SAME code. Waiting (expires in 10 minutes)…');
|
|
99
|
-
const res = await waitForApproval(serverUrl, start);
|
|
100
|
-
if (res.status !== 'approved' || !res.agentToken) {
|
|
101
|
-
throw new Error(res.status === 'denied' ? 'the sponsor denied the request' : 'the request expired — run setup again');
|
|
102
|
-
}
|
|
103
|
-
console.log(`\napproved! registered ${res.user.displayName} <@${res.user.id}> in workspace "${res.workspace.name}"\n`);
|
|
98
|
+
console.log(`\njoined as ${res.user.displayName} <@${res.user.id}> in workspace "${res.workspace.name}"\n`);
|
|
104
99
|
agentToken = res.agentToken;
|
|
105
100
|
agentUsername = username;
|
|
106
101
|
agentKey = key;
|
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.8.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",
|