ftown-bridge 0.6.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/dist/create-ftown-session.d.ts +1 -1
- package/dist/create-ftown-session.js +29 -19
- package/dist/create-ftown-session.js.map +1 -1
- package/dist/ftown-sessions-cli.js +90 -7
- package/dist/ftown-sessions-cli.js.map +1 -1
- package/dist/harness-cli.js +210 -1
- package/dist/harness-cli.js.map +1 -1
- package/dist/harness-installer.js +18 -0
- package/dist/harness-installer.js.map +1 -1
- package/dist/hook-installer.d.ts +2 -0
- package/dist/hook-installer.js +60 -45
- package/dist/hook-installer.js.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/install-ftown-skill.d.ts +3 -4
- package/dist/install-ftown-skill.js +65 -38
- package/dist/install-ftown-skill.js.map +1 -1
- package/dist/local-api-server.d.ts +12 -0
- package/dist/local-api-server.js +222 -12
- package/dist/local-api-server.js.map +1 -1
- package/dist/mail-store.d.ts +29 -0
- package/dist/mail-store.js +116 -0
- package/dist/mail-store.js.map +1 -0
- package/dist/session-registry.d.ts +1 -0
- package/dist/session-registry.js +5 -0
- package/dist/session-registry.js.map +1 -1
- package/dist/session-store.d.ts +2 -1
- package/dist/session-store.js +1 -0
- package/dist/session-store.js.map +1 -1
- package/dist/tmux.js +4 -0
- package/dist/tmux.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/package.json +2 -2
- package/skills/ftown-orchestrator/SKILL.md +105 -0
- package/skills/ftown-sessions/SKILL.md +32 -19
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MailMessage } from './types.js';
|
|
2
|
+
export interface MailMessageInput {
|
|
3
|
+
from: string;
|
|
4
|
+
fromName?: string;
|
|
5
|
+
to: string;
|
|
6
|
+
type: MailMessage['type'];
|
|
7
|
+
threadId?: string;
|
|
8
|
+
body: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function createMailMessage(input: MailMessageInput): MailMessage;
|
|
11
|
+
/**
|
|
12
|
+
* Per-session append-only inbox (inbox.jsonl in the session's data dir).
|
|
13
|
+
* Delivery marking rewrites the file atomically (tmp+rename); files are small.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MailStore {
|
|
16
|
+
private readonly resolveDir;
|
|
17
|
+
private readonly locks;
|
|
18
|
+
constructor(resolveDir: (sessionId: string) => string);
|
|
19
|
+
private inboxPath;
|
|
20
|
+
/** Serialize file operations per session so appends never race rewrites. */
|
|
21
|
+
private withLock;
|
|
22
|
+
/** All messages, oldest first. Missing file and corrupt lines are tolerated. */
|
|
23
|
+
private readAll;
|
|
24
|
+
append(msg: MailMessage): Promise<void>;
|
|
25
|
+
listUndelivered(sessionId: string): Promise<MailMessage[]>;
|
|
26
|
+
listAll(sessionId: string, limit: number): Promise<MailMessage[]>;
|
|
27
|
+
/** Mark the given undelivered ids delivered now; returns the marked messages. */
|
|
28
|
+
markDelivered(sessionId: string, ids: string[], via: NonNullable<MailMessage['deliveredVia']>): Promise<MailMessage[]>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { randomBytes } from 'node:crypto';
|
|
5
|
+
/** Rewrites cap the inbox file at the newest N messages. */
|
|
6
|
+
const MAX_STORED_MESSAGES = 500;
|
|
7
|
+
export function createMailMessage(input) {
|
|
8
|
+
return {
|
|
9
|
+
id: `${Date.now().toString(36)}-${randomBytes(3).toString('hex')}`,
|
|
10
|
+
ts: new Date().toISOString(),
|
|
11
|
+
...input,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Per-session append-only inbox (inbox.jsonl in the session's data dir).
|
|
16
|
+
* Delivery marking rewrites the file atomically (tmp+rename); files are small.
|
|
17
|
+
*/
|
|
18
|
+
export class MailStore {
|
|
19
|
+
resolveDir;
|
|
20
|
+
locks = new Map();
|
|
21
|
+
constructor(resolveDir) {
|
|
22
|
+
this.resolveDir = resolveDir;
|
|
23
|
+
}
|
|
24
|
+
inboxPath(sessionId) {
|
|
25
|
+
return join(this.resolveDir(sessionId), 'inbox.jsonl');
|
|
26
|
+
}
|
|
27
|
+
/** Serialize file operations per session so appends never race rewrites. */
|
|
28
|
+
withLock(sessionId, fn) {
|
|
29
|
+
const prev = this.locks.get(sessionId) ?? Promise.resolve();
|
|
30
|
+
const next = prev.then(fn, fn);
|
|
31
|
+
this.locks.set(sessionId, next.catch(() => undefined));
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
/** All messages, oldest first. Missing file and corrupt lines are tolerated. */
|
|
35
|
+
async readAll(sessionId) {
|
|
36
|
+
const filePath = this.inboxPath(sessionId);
|
|
37
|
+
if (!existsSync(filePath)) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
41
|
+
const messages = [];
|
|
42
|
+
for (const line of raw.split('\n')) {
|
|
43
|
+
if (!line.trim())
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
const msg = JSON.parse(line);
|
|
47
|
+
if (msg && typeof msg.id === 'string' && typeof msg.body === 'string') {
|
|
48
|
+
messages.push(msg);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Skip corrupt lines (e.g. partial write from a crashed bridge).
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return messages;
|
|
56
|
+
}
|
|
57
|
+
async append(msg) {
|
|
58
|
+
await this.withLock(msg.to, async () => {
|
|
59
|
+
const dir = this.resolveDir(msg.to);
|
|
60
|
+
await mkdir(dir, { recursive: true });
|
|
61
|
+
// Mail can carry task details; owner-only like the session registry.
|
|
62
|
+
await appendFile(this.inboxPath(msg.to), `${JSON.stringify(msg)}\n`, {
|
|
63
|
+
encoding: 'utf-8',
|
|
64
|
+
mode: 0o600,
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async listUndelivered(sessionId) {
|
|
69
|
+
return this.withLock(sessionId, async () => (await this.readAll(sessionId)).filter((m) => !m.deliveredAt));
|
|
70
|
+
}
|
|
71
|
+
async listAll(sessionId, limit) {
|
|
72
|
+
return this.withLock(sessionId, async () => {
|
|
73
|
+
const all = await this.readAll(sessionId);
|
|
74
|
+
return limit > 0 ? all.slice(-limit) : all;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Mark the given undelivered ids delivered now; returns the marked messages. */
|
|
78
|
+
async markDelivered(sessionId, ids, via) {
|
|
79
|
+
return this.withLock(sessionId, async () => {
|
|
80
|
+
if (ids.length === 0) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const all = await this.readAll(sessionId);
|
|
84
|
+
const wanted = new Set(ids);
|
|
85
|
+
const now = new Date().toISOString();
|
|
86
|
+
const marked = [];
|
|
87
|
+
for (const msg of all) {
|
|
88
|
+
if (wanted.has(msg.id) && !msg.deliveredAt) {
|
|
89
|
+
msg.deliveredAt = now;
|
|
90
|
+
msg.deliveredVia = via;
|
|
91
|
+
marked.push(msg);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (marked.length === 0) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
// Cap drops oldest DELIVERED messages only — undelivered mail must survive
|
|
98
|
+
// until a session reads it, even if the file temporarily exceeds the cap.
|
|
99
|
+
let toDrop = all.length - MAX_STORED_MESSAGES;
|
|
100
|
+
const kept = all.filter((m) => {
|
|
101
|
+
if (toDrop > 0 && m.deliveredAt) {
|
|
102
|
+
toDrop--;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
});
|
|
107
|
+
const filePath = this.inboxPath(sessionId);
|
|
108
|
+
const tmp = `${filePath}.tmp`;
|
|
109
|
+
const payload = kept.map((m) => JSON.stringify(m)).join('\n') + '\n';
|
|
110
|
+
await writeFile(tmp, payload, { encoding: 'utf-8', mode: 0o600 });
|
|
111
|
+
await rename(tmp, filePath);
|
|
112
|
+
return marked;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=mail-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-store.js","sourceRoot":"","sources":["../src/mail-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare function registerSessionWorkspace(sessionId: string, workingDir?: string): void;
|
|
2
2
|
export declare function registerSessionConversation(sessionId: string, conversationId: string): void;
|
|
3
|
+
export declare function resolveSessionIdByConversation(conversationId: string): string | undefined;
|
|
3
4
|
export declare function unregisterSession(sessionId: string): void;
|
|
4
5
|
/**
|
|
5
6
|
* How a hook payload was attributed to a ftown session. 'workspace' is an
|
package/dist/session-registry.js
CHANGED
|
@@ -38,6 +38,11 @@ export function registerSessionConversation(sessionId, conversationId) {
|
|
|
38
38
|
data.byConversation[conversationId] = sessionId;
|
|
39
39
|
saveRegistry(data);
|
|
40
40
|
}
|
|
41
|
+
export function resolveSessionIdByConversation(conversationId) {
|
|
42
|
+
if (!conversationId)
|
|
43
|
+
return undefined;
|
|
44
|
+
return loadRegistry().byConversation[conversationId];
|
|
45
|
+
}
|
|
41
46
|
export function unregisterSession(sessionId) {
|
|
42
47
|
const data = loadRegistry();
|
|
43
48
|
for (const [path, id] of Object.entries(data.byWorkspace)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/session-store.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ export declare class SessionStore {
|
|
|
4
4
|
private readonly archivePath;
|
|
5
5
|
private readonly writeLocks;
|
|
6
6
|
constructor(dataDir: string);
|
|
7
|
-
|
|
7
|
+
/** Per-session data dir (session.json, terminal.log, inbox.jsonl). */
|
|
8
|
+
sessionDir(sessionId: string): string;
|
|
8
9
|
private sessionFilePath;
|
|
9
10
|
private terminalLogPath;
|
|
10
11
|
saveSession(session: Session): Promise<void>;
|
package/dist/session-store.js
CHANGED
|
@@ -9,6 +9,7 @@ export class SessionStore {
|
|
|
9
9
|
this.sessionsDir = join(dataDir, 'sessions');
|
|
10
10
|
this.archivePath = join(dataDir, 'archive.jsonl');
|
|
11
11
|
}
|
|
12
|
+
/** Per-session data dir (session.json, terminal.log, inbox.jsonl). */
|
|
12
13
|
sessionDir(sessionId) {
|
|
13
14
|
return join(this.sessionsDir, sessionId);
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIrC,MAAM,OAAO,YAAY;IACN,WAAW,CAAS;IACpB,WAAW,CAAS;IACpB,UAAU,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEpE,YAAY,OAAe;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/tmux.js
CHANGED
|
@@ -69,6 +69,10 @@ function tmuxConfigPath() {
|
|
|
69
69
|
'setw -g aggressive-resize on',
|
|
70
70
|
'set -s escape-time 0',
|
|
71
71
|
'set -g default-terminal "xterm-256color"',
|
|
72
|
+
// Inline TUIs (Claude Code) ignore PageUp/PageDown, so use them to scroll
|
|
73
|
+
// tmux history via copy-mode (-e exits at the bottom). Alternate-screen
|
|
74
|
+
// apps (less, htop) consume the keys themselves — pass through for them.
|
|
75
|
+
'bind-key -n PPage if-shell -F "#{alternate_on}" "send-keys PPage" "copy-mode -eu"',
|
|
72
76
|
].join('\n') + '\n');
|
|
73
77
|
return path;
|
|
74
78
|
}
|
package/dist/tmux.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -23,6 +23,19 @@ export type SessionStatus = 'pending' | 'running' | 'completed' | 'error';
|
|
|
23
23
|
export interface ArchivedSession extends Session {
|
|
24
24
|
removedAt: string;
|
|
25
25
|
}
|
|
26
|
+
/** Inter-agent mail stored in <dataDir>/sessions/<id>/inbox.jsonl. */
|
|
27
|
+
export interface MailMessage {
|
|
28
|
+
id: string;
|
|
29
|
+
ts: string;
|
|
30
|
+
from: string;
|
|
31
|
+
fromName?: string;
|
|
32
|
+
to: string;
|
|
33
|
+
type: 'message' | 'task' | 'result' | 'escalation';
|
|
34
|
+
threadId?: string;
|
|
35
|
+
body: string;
|
|
36
|
+
deliveredAt?: string;
|
|
37
|
+
deliveredVia?: 'poll' | 'drain' | 'nudge' | 'cli';
|
|
38
|
+
}
|
|
26
39
|
export interface SessionMessage {
|
|
27
40
|
sessionId: string;
|
|
28
41
|
type: SessionMessageType;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ftown-bridge",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "CLI bridge for ftown
|
|
3
|
+
"version": "0.8.0",
|
|
4
|
+
"description": "CLI bridge for ftown \u2014 generic PTY-over-Centrifugo relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ftown-orchestrator
|
|
3
|
+
description: >-
|
|
4
|
+
Spawn and coordinate worker ftown agent sessions on this machine. Activates when
|
|
5
|
+
the session env has FTOWN_ORCHESTRATOR=1, the first input contains an [ftown]
|
|
6
|
+
orchestrator briefing, or the user asks to orchestrate, coordinate, or spawn
|
|
7
|
+
worker agent sessions. Teaches spawning and coordinating sibling ftown agent
|
|
8
|
+
sessions via ~/.ftown/ftown-sessions CLI.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ftown orchestrator playbook
|
|
12
|
+
|
|
13
|
+
You are running inside an ftown session (your id is in `$FTOWN_SESSION_ID`) and
|
|
14
|
+
can coordinate worker agent sessions on this machine using the
|
|
15
|
+
`~/.ftown/ftown-sessions` CLI.
|
|
16
|
+
|
|
17
|
+
See the **ftown-sessions** skill for the full CLI reference.
|
|
18
|
+
|
|
19
|
+
## Spawning workers
|
|
20
|
+
|
|
21
|
+
`--shell` accepts `claude`, `cursor`, `shell`, `opencode`, …; `--parent` sets the
|
|
22
|
+
worker's parent to `$FTOWN_SESSION_ID`.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
~/.ftown/ftown-sessions create \
|
|
26
|
+
--shell claude \
|
|
27
|
+
--parent \
|
|
28
|
+
--workdir /path/to/repo \
|
|
29
|
+
--name review-auth \
|
|
30
|
+
--prompt "Review the auth module and summarize findings"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Returns JSON containing `session.id` — save it to poll the worker later.
|
|
34
|
+
Workers spawned with `--parent` are auto-briefed to report back via
|
|
35
|
+
`mail send --parent`; their reports arrive in **your** inbox and are delivered
|
|
36
|
+
automatically as `[ftown mail]` context at your turn boundaries.
|
|
37
|
+
|
|
38
|
+
## Monitoring workers
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# See what's on screen right now
|
|
42
|
+
~/.ftown/ftown-sessions screen <session-id> --limit 100
|
|
43
|
+
|
|
44
|
+
# Search for errors / completion markers
|
|
45
|
+
~/.ftown/ftown-sessions grep <session-id> --pattern 'FAIL|done|error'
|
|
46
|
+
|
|
47
|
+
# Check if the process is still alive
|
|
48
|
+
~/.ftown/ftown-sessions running <session-id>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Poll `screen` or `grep` rather than waiting blindly — workers don't always
|
|
52
|
+
remember to mail you when they finish.
|
|
53
|
+
|
|
54
|
+
## Messaging (mail)
|
|
55
|
+
|
|
56
|
+
Each session has an inbox. Mail is delivered into the recipient's context
|
|
57
|
+
automatically at turn boundaries — no keystroke injection needed.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Send work / instructions to a child
|
|
61
|
+
ftown-harness mail send <child> --type task "implement the API client"
|
|
62
|
+
|
|
63
|
+
# Reply in a thread, or escalate
|
|
64
|
+
ftown-harness mail send <child> --thread <id> "use the v2 endpoint"
|
|
65
|
+
|
|
66
|
+
# Read your own inbox on demand (you also get mail automatically)
|
|
67
|
+
ftown-harness mail read
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Children report back with `mail send --parent --type result` (or
|
|
71
|
+
`--type escalation` when blocked). Fan-out still works via
|
|
72
|
+
`~/.ftown/ftown-sessions tell --children "pause and report status"` (now mail
|
|
73
|
+
under the hood; one of `--parent | --children | --siblings`).
|
|
74
|
+
|
|
75
|
+
If a worker is idle and must be woken right now, terminal keystroke injection
|
|
76
|
+
(`ftown-harness send <id> "..." -s` or `tell --keys`) is the **last resort** —
|
|
77
|
+
prefer mail, which arrives at the next turn boundary.
|
|
78
|
+
|
|
79
|
+
## Cleanup
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Archive a finished worker (kept as a tombstone)
|
|
83
|
+
~/.ftown/ftown-sessions remove <session-id>
|
|
84
|
+
|
|
85
|
+
# Bring it back — resumes the agent conversation if its agent session id was
|
|
86
|
+
# recorded before removal; otherwise restarts fresh with a new id
|
|
87
|
+
~/.ftown/ftown-sessions revive <session-id>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Clean up workers you no longer need to keep the session list tidy.
|
|
91
|
+
|
|
92
|
+
## Practical guidance
|
|
93
|
+
|
|
94
|
+
- **Parallelize** independent tasks: spawn multiple workers before waiting for any.
|
|
95
|
+
- **Poll, don't block**: use `screen` / `grep` to check progress; mail from
|
|
96
|
+
workers reaches you automatically at turn boundaries, so keep working.
|
|
97
|
+
- **Name workers clearly**: `--name` shows in `list` output and as the sender
|
|
98
|
+
name on incoming mail.
|
|
99
|
+
- **Check `list` first**: see what's already running before spawning duplicates.
|
|
100
|
+
|
|
101
|
+
## If the CLI is missing
|
|
102
|
+
|
|
103
|
+
Start or restart **ftown-bridge** on this machine. It installs
|
|
104
|
+
`~/.ftown/ftown-sessions` and updates this skill under
|
|
105
|
+
`~/.ftown/skills/ftown-orchestrator/` (linked into ~/.agents/skills and ~/.claude/skills).
|
|
@@ -36,11 +36,11 @@ Skill copy (same binary via wrapper): `scripts/ftown-sessions` in this skill dir
|
|
|
36
36
|
# Metadata
|
|
37
37
|
~/.ftown/ftown-sessions get <session-id>
|
|
38
38
|
|
|
39
|
-
# Terminal output (
|
|
39
|
+
# Terminal output (JSON by default; add --plain for raw lines)
|
|
40
40
|
~/.ftown/ftown-sessions screen <session-id> --limit 200
|
|
41
41
|
|
|
42
|
-
# Search output
|
|
43
|
-
~/.ftown/ftown-sessions grep <session-id> --pattern 'error|failed'
|
|
42
|
+
# Search output (--offset/--limit paginate screen and grep)
|
|
43
|
+
~/.ftown/ftown-sessions grep <session-id> --pattern 'error|failed' --offset 0 --limit 100
|
|
44
44
|
|
|
45
45
|
# Type into another running session
|
|
46
46
|
~/.ftown/ftown-sessions keys <session-id> 'y'
|
|
@@ -60,24 +60,33 @@ Skill copy (same binary via wrapper): `scripts/ftown-sessions` in this skill dir
|
|
|
60
60
|
~/.ftown/ftown-sessions revive <session-id>
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
## Messaging
|
|
63
|
+
## Messaging (mail)
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
as a normal prompt.
|
|
65
|
+
`tell` posts to the target session's **inbox**. Mail is delivered into the
|
|
66
|
+
recipient's context automatically at turn boundaries (as `[ftown mail]`
|
|
67
|
+
context), so there is no keystroke injection by default.
|
|
69
68
|
|
|
70
69
|
```bash
|
|
71
70
|
# Tell a specific session
|
|
72
71
|
~/.ftown/ftown-sessions tell <session-id> "tests are green, ship it"
|
|
73
72
|
|
|
73
|
+
# Mail type / threading
|
|
74
|
+
~/.ftown/ftown-sessions tell <session-id> --type task "implement the API client"
|
|
75
|
+
~/.ftown/ftown-sessions tell <session-id> --type result --thread <id> "done, 0 failures"
|
|
76
|
+
|
|
74
77
|
# Tell my parent / children / siblings (resolved via FTOWN_SESSION_ID)
|
|
75
78
|
~/.ftown/ftown-sessions tell --parent "child finished phase 1"
|
|
76
79
|
~/.ftown/ftown-sessions tell --children "pause and report status"
|
|
77
80
|
~/.ftown/ftown-sessions tell --siblings "I grabbed the lock, stand by"
|
|
81
|
+
|
|
82
|
+
# Last resort: inject as terminal keystrokes instead of mail
|
|
83
|
+
~/.ftown/ftown-sessions tell <session-id> --keys "wake up"
|
|
84
|
+
|
|
85
|
+
# Read my own inbox (requires FTOWN_SESSION_ID; alias: mail)
|
|
86
|
+
~/.ftown/ftown-sessions inbox # --peek / --limit N / --all / --json
|
|
78
87
|
```
|
|
79
88
|
|
|
80
|
-
Sender is resolved from `FTOWN_SESSION_ID` (
|
|
89
|
+
Sender is resolved from `FTOWN_SESSION_ID` (omitted when unset).
|
|
81
90
|
Fan-out targets are messaged sequentially, one JSON result line per target.
|
|
82
91
|
|
|
83
92
|
### Create options
|
|
@@ -115,19 +124,20 @@ Spawned ftown sessions receive:
|
|
|
115
124
|
|
|
116
125
|
- `FTOWN_SESSION_ID` — this session (use with `--parent`)
|
|
117
126
|
- `FTOWN_PARENT_SESSION_ID` — the parent session id, set on children spawned with `--parent` / `--parent-id`
|
|
127
|
+
- `FTOWN_ORCHESTRATOR` — set to `1` on sessions created with `--orchestrator`
|
|
118
128
|
- `FTOWN_HOOK_PORT` / `FTOWN_HOOK_TOKEN` — hook forwarding (not for cross-session control)
|
|
119
129
|
|
|
120
130
|
Agent children (any `--shell` except `shell`) spawned with a parent also get an
|
|
121
131
|
automatic one-paragraph briefing prepended to their first input: it states their
|
|
122
|
-
name/id and parent name/id, and how to
|
|
123
|
-
creator's `--prompt` follows after a `Task:` line.
|
|
132
|
+
name/id and parent name/id, and how to mail the parent via
|
|
133
|
+
`ftown-harness mail send --parent`. The creator's `--prompt` follows after a `Task:` line.
|
|
124
134
|
|
|
125
|
-
An agent session created with `--orchestrator` additionally gets
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
135
|
+
An agent session created with `--orchestrator` additionally gets `FTOWN_ORCHESTRATOR=1`
|
|
136
|
+
in its environment and a compact pointer briefing directing it to the **ftown-orchestrator**
|
|
137
|
+
skill (installed at `~/.ftown/skills/ftown-orchestrator`, linked from ~/.agents/skills and
|
|
138
|
+
~/.claude/skills), which contains the full orchestrator playbook for spawning workers,
|
|
139
|
+
monitoring them, and cleaning up. When both apply, the child paragraph
|
|
140
|
+
comes first, then the orchestrator pointer, separated by a blank line.
|
|
131
141
|
|
|
132
142
|
## HTTP API (optional)
|
|
133
143
|
|
|
@@ -140,11 +150,14 @@ The CLI wraps the loopback API. Raw access if needed:
|
|
|
140
150
|
| GET | `/api/sessions/:id/screen` | Terminal lines |
|
|
141
151
|
| POST | `/api/sessions/:id/grep` | Search |
|
|
142
152
|
| POST | `/api/sessions/:id/keys` | Send keys |
|
|
143
|
-
|
|
|
153
|
+
| GET | `/api/sessions/:id/running` | PTY liveness |
|
|
154
|
+
| POST | `/api/sessions/:id/inbox` | Send mail (`{ body, from?, fromName?, type?, threadId? }`) |
|
|
155
|
+
| GET | `/api/sessions/:id/inbox` | Read mail (`?wait=&peek=&limit=&all=`) |
|
|
156
|
+
| POST | `/api/sessions/:id/message` | Inject a message line as keystrokes (`{ text, from? }`) |
|
|
144
157
|
| DELETE | `/api/sessions/:id` | Remove (tombstone-archived) |
|
|
145
158
|
| GET | `/api/archive` | List removed-session tombstones |
|
|
146
159
|
| POST | `/api/sessions/:id/revive` | Recreate a removed session (new id) |
|
|
147
160
|
|
|
148
161
|
## If the CLI is missing
|
|
149
162
|
|
|
150
|
-
Start or restart **ftown-bridge** on this machine. It installs `~/.ftown/ftown-sessions`, `~/.ftown/notify.sh`, and updates this skill under `~/.
|
|
163
|
+
Start or restart **ftown-bridge** on this machine. It installs `~/.ftown/ftown-sessions`, `~/.ftown/notify.sh`, and updates this skill under `~/.ftown/skills/ftown-sessions/` (linked into ~/.agents/skills and ~/.claude/skills).
|