ftown-bridge 0.19.39 → 0.19.41
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/cli-client.d.ts +17 -0
- package/dist/cli-client.js +76 -0
- package/dist/cli-client.js.map +1 -0
- package/dist/cli-entry.d.ts +2 -0
- package/dist/cli-entry.js +22 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/codex-installer.d.ts +1 -1
- package/dist/codex-installer.js +7 -6
- package/dist/codex-installer.js.map +1 -1
- package/dist/command-rpc.js +0 -1
- package/dist/command-rpc.js.map +1 -1
- package/dist/create-ftown-session.d.ts +1 -6
- package/dist/create-ftown-session.js +3 -25
- package/dist/create-ftown-session.js.map +1 -1
- package/dist/cursor-hook-installer.d.ts +1 -1
- package/dist/cursor-hook-installer.js +6 -5
- package/dist/cursor-hook-installer.js.map +1 -1
- package/dist/ensure-ftown-path.js +1 -1
- package/dist/env-commands.d.ts +32 -0
- package/dist/env-commands.js +162 -0
- package/dist/env-commands.js.map +1 -0
- package/dist/ftown-cli.d.ts +2 -6
- package/dist/ftown-cli.js +25 -79
- package/dist/ftown-cli.js.map +1 -1
- package/dist/ftown-env-cli.d.ts +2 -31
- package/dist/ftown-env-cli.js +7 -176
- package/dist/ftown-env-cli.js.map +1 -1
- package/dist/ftown-home.d.ts +24 -10
- package/dist/ftown-home.js +19 -41
- package/dist/ftown-home.js.map +1 -1
- package/dist/ftown-sessions-cli.d.ts +1 -1
- package/dist/ftown-sessions-cli.js +6 -499
- package/dist/ftown-sessions-cli.js.map +1 -1
- package/dist/harness-cli.d.ts +1 -1
- package/dist/harness-cli.js +6 -626
- package/dist/harness-cli.js.map +1 -1
- package/dist/harness-commands.d.ts +2 -0
- package/dist/harness-commands.js +576 -0
- package/dist/harness-commands.js.map +1 -0
- package/dist/harness-installer.d.ts +1 -10
- package/dist/harness-installer.js +13 -166
- package/dist/harness-installer.js.map +1 -1
- package/dist/harness-registry.d.ts +1 -27
- package/dist/harness-registry.js +1 -20
- package/dist/harness-registry.js.map +1 -1
- package/dist/hook-installer.d.ts +1 -1
- package/dist/hook-installer.js +5 -4
- package/dist/hook-installer.js.map +1 -1
- package/dist/index.js +10 -108
- package/dist/index.js.map +1 -1
- package/dist/install-ftown-command-cli.d.ts +3 -3
- package/dist/install-ftown-command-cli.js +67 -22
- package/dist/install-ftown-command-cli.js.map +1 -1
- package/dist/install-ftown-skill.d.ts +6 -0
- package/dist/install-ftown-skill.js +111 -10
- package/dist/install-ftown-skill.js.map +1 -1
- package/dist/install-notify-script.d.ts +1 -1
- package/dist/install-notify-script.js +7 -6
- package/dist/install-notify-script.js.map +1 -1
- package/dist/mail-delivery.d.ts +1 -1
- package/dist/mail-delivery.js +3 -5
- package/dist/mail-delivery.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/muse-plugin-installer.js +4 -0
- package/dist/muse-plugin-installer.js.map +1 -1
- package/dist/opencode-plugin-installer.d.ts +1 -2
- package/dist/opencode-plugin-installer.js +1 -2
- package/dist/opencode-plugin-installer.js.map +1 -1
- package/dist/provider-env-store.js +1 -1
- package/dist/provider-env-store.js.map +1 -1
- package/dist/retired-skill-assets.d.ts +3 -0
- package/dist/retired-skill-assets.js +11 -0
- package/dist/retired-skill-assets.js.map +1 -1
- package/dist/sessions-commands.d.ts +2 -0
- package/dist/sessions-commands.js +445 -0
- package/dist/sessions-commands.js.map +1 -0
- package/dist/setup-migrations.d.ts +6 -0
- package/dist/setup-migrations.js +28 -0
- package/dist/setup-migrations.js.map +1 -0
- package/dist/setup-state.d.ts +16 -0
- package/dist/setup-state.js +163 -0
- package/dist/setup-state.js.map +1 -0
- package/dist/setup.d.ts +25 -0
- package/dist/setup.js +120 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/wire-types.js +1 -8
- package/dist/wire-types.js.map +1 -1
- package/package.json +2 -3
- package/pi-extension/API.md +4 -0
- package/pi-extension/ftown.js +1 -2
- package/skills/ftown/SKILL.md +71 -19
- package/skills/ftown/references/orchestrator.md +23 -99
- package/skills/ftown/references/sessions.md +37 -42
- package/dist/claude-trust.d.ts +0 -11
- package/dist/claude-trust.js +0 -47
- package/dist/claude-trust.js.map +0 -1
- package/dist/install-ftown-cli.d.ts +0 -3
- package/dist/install-ftown-cli.js +0 -29
- package/dist/install-ftown-cli.js.map +0 -1
- package/dist/install-ftown-env-cli.d.ts +0 -3
- package/dist/install-ftown-env-cli.js +0 -30
- package/dist/install-ftown-env-cli.js.map +0 -1
- package/dist/install-ftown-workflows-cli.d.ts +0 -3
- package/dist/install-ftown-workflows-cli.js +0 -33
- package/dist/install-ftown-workflows-cli.js.map +0 -1
- package/dist/workflow-runner-cli.d.ts +0 -2
- package/dist/workflow-runner-cli.js +0 -376
- package/dist/workflow-runner-cli.js.map +0 -1
- package/dist/workflow-runner.d.ts +0 -163
- package/dist/workflow-runner.js +0 -307
- package/dist/workflow-runner.js.map +0 -1
- package/skills/fticket/SKILL.md +0 -166
- package/skills/ftown/references/workflows.md +0 -470
- package/skills/ftown/scripts/example.flow.mjs +0 -170
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Local API client for ftown cross-session control.
|
|
4
|
+
* Installed to ~/.ftown/ftown-sessions by ftown-bridge.
|
|
5
|
+
*/
|
|
6
|
+
import { api as request, loadPointer, listSessions, fetchInbox, sendMail } from './cli-client.js';
|
|
7
|
+
import { MAIL_TYPES, AUTOMATION_REMOVED_MESSAGE, formatMailMessage, } from './wire-types.js';
|
|
8
|
+
async function api(method, path, body, headers) {
|
|
9
|
+
return { data: await request(loadPointer(), method, path, body, headers) };
|
|
10
|
+
}
|
|
11
|
+
async function listSessionInfo() { return listSessions(loadPointer()); }
|
|
12
|
+
async function resolveFanout(mode, self) {
|
|
13
|
+
if (!self) {
|
|
14
|
+
throw new Error(`--${mode} requires FTOWN_SESSION_ID to be set`);
|
|
15
|
+
}
|
|
16
|
+
const sessions = await listSessionInfo();
|
|
17
|
+
const me = sessions.find((s) => s.id === self);
|
|
18
|
+
if (mode === 'parent') {
|
|
19
|
+
const parent = me?.parentSessionId;
|
|
20
|
+
if (!parent)
|
|
21
|
+
throw new Error('Current session has no parent');
|
|
22
|
+
return [parent];
|
|
23
|
+
}
|
|
24
|
+
if (mode === 'children') {
|
|
25
|
+
return sessions.filter((s) => s.parentSessionId === self).map((s) => s.id);
|
|
26
|
+
}
|
|
27
|
+
// siblings
|
|
28
|
+
const parent = me?.parentSessionId;
|
|
29
|
+
if (!parent)
|
|
30
|
+
throw new Error('Current session has no parent (cannot resolve siblings)');
|
|
31
|
+
return sessions
|
|
32
|
+
.filter((s) => s.parentSessionId === parent && s.id !== self)
|
|
33
|
+
.map((s) => s.id);
|
|
34
|
+
}
|
|
35
|
+
function flag(args, name) {
|
|
36
|
+
const i = args.indexOf(name);
|
|
37
|
+
if (i === -1 || i + 1 >= args.length)
|
|
38
|
+
return undefined;
|
|
39
|
+
return args[i + 1];
|
|
40
|
+
}
|
|
41
|
+
function hasFlag(args, name) {
|
|
42
|
+
return args.includes(name);
|
|
43
|
+
}
|
|
44
|
+
/** Positional args, skipping flags and the values of value-taking flags. */
|
|
45
|
+
function positionals(args, valueFlags) {
|
|
46
|
+
const out = [];
|
|
47
|
+
for (let i = 0; i < args.length; i++) {
|
|
48
|
+
const a = args[i];
|
|
49
|
+
if (a.startsWith('--')) {
|
|
50
|
+
if (valueFlags.includes(a))
|
|
51
|
+
i++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
out.push(a);
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
async function fetchUsageRow(id) {
|
|
59
|
+
const [{ data: usageData }, sessionData] = await Promise.all([
|
|
60
|
+
api('GET', `/api/sessions/${id}/usage`),
|
|
61
|
+
api('GET', `/api/sessions/${id}`).then((r) => r.data, () => null),
|
|
62
|
+
]);
|
|
63
|
+
const session = sessionData?.session;
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
name: session?.name ?? '',
|
|
67
|
+
usage: usageData.usage ?? null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function formatUsageTable(rows) {
|
|
71
|
+
const header = ['id', 'name', 'model(s)', 'in', 'out', 'cacheR', 'cacheW', 'total'];
|
|
72
|
+
const body = [];
|
|
73
|
+
for (const r of rows) {
|
|
74
|
+
const u = r.usage;
|
|
75
|
+
body.push([
|
|
76
|
+
r.id.slice(0, 8),
|
|
77
|
+
r.name,
|
|
78
|
+
u ? u.models.join(',') : '-',
|
|
79
|
+
u ? String(u.inputTokens) : '-',
|
|
80
|
+
u ? String(u.outputTokens) : '-',
|
|
81
|
+
u ? String(u.cacheReadTokens) : '-',
|
|
82
|
+
u ? String(u.cacheWriteTokens) : '-',
|
|
83
|
+
u ? String(u.totalTokens) : '-',
|
|
84
|
+
]);
|
|
85
|
+
// Multi-model sessions get an indented per-model sub-row each.
|
|
86
|
+
if (u?.perModel && u.perModel.length > 1) {
|
|
87
|
+
for (const m of u.perModel) {
|
|
88
|
+
body.push([
|
|
89
|
+
'',
|
|
90
|
+
'',
|
|
91
|
+
` ${m.model}`,
|
|
92
|
+
String(m.inputTokens),
|
|
93
|
+
String(m.outputTokens),
|
|
94
|
+
String(m.cacheReadTokens),
|
|
95
|
+
String(m.cacheWriteTokens),
|
|
96
|
+
String(m.inputTokens + m.outputTokens + m.cacheReadTokens + m.cacheWriteTokens),
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const collected = rows.map((r) => r.usage).filter((u) => u !== null);
|
|
102
|
+
const sum = (pick) => collected.reduce((acc, u) => acc + pick(u), 0);
|
|
103
|
+
body.push([
|
|
104
|
+
'TOTAL',
|
|
105
|
+
'',
|
|
106
|
+
'',
|
|
107
|
+
String(sum((u) => u.inputTokens)),
|
|
108
|
+
String(sum((u) => u.outputTokens)),
|
|
109
|
+
String(sum((u) => u.cacheReadTokens)),
|
|
110
|
+
String(sum((u) => u.cacheWriteTokens)),
|
|
111
|
+
String(sum((u) => u.totalTokens)),
|
|
112
|
+
]);
|
|
113
|
+
const widths = header.map((h, i) => Math.max(h.length, ...body.map((row) => row[i].length)));
|
|
114
|
+
const render = (row) => row.map((cell, i) => cell.padEnd(widths[i])).join(' ').trimEnd();
|
|
115
|
+
return [render(header), ...body.map(render)].join('\n');
|
|
116
|
+
}
|
|
117
|
+
function usage() {
|
|
118
|
+
console.error(`Usage: ftown sessions <command> [options]
|
|
119
|
+
|
|
120
|
+
Commands:
|
|
121
|
+
list List sessions
|
|
122
|
+
create [options] Spawn a new agent session
|
|
123
|
+
get <session-id> Session metadata
|
|
124
|
+
screen <session-id> Print terminal lines
|
|
125
|
+
grep <session-id> Search terminal output
|
|
126
|
+
keys <session-id> <text> Send keys to a running session
|
|
127
|
+
tell <target> <message...> Send mail to another session's inbox
|
|
128
|
+
inbox | mail Read own inbox (requires FTOWN_SESSION_ID)
|
|
129
|
+
running <session-id> Check if session PTY is running
|
|
130
|
+
usage <session-id...> Model/token usage per session (--json for raw)
|
|
131
|
+
remove <session-id> Stop and remove a session (archived as a tombstone)
|
|
132
|
+
archive List archived (removed) sessions
|
|
133
|
+
revive <session-id> Recreate a removed session from its tombstone
|
|
134
|
+
|
|
135
|
+
Tell targets (one of):
|
|
136
|
+
<session-id> Explicit target session id
|
|
137
|
+
--parent Message FTOWN_SESSION_ID's parent session
|
|
138
|
+
--children Message all sessions parented to FTOWN_SESSION_ID
|
|
139
|
+
--siblings Message sessions sharing my parent (excluding me)
|
|
140
|
+
|
|
141
|
+
Tell options:
|
|
142
|
+
--type <t> message | task | result | escalation (default: message)
|
|
143
|
+
--thread <id> Thread id for grouping replies
|
|
144
|
+
--keys Inject as terminal keystrokes instead of mail (last resort)
|
|
145
|
+
|
|
146
|
+
Inbox options:
|
|
147
|
+
--peek Do not mark messages as delivered
|
|
148
|
+
--limit <n> Max messages
|
|
149
|
+
--all Include already-delivered messages
|
|
150
|
+
--json Raw JSON output
|
|
151
|
+
|
|
152
|
+
Create options:
|
|
153
|
+
--shell <type> Harness override; omitted inherits the current session (otherwise claude)
|
|
154
|
+
--prompt <text> Initial message
|
|
155
|
+
--workdir <path> Working directory
|
|
156
|
+
--create-workdir Create --workdir if it does not exist
|
|
157
|
+
--name <label> Dashboard name
|
|
158
|
+
--command <cmd> Full command override
|
|
159
|
+
--parent Link parent to FTOWN_SESSION_ID or X-Ftown-Session-Id
|
|
160
|
+
--parent-id <uuid> Explicit parent session id
|
|
161
|
+
--model <name> Model (cursor, codex)
|
|
162
|
+
--json Output raw JSON (default for most commands)
|
|
163
|
+
|
|
164
|
+
Screen/grep options:
|
|
165
|
+
--offset <n> Pagination offset (default: 0)
|
|
166
|
+
--limit <n> Max lines/matches (default: 200)
|
|
167
|
+
|
|
168
|
+
Grep options:
|
|
169
|
+
--pattern <regex> Required for grep
|
|
170
|
+
|
|
171
|
+
Reads ~/.ftown/bridge.json (ftown-bridge must be running).`);
|
|
172
|
+
}
|
|
173
|
+
export async function runSessions(argv) {
|
|
174
|
+
if (['loop', 'loops', 'loop-list'].includes(argv[0])) {
|
|
175
|
+
console.error(`ftown sessions: ${AUTOMATION_REMOVED_MESSAGE}`);
|
|
176
|
+
return 1;
|
|
177
|
+
}
|
|
178
|
+
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
179
|
+
usage();
|
|
180
|
+
return argv.length === 0 ? 1 : 0;
|
|
181
|
+
}
|
|
182
|
+
const cmd = argv[0];
|
|
183
|
+
const rest = argv.slice(1);
|
|
184
|
+
const jsonOut = !hasFlag(rest, '--plain');
|
|
185
|
+
try {
|
|
186
|
+
switch (cmd) {
|
|
187
|
+
case 'list': {
|
|
188
|
+
const { data } = await api('GET', '/api/sessions');
|
|
189
|
+
console.log(jsonOut ? JSON.stringify(data, null, 2) : formatSessionList(data));
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case 'create': {
|
|
193
|
+
const shellType = flag(rest, '--shell');
|
|
194
|
+
const prompt = flag(rest, '--prompt');
|
|
195
|
+
const workingDir = flag(rest, '--workdir');
|
|
196
|
+
const name = flag(rest, '--name');
|
|
197
|
+
const command = flag(rest, '--command');
|
|
198
|
+
const model = flag(rest, '--model');
|
|
199
|
+
const parentId = flag(rest, '--parent-id');
|
|
200
|
+
const useParent = hasFlag(rest, '--parent');
|
|
201
|
+
const createWorkdir = hasFlag(rest, '--create-workdir');
|
|
202
|
+
const body = {};
|
|
203
|
+
if (shellType)
|
|
204
|
+
body.shellType = shellType;
|
|
205
|
+
if (prompt)
|
|
206
|
+
body.prompt = prompt;
|
|
207
|
+
if (workingDir)
|
|
208
|
+
body.workingDir = workingDir;
|
|
209
|
+
if (name)
|
|
210
|
+
body.name = name;
|
|
211
|
+
if (command)
|
|
212
|
+
body.command = command;
|
|
213
|
+
if (model)
|
|
214
|
+
body.model = model;
|
|
215
|
+
if (parentId)
|
|
216
|
+
body.parentSessionId = parentId;
|
|
217
|
+
else if (useParent)
|
|
218
|
+
body.parentSessionId = true;
|
|
219
|
+
if (createWorkdir)
|
|
220
|
+
body.createMissingWorkingDir = true;
|
|
221
|
+
const caller = process.env.FTOWN_SESSION_ID?.trim();
|
|
222
|
+
const headers = caller ? { 'X-Ftown-Session-Id': caller } : undefined;
|
|
223
|
+
const { data } = await api('POST', '/api/sessions', body, headers);
|
|
224
|
+
console.log(jsonOut ? JSON.stringify(data, null, 2) : formatCreated(data));
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
case 'get': {
|
|
228
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
229
|
+
if (!id)
|
|
230
|
+
throw new Error('Missing session-id');
|
|
231
|
+
const { data } = await api('GET', `/api/sessions/${id}`);
|
|
232
|
+
console.log(JSON.stringify(data, null, 2));
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case 'screen': {
|
|
236
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
237
|
+
if (!id)
|
|
238
|
+
throw new Error('Missing session-id');
|
|
239
|
+
const offset = flag(rest, '--offset') ?? '0';
|
|
240
|
+
const limit = flag(rest, '--limit') ?? '200';
|
|
241
|
+
const { data } = await api('GET', `/api/sessions/${id}/screen?offset=${offset}&limit=${limit}`);
|
|
242
|
+
if (jsonOut) {
|
|
243
|
+
console.log(JSON.stringify(data, null, 2));
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const lines = data.lines ?? [];
|
|
247
|
+
for (const line of lines)
|
|
248
|
+
console.log(line);
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case 'grep': {
|
|
253
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
254
|
+
const pattern = flag(rest, '--pattern');
|
|
255
|
+
if (!id)
|
|
256
|
+
throw new Error('Missing session-id');
|
|
257
|
+
if (!pattern)
|
|
258
|
+
throw new Error('Missing --pattern');
|
|
259
|
+
const offset = parseInt(flag(rest, '--offset') ?? '0', 10);
|
|
260
|
+
const limit = parseInt(flag(rest, '--limit') ?? '100', 10);
|
|
261
|
+
const { data } = await api('POST', `/api/sessions/${id}/grep`, {
|
|
262
|
+
pattern,
|
|
263
|
+
offset,
|
|
264
|
+
limit,
|
|
265
|
+
});
|
|
266
|
+
console.log(JSON.stringify(data, null, 2));
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
case 'keys': {
|
|
270
|
+
const positional = rest.filter((a) => !a.startsWith('--'));
|
|
271
|
+
const id = positional[0];
|
|
272
|
+
const keys = positional.slice(1).join(' ');
|
|
273
|
+
if (!id || !keys)
|
|
274
|
+
throw new Error('Usage: keys <session-id> <text>');
|
|
275
|
+
await api('POST', `/api/sessions/${id}/keys`, { keys });
|
|
276
|
+
console.log(JSON.stringify({ sent: true, sessionId: id }));
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
case 'tell': {
|
|
280
|
+
const useParent = hasFlag(rest, '--parent');
|
|
281
|
+
const useChildren = hasFlag(rest, '--children');
|
|
282
|
+
const useSiblings = hasFlag(rest, '--siblings');
|
|
283
|
+
const useKeys = hasFlag(rest, '--keys');
|
|
284
|
+
const mailType = flag(rest, '--type');
|
|
285
|
+
const threadId = flag(rest, '--thread');
|
|
286
|
+
const fanCount = [useParent, useChildren, useSiblings].filter(Boolean).length;
|
|
287
|
+
if (fanCount > 1) {
|
|
288
|
+
throw new Error('Use only one of --parent, --children, --siblings');
|
|
289
|
+
}
|
|
290
|
+
if (mailType && !MAIL_TYPES.includes(mailType)) {
|
|
291
|
+
throw new Error(`Invalid --type "${mailType}" — use one of: ${MAIL_TYPES.join(', ')}`);
|
|
292
|
+
}
|
|
293
|
+
const positional = positionals(rest, ['--type', '--thread']);
|
|
294
|
+
const self = process.env.FTOWN_SESSION_ID?.trim();
|
|
295
|
+
let targets;
|
|
296
|
+
let message;
|
|
297
|
+
if (fanCount === 1) {
|
|
298
|
+
message = positional.join(' ');
|
|
299
|
+
targets = await resolveFanout(useParent ? 'parent' : useChildren ? 'children' : 'siblings', self);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const target = positional[0];
|
|
303
|
+
message = positional.slice(1).join(' ');
|
|
304
|
+
if (!target) {
|
|
305
|
+
throw new Error('Usage: tell <target|--parent|--children|--siblings> <message...>');
|
|
306
|
+
}
|
|
307
|
+
targets = [target];
|
|
308
|
+
}
|
|
309
|
+
if (!message)
|
|
310
|
+
throw new Error('Missing message');
|
|
311
|
+
if (targets.length === 0)
|
|
312
|
+
throw new Error('No matching target sessions');
|
|
313
|
+
const fromName = self
|
|
314
|
+
? (await listSessionInfo()).find((s) => s.id === self)?.name
|
|
315
|
+
: undefined;
|
|
316
|
+
for (const target of targets) {
|
|
317
|
+
try {
|
|
318
|
+
if (useKeys) {
|
|
319
|
+
// Explicit keystroke injection into the target terminal (legacy path).
|
|
320
|
+
const reqBody = { text: message };
|
|
321
|
+
if (self)
|
|
322
|
+
reqBody.from = self;
|
|
323
|
+
const { data } = await api('POST', `/api/sessions/${target}/message`, reqBody);
|
|
324
|
+
console.log(JSON.stringify({ target, ...data }));
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
const reqBody = { body: message };
|
|
328
|
+
if (self)
|
|
329
|
+
reqBody.from = self;
|
|
330
|
+
if (fromName)
|
|
331
|
+
reqBody.fromName = fromName;
|
|
332
|
+
if (mailType)
|
|
333
|
+
reqBody.type = mailType;
|
|
334
|
+
if (threadId)
|
|
335
|
+
reqBody.threadId = threadId;
|
|
336
|
+
const data = await sendMail(loadPointer(), target, reqBody);
|
|
337
|
+
console.log(JSON.stringify({ target, ...data }));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
342
|
+
console.log(JSON.stringify({ target, error: msg }));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
case 'inbox':
|
|
348
|
+
case 'mail': {
|
|
349
|
+
const self = process.env.FTOWN_SESSION_ID?.trim();
|
|
350
|
+
if (!self)
|
|
351
|
+
throw new Error('inbox requires FTOWN_SESSION_ID to be set');
|
|
352
|
+
const limit = flag(rest, '--limit');
|
|
353
|
+
const messages = await fetchInbox(loadPointer(), self, { peek: hasFlag(rest, '--peek'), all: hasFlag(rest, '--all'), ...(limit ? { limit: Number(limit) } : {}) });
|
|
354
|
+
if (hasFlag(rest, '--json')) {
|
|
355
|
+
console.log(JSON.stringify({ messages }, null, 2));
|
|
356
|
+
}
|
|
357
|
+
else if (messages.length === 0) {
|
|
358
|
+
console.log('(no mail)');
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
for (const m of messages)
|
|
362
|
+
console.log(formatMailMessage(m));
|
|
363
|
+
}
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
case 'running': {
|
|
367
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
368
|
+
if (!id)
|
|
369
|
+
throw new Error('Missing session-id');
|
|
370
|
+
const { data } = await api('GET', `/api/sessions/${id}/running`);
|
|
371
|
+
console.log(JSON.stringify(data, null, 2));
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
case 'usage': {
|
|
375
|
+
const ids = rest.filter((a) => !a.startsWith('--'));
|
|
376
|
+
if (ids.length === 0)
|
|
377
|
+
throw new Error('Missing session-id');
|
|
378
|
+
const rows = await Promise.all(ids.map(fetchUsageRow));
|
|
379
|
+
if (hasFlag(rest, '--json')) {
|
|
380
|
+
console.log(JSON.stringify({ sessions: rows }, null, 2));
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
console.log(formatUsageTable(rows));
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
case 'remove': {
|
|
388
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
389
|
+
if (!id)
|
|
390
|
+
throw new Error('Missing session-id');
|
|
391
|
+
const { data } = await api('DELETE', `/api/sessions/${id}`);
|
|
392
|
+
console.log(jsonOut ? JSON.stringify(data, null, 2) : `removed ${id}`);
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
case 'archive': {
|
|
396
|
+
const { data } = await api('GET', '/api/archive');
|
|
397
|
+
const archived = data.archived ?? [];
|
|
398
|
+
const summary = archived.map((s) => ({
|
|
399
|
+
id: s.id,
|
|
400
|
+
name: s.name,
|
|
401
|
+
removedAt: s.removedAt,
|
|
402
|
+
shellType: s.shellType,
|
|
403
|
+
}));
|
|
404
|
+
console.log(jsonOut
|
|
405
|
+
? JSON.stringify({ archived: summary }, null, 2)
|
|
406
|
+
: summary
|
|
407
|
+
.map((s) => `${s.id} ${s.removedAt} ${s.shellType ?? ''} ${s.name ?? ''}`.trimEnd())
|
|
408
|
+
.join('\n'));
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
case 'revive': {
|
|
412
|
+
const id = rest.find((a) => !a.startsWith('--'));
|
|
413
|
+
if (!id)
|
|
414
|
+
throw new Error('Missing session-id');
|
|
415
|
+
const { data } = await api('POST', `/api/sessions/${id}/revive`);
|
|
416
|
+
console.log(jsonOut ? JSON.stringify(data, null, 2) : formatCreated(data));
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
default:
|
|
420
|
+
usage();
|
|
421
|
+
return 1;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch (err) {
|
|
425
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
426
|
+
console.error(`ftown sessions: ${msg}`);
|
|
427
|
+
return 1;
|
|
428
|
+
}
|
|
429
|
+
return 0;
|
|
430
|
+
}
|
|
431
|
+
function formatSessionList(data) {
|
|
432
|
+
const sessions = data.sessions ?? [];
|
|
433
|
+
return sessions
|
|
434
|
+
.map((s) => `${s.id} ${s.status} ${s.name ?? ''} ${s.workingDir ?? ''}`.trimEnd())
|
|
435
|
+
.join('\n');
|
|
436
|
+
}
|
|
437
|
+
function formatCreated(data) {
|
|
438
|
+
const { session, resumed } = data;
|
|
439
|
+
if (!session)
|
|
440
|
+
return JSON.stringify(data, null, 2);
|
|
441
|
+
// revive responses carry resumed; a fresh conversation lost its context.
|
|
442
|
+
const resumeNote = resumed === undefined ? '' : resumed ? ' [resumed]' : ' [fresh conversation]';
|
|
443
|
+
return `created ${session.id} ${session.name} (${session.status})${resumeNote}`;
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=sessions-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions-commands.js","sourceRoot":"","sources":["../src/sessions-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { migrateLegacyDataDir } from './ftown-home.js';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { retireBundledAutomationAssets, retireBundledAgentAssets, removeFtownSkill } from './install-ftown-skill.js';
|
|
4
|
+
import { readSetupState, writeSetupState } from './setup-state.js';
|
|
5
|
+
export const SETUP_MIGRATIONS = [
|
|
6
|
+
{ id: 'legacy-cwd-data-v1', run: () => migrateLegacyDataDir() },
|
|
7
|
+
{ id: 'retired-factory-loop-assets-v1', run: () => retireBundledAutomationAssets() },
|
|
8
|
+
{ id: 'retired-ticket-workflow-assets-v1', run: () => retireBundledAgentAssets() },
|
|
9
|
+
{ id: 'retired-split-skills-v1', run: () => {
|
|
10
|
+
for (const name of ['ftown-sessions', 'ftown-loops', 'ftown-orchestrator', 'ftown-workflows'])
|
|
11
|
+
removeFtownSkill(name);
|
|
12
|
+
} },
|
|
13
|
+
];
|
|
14
|
+
export function runSetupMigrations(repair = false, migrations = SETUP_MIGRATIONS, home = homedir()) {
|
|
15
|
+
const state = readSetupState(home);
|
|
16
|
+
const completed = new Set(state.completedMigrations);
|
|
17
|
+
const ran = [];
|
|
18
|
+
for (const migration of migrations) {
|
|
19
|
+
if (!repair && completed.has(migration.id))
|
|
20
|
+
continue;
|
|
21
|
+
migration.run(); // A failed migration is deliberately not recorded.
|
|
22
|
+
completed.add(migration.id);
|
|
23
|
+
writeSetupState({ ...state, completedMigrations: [...completed] }, home);
|
|
24
|
+
ran.push(migration.id);
|
|
25
|
+
}
|
|
26
|
+
return ran;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=setup-migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-migrations.js","sourceRoot":"","sources":["../src/setup-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,6BAA6B,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnE,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,EAAE,EAAE,EAAE,oBAAoB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE,EAAE;IAC/D,EAAE,EAAE,EAAE,gCAAgC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,6BAA6B,EAAE,EAAE;IACpF,EAAE,EAAE,EAAE,mCAAmC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,wBAAwB,EAAE,EAAE;IAClF,EAAE,EAAE,EAAE,yBAAyB,EAAE,GAAG,EAAE,GAAG,EAAE;YACzC,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,aAAa,EAAE,oBAAoB,EAAE,iBAAiB,CAAC;gBAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxH,CAAC,EAAE;CACJ,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAM,GAAG,KAAK,EAAE,aAAwC,gBAAgB,EAAE,IAAI,GAAG,OAAO,EAAE;IAC3H,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACrD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAAE,SAAS;QACrD,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,mDAAmD;QACpE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface SetupState {
|
|
2
|
+
schema: 1;
|
|
3
|
+
packageVersion?: string;
|
|
4
|
+
completedMigrations: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function setupStatePath(home?: string): string;
|
|
7
|
+
export declare function readSetupState(home?: string): SetupState;
|
|
8
|
+
export declare function writeSetupState(state: SetupState, home?: string): void;
|
|
9
|
+
export declare function setupHint(version: string): string;
|
|
10
|
+
export declare function assertSetupReady(version: string, home?: string): void;
|
|
11
|
+
/** Existence/type inventory; startup never repairs or hashes global integrations. */
|
|
12
|
+
export declare const REQUIRED_SETUP_ASSETS: readonly string[];
|
|
13
|
+
/** Reject stale npm-cache setup rather than overwrite a newer installed runtime. */
|
|
14
|
+
export declare function assertSetupVersion(version: string, installed: string | undefined): void;
|
|
15
|
+
/** Atomic nonempty-directory lock. Reclaim only an exact provably dead owner. */
|
|
16
|
+
export declare function acquireSetupLock(home?: string): () => void;
|