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.
Files changed (116) hide show
  1. package/dist/cli-client.d.ts +17 -0
  2. package/dist/cli-client.js +76 -0
  3. package/dist/cli-client.js.map +1 -0
  4. package/dist/cli-entry.d.ts +2 -0
  5. package/dist/cli-entry.js +22 -0
  6. package/dist/cli-entry.js.map +1 -0
  7. package/dist/codex-installer.d.ts +1 -1
  8. package/dist/codex-installer.js +7 -6
  9. package/dist/codex-installer.js.map +1 -1
  10. package/dist/command-rpc.js +0 -1
  11. package/dist/command-rpc.js.map +1 -1
  12. package/dist/create-ftown-session.d.ts +1 -6
  13. package/dist/create-ftown-session.js +3 -25
  14. package/dist/create-ftown-session.js.map +1 -1
  15. package/dist/cursor-hook-installer.d.ts +1 -1
  16. package/dist/cursor-hook-installer.js +6 -5
  17. package/dist/cursor-hook-installer.js.map +1 -1
  18. package/dist/ensure-ftown-path.js +1 -1
  19. package/dist/env-commands.d.ts +32 -0
  20. package/dist/env-commands.js +162 -0
  21. package/dist/env-commands.js.map +1 -0
  22. package/dist/ftown-cli.d.ts +2 -6
  23. package/dist/ftown-cli.js +25 -79
  24. package/dist/ftown-cli.js.map +1 -1
  25. package/dist/ftown-env-cli.d.ts +2 -31
  26. package/dist/ftown-env-cli.js +7 -176
  27. package/dist/ftown-env-cli.js.map +1 -1
  28. package/dist/ftown-home.d.ts +24 -10
  29. package/dist/ftown-home.js +19 -41
  30. package/dist/ftown-home.js.map +1 -1
  31. package/dist/ftown-sessions-cli.d.ts +1 -1
  32. package/dist/ftown-sessions-cli.js +6 -499
  33. package/dist/ftown-sessions-cli.js.map +1 -1
  34. package/dist/harness-cli.d.ts +1 -1
  35. package/dist/harness-cli.js +6 -626
  36. package/dist/harness-cli.js.map +1 -1
  37. package/dist/harness-commands.d.ts +2 -0
  38. package/dist/harness-commands.js +576 -0
  39. package/dist/harness-commands.js.map +1 -0
  40. package/dist/harness-installer.d.ts +1 -10
  41. package/dist/harness-installer.js +13 -166
  42. package/dist/harness-installer.js.map +1 -1
  43. package/dist/harness-registry.d.ts +1 -27
  44. package/dist/harness-registry.js +1 -20
  45. package/dist/harness-registry.js.map +1 -1
  46. package/dist/hook-installer.d.ts +1 -1
  47. package/dist/hook-installer.js +5 -4
  48. package/dist/hook-installer.js.map +1 -1
  49. package/dist/index.js +10 -108
  50. package/dist/index.js.map +1 -1
  51. package/dist/install-ftown-command-cli.d.ts +3 -3
  52. package/dist/install-ftown-command-cli.js +67 -22
  53. package/dist/install-ftown-command-cli.js.map +1 -1
  54. package/dist/install-ftown-skill.d.ts +6 -0
  55. package/dist/install-ftown-skill.js +111 -10
  56. package/dist/install-ftown-skill.js.map +1 -1
  57. package/dist/install-notify-script.d.ts +1 -1
  58. package/dist/install-notify-script.js +7 -6
  59. package/dist/install-notify-script.js.map +1 -1
  60. package/dist/mail-delivery.d.ts +1 -1
  61. package/dist/mail-delivery.js +3 -5
  62. package/dist/mail-delivery.js.map +1 -1
  63. package/dist/mcp/server.js +1 -1
  64. package/dist/mcp/server.js.map +1 -1
  65. package/dist/muse-plugin-installer.js +4 -0
  66. package/dist/muse-plugin-installer.js.map +1 -1
  67. package/dist/opencode-plugin-installer.d.ts +1 -2
  68. package/dist/opencode-plugin-installer.js +1 -2
  69. package/dist/opencode-plugin-installer.js.map +1 -1
  70. package/dist/provider-env-store.js +1 -1
  71. package/dist/provider-env-store.js.map +1 -1
  72. package/dist/retired-skill-assets.d.ts +3 -0
  73. package/dist/retired-skill-assets.js +11 -0
  74. package/dist/retired-skill-assets.js.map +1 -1
  75. package/dist/sessions-commands.d.ts +2 -0
  76. package/dist/sessions-commands.js +445 -0
  77. package/dist/sessions-commands.js.map +1 -0
  78. package/dist/setup-migrations.d.ts +6 -0
  79. package/dist/setup-migrations.js +28 -0
  80. package/dist/setup-migrations.js.map +1 -0
  81. package/dist/setup-state.d.ts +16 -0
  82. package/dist/setup-state.js +163 -0
  83. package/dist/setup-state.js.map +1 -0
  84. package/dist/setup.d.ts +25 -0
  85. package/dist/setup.js +120 -0
  86. package/dist/setup.js.map +1 -0
  87. package/dist/types.d.ts +1 -0
  88. package/dist/wire-types.js +1 -8
  89. package/dist/wire-types.js.map +1 -1
  90. package/package.json +2 -3
  91. package/pi-extension/API.md +4 -0
  92. package/pi-extension/ftown.js +1 -2
  93. package/skills/ftown/SKILL.md +71 -19
  94. package/skills/ftown/references/orchestrator.md +23 -99
  95. package/skills/ftown/references/sessions.md +37 -42
  96. package/dist/claude-trust.d.ts +0 -11
  97. package/dist/claude-trust.js +0 -47
  98. package/dist/claude-trust.js.map +0 -1
  99. package/dist/install-ftown-cli.d.ts +0 -3
  100. package/dist/install-ftown-cli.js +0 -29
  101. package/dist/install-ftown-cli.js.map +0 -1
  102. package/dist/install-ftown-env-cli.d.ts +0 -3
  103. package/dist/install-ftown-env-cli.js +0 -30
  104. package/dist/install-ftown-env-cli.js.map +0 -1
  105. package/dist/install-ftown-workflows-cli.d.ts +0 -3
  106. package/dist/install-ftown-workflows-cli.js +0 -33
  107. package/dist/install-ftown-workflows-cli.js.map +0 -1
  108. package/dist/workflow-runner-cli.d.ts +0 -2
  109. package/dist/workflow-runner-cli.js +0 -376
  110. package/dist/workflow-runner-cli.js.map +0 -1
  111. package/dist/workflow-runner.d.ts +0 -163
  112. package/dist/workflow-runner.js +0 -307
  113. package/dist/workflow-runner.js.map +0 -1
  114. package/skills/fticket/SKILL.md +0 -166
  115. package/skills/ftown/references/workflows.md +0 -470
  116. package/skills/ftown/scripts/example.flow.mjs +0 -170
@@ -1,27 +1,19 @@
1
- import { existsSync, mkdirSync, renameSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, renameSync, lstatSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { dirname, join, resolve } from 'node:path';
4
- /**
5
- * Default data dir is ~/.ftown/data (machine-stable, like the rest of ~/.ftown).
6
- * Older bridges defaulted to ./data relative to the launch cwd — if that legacy
7
- * dir holds sessions and the new default does not exist yet, migrate it once so
8
- * an upgraded bridge still resurrects its sessions.
9
- */
10
- export function resolveDefaultDataDir() {
11
- const defaultDir = join(homedir(), '.ftown', 'data');
12
- const legacyDir = resolve('./data');
13
- if (!existsSync(defaultDir) && existsSync(join(legacyDir, 'sessions'))) {
14
- try {
15
- mkdirSync(dirname(defaultDir), { recursive: true });
16
- renameSync(legacyDir, defaultDir);
17
- console.log(`[Bridge] Migrated legacy data dir ${legacyDir} -> ${defaultDir}`);
18
- }
19
- catch (err) {
20
- console.error(`[Bridge] Failed to migrate legacy data dir (${err instanceof Error ? err.message : String(err)}); using ${legacyDir}`);
21
- return legacyDir;
22
- }
23
- }
24
- return defaultDir;
4
+ /** Resolve the default without migrating data or touching global state. */
5
+ export function resolveDefaultDataDir() { return join(homedir(), '.ftown', 'data'); }
6
+ /** Explicit setup-only migration of the historical cwd-relative data directory. */
7
+ export function migrateLegacyDataDir() {
8
+ const destination = resolveDefaultDataDir();
9
+ const legacy = resolve('./data');
10
+ if (existsSync(destination) || !existsSync(join(legacy, 'sessions')))
11
+ return;
12
+ if (lstatSync(legacy).isSymbolicLink() || lstatSync(join(legacy, 'sessions')).isSymbolicLink())
13
+ return;
14
+ mkdirSync(dirname(destination), { recursive: true });
15
+ renameSync(legacy, destination);
16
+ console.log(`[Setup] Migrated legacy data dir ${legacy} -> ${destination}`);
25
17
  }
26
18
  /**
27
19
  * Resolve the ".ftown home" — the directory that holds THIS bridge instance's
@@ -30,7 +22,7 @@ export function resolveDefaultDataDir() {
30
22
  *
31
23
  * Why this indirection exists:
32
24
  * - The DEFAULT install keeps $HOME/.ftown. The harness CLIs
33
- * (harness-cli.ts / ftown-sessions-cli.ts / workflow-runner-cli.ts, and their
25
+ * (harness-cli.ts / ftown-sessions-cli.ts, and their
34
26
  * deployed sibling copies) hardcode `join(homedir(), '.ftown', 'bridge.json')`
35
27
  * to find the primary bridge, so the default MUST stay byte-for-byte at
36
28
  * $HOME/.ftown or those CLIs break.
@@ -42,28 +34,14 @@ export function resolveDefaultDataDir() {
42
34
  * Semantics: if `dataDir` resolves to the default data dir, return
43
35
  * `$HOME/.ftown`; otherwise the custom data dir is its own instance home.
44
36
  *
45
- * `defaultDataDir` lets a caller pass the default it ALREADY resolved (index.ts
46
- * computes it once for both `dataDir` and this call) so
47
- * `resolveDefaultDataDir()`'s one-time legacy `./data` migration side effect is
48
- * never re-triggered. When omitted (standalone callers, tests) the default is
49
- * computed once and memoized, so a repeated call cannot re-run the migration —
50
- * where a first-fail-then-succeed sequence could otherwise misroute the home to
51
- * `./data`. This function performs no fs writes of its own beyond that shared,
52
- * idempotent migration.
37
+ * `defaultDataDir` can pass the already-resolved default. Resolution is read-only.
53
38
  */
54
- let memoizedDefaultDataDir;
55
39
  export function resolveFtownHome(dataDir, defaultDataDir) {
56
- const def = defaultDataDir ?? (memoizedDefaultDataDir ??= resolveDefaultDataDir());
40
+ const def = defaultDataDir ?? resolveDefaultDataDir();
57
41
  if (resolve(dataDir) === resolve(def))
58
42
  return join(homedir(), '.ftown');
59
43
  return resolve(dataDir);
60
44
  }
61
- /**
62
- * Test-only: clear the memoized default data dir so a $HOME override in a later
63
- * test is honored instead of a value cached from an earlier one. Never call this
64
- * in production — index.ts always passes an explicit `defaultDataDir`.
65
- */
66
- export function resetFtownHomeForTests() {
67
- memoizedDefaultDataDir = undefined;
68
- }
45
+ /** Compatibility helper for tests; default resolution no longer caches HOME. */
46
+ export function resetFtownHomeForTests() { }
69
47
  //# sourceMappingURL=ftown-home.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ftown-home.js","sourceRoot":"","sources":["../src/ftown-home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,OAAO,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,+CAA+C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,SAAS,EAAE,CACvH,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,IAAI,sBAA0C,CAAC;AAE/C,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,cAAuB;IACvE,MAAM,GAAG,GAAG,cAAc,IAAI,CAAC,sBAAsB,KAAK,qBAAqB,EAAE,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB;IACpC,sBAAsB,GAAG,SAAS,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"ftown-home.js","sourceRoot":"","sources":["../src/ftown-home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,KAAa,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAE7F,mFAAmF;AACnF,MAAM,UAAU,oBAAoB;IAClC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO;IAC7E,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,EAAE;QAAE,OAAO;IACvG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,OAAO,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,cAAuB;IACvE,MAAM,GAAG,GAAG,cAAc,IAAI,qBAAqB,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,KAAU,CAAC"}
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export { isCliEntry } from './cli-entry.js';
@@ -1,502 +1,9 @@
1
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 { readFileSync } from 'node:fs';
7
- import { homedir } from 'node:os';
8
- import { join } from 'node:path';
9
- import { MAIL_TYPES, AUTOMATION_REMOVED_MESSAGE, formatMailMessage, } from './wire-types.js';
10
- function loadBridge() {
11
- const path = join(homedir(), '.ftown', 'bridge.json');
12
- const raw = readFileSync(path, 'utf8');
13
- const data = JSON.parse(raw);
14
- if (!data.port || !data.token) {
15
- throw new Error('Invalid bridge.json (missing port or token)');
16
- }
17
- return data;
2
+ // Compatibility entrypoint; canonical dispatch and implementation are shared.
3
+ import { runFtown } from './ftown-cli.js';
4
+ import { executeCli, isCliEntry } from './cli-entry.js';
5
+ export { isCliEntry } from './cli-entry.js';
6
+ if (isCliEntry(import.meta.url, process.argv[1])) {
7
+ void executeCli(() => runFtown(['sessions', ...process.argv.slice(2)]));
18
8
  }
19
- async function api(method, path, body, extraHeaders) {
20
- const { port, token } = loadBridge();
21
- const headers = {
22
- Authorization: `Bearer ${token}`,
23
- ...extraHeaders,
24
- };
25
- let payload;
26
- if (body !== undefined) {
27
- headers['Content-Type'] = 'application/json';
28
- payload = JSON.stringify(body);
29
- }
30
- const res = await fetch(`http://127.0.0.1:${port}${path}`, {
31
- method,
32
- headers,
33
- body: payload,
34
- });
35
- const text = await res.text();
36
- let data = null;
37
- if (text) {
38
- try {
39
- data = JSON.parse(text);
40
- }
41
- catch {
42
- data = { raw: text };
43
- }
44
- }
45
- if (!res.ok) {
46
- const err = data;
47
- throw new Error(err?.error ?? `HTTP ${res.status}`);
48
- }
49
- return { status: res.status, data };
50
- }
51
- async function listSessionInfo() {
52
- const { data } = await api('GET', '/api/sessions');
53
- return data.sessions ?? [];
54
- }
55
- async function resolveFanout(mode, self) {
56
- if (!self) {
57
- throw new Error(`--${mode} requires FTOWN_SESSION_ID to be set`);
58
- }
59
- const sessions = await listSessionInfo();
60
- const me = sessions.find((s) => s.id === self);
61
- if (mode === 'parent') {
62
- const parent = me?.parentSessionId;
63
- if (!parent)
64
- throw new Error('Current session has no parent');
65
- return [parent];
66
- }
67
- if (mode === 'children') {
68
- return sessions.filter((s) => s.parentSessionId === self).map((s) => s.id);
69
- }
70
- // siblings
71
- const parent = me?.parentSessionId;
72
- if (!parent)
73
- throw new Error('Current session has no parent (cannot resolve siblings)');
74
- return sessions
75
- .filter((s) => s.parentSessionId === parent && s.id !== self)
76
- .map((s) => s.id);
77
- }
78
- function flag(args, name) {
79
- const i = args.indexOf(name);
80
- if (i === -1 || i + 1 >= args.length)
81
- return undefined;
82
- return args[i + 1];
83
- }
84
- function hasFlag(args, name) {
85
- return args.includes(name);
86
- }
87
- /** Positional args, skipping flags and the values of value-taking flags. */
88
- function positionals(args, valueFlags) {
89
- const out = [];
90
- for (let i = 0; i < args.length; i++) {
91
- const a = args[i];
92
- if (a.startsWith('--')) {
93
- if (valueFlags.includes(a))
94
- i++;
95
- continue;
96
- }
97
- out.push(a);
98
- }
99
- return out;
100
- }
101
- async function fetchUsageRow(id) {
102
- const [{ data: usageData }, sessionData] = await Promise.all([
103
- api('GET', `/api/sessions/${id}/usage`),
104
- api('GET', `/api/sessions/${id}`).then((r) => r.data, () => null),
105
- ]);
106
- const session = sessionData?.session;
107
- return {
108
- id,
109
- name: session?.name ?? '',
110
- usage: usageData.usage ?? null,
111
- };
112
- }
113
- function formatUsageTable(rows) {
114
- const header = ['id', 'name', 'model(s)', 'in', 'out', 'cacheR', 'cacheW', 'total'];
115
- const body = [];
116
- for (const r of rows) {
117
- const u = r.usage;
118
- body.push([
119
- r.id.slice(0, 8),
120
- r.name,
121
- u ? u.models.join(',') : '-',
122
- u ? String(u.inputTokens) : '-',
123
- u ? String(u.outputTokens) : '-',
124
- u ? String(u.cacheReadTokens) : '-',
125
- u ? String(u.cacheWriteTokens) : '-',
126
- u ? String(u.totalTokens) : '-',
127
- ]);
128
- // Multi-model sessions get an indented per-model sub-row each.
129
- if (u?.perModel && u.perModel.length > 1) {
130
- for (const m of u.perModel) {
131
- body.push([
132
- '',
133
- '',
134
- ` ${m.model}`,
135
- String(m.inputTokens),
136
- String(m.outputTokens),
137
- String(m.cacheReadTokens),
138
- String(m.cacheWriteTokens),
139
- String(m.inputTokens + m.outputTokens + m.cacheReadTokens + m.cacheWriteTokens),
140
- ]);
141
- }
142
- }
143
- }
144
- const collected = rows.map((r) => r.usage).filter((u) => u !== null);
145
- const sum = (pick) => collected.reduce((acc, u) => acc + pick(u), 0);
146
- body.push([
147
- 'TOTAL',
148
- '',
149
- '',
150
- String(sum((u) => u.inputTokens)),
151
- String(sum((u) => u.outputTokens)),
152
- String(sum((u) => u.cacheReadTokens)),
153
- String(sum((u) => u.cacheWriteTokens)),
154
- String(sum((u) => u.totalTokens)),
155
- ]);
156
- const widths = header.map((h, i) => Math.max(h.length, ...body.map((row) => row[i].length)));
157
- const render = (row) => row.map((cell, i) => cell.padEnd(widths[i])).join(' ').trimEnd();
158
- return [render(header), ...body.map(render)].join('\n');
159
- }
160
- function usage() {
161
- console.error(`Usage: ftown-sessions <command> [options]
162
-
163
- Commands:
164
- list List sessions
165
- create [options] Spawn a new agent session
166
- get <session-id> Session metadata
167
- screen <session-id> Print terminal lines
168
- grep <session-id> Search terminal output
169
- keys <session-id> <text> Send keys to a running session
170
- tell <target> <message...> Send mail to another session's inbox
171
- inbox | mail Read own inbox (requires FTOWN_SESSION_ID)
172
- running <session-id> Check if session PTY is running
173
- usage <session-id...> Model/token usage per session (--json for raw)
174
- remove <session-id> Stop and remove a session (archived as a tombstone)
175
- archive List archived (removed) sessions
176
- revive <session-id> Recreate a removed session from its tombstone
177
-
178
- Tell targets (one of):
179
- <session-id> Explicit target session id
180
- --parent Message FTOWN_SESSION_ID's parent session
181
- --children Message all sessions parented to FTOWN_SESSION_ID
182
- --siblings Message sessions sharing my parent (excluding me)
183
-
184
- Tell options:
185
- --type <t> message | task | result | escalation (default: message)
186
- --thread <id> Thread id for grouping replies
187
- --keys Inject as terminal keystrokes instead of mail (last resort)
188
-
189
- Inbox options:
190
- --peek Do not mark messages as delivered
191
- --limit <n> Max messages
192
- --all Include already-delivered messages
193
- --json Raw JSON output
194
-
195
- Create options:
196
- --shell <type> Harness override; omitted inherits the current session (otherwise claude)
197
- --prompt <text> Initial message
198
- --workdir <path> Working directory
199
- --create-workdir Create --workdir if it does not exist
200
- --name <label> Dashboard name
201
- --command <cmd> Full command override
202
- --parent Link parent to FTOWN_SESSION_ID or X-Ftown-Session-Id
203
- --parent-id <uuid> Explicit parent session id
204
- --orchestrator Brief the new agent to spawn and coordinate sibling sessions
205
- --model <name> Model (cursor, codex)
206
- --json Output raw JSON (default for most commands)
207
-
208
- Screen/grep options:
209
- --offset <n> Pagination offset (default: 0)
210
- --limit <n> Max lines/matches (default: 200)
211
-
212
- Grep options:
213
- --pattern <regex> Required for grep
214
-
215
- Reads ~/.ftown/bridge.json (ftown-bridge must be running).`);
216
- }
217
- async function main() {
218
- const argv = process.argv.slice(2);
219
- if (['loop', 'loops', 'loop-list'].includes(argv[0])) {
220
- console.error(`ftown-sessions: ${AUTOMATION_REMOVED_MESSAGE}`);
221
- process.exit(1);
222
- }
223
- if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
224
- usage();
225
- process.exit(argv.length === 0 ? 1 : 0);
226
- }
227
- const cmd = argv[0];
228
- const rest = argv.slice(1);
229
- const jsonOut = !hasFlag(rest, '--plain');
230
- try {
231
- switch (cmd) {
232
- case 'list': {
233
- const { data } = await api('GET', '/api/sessions');
234
- console.log(jsonOut ? JSON.stringify(data, null, 2) : formatSessionList(data));
235
- break;
236
- }
237
- case 'create': {
238
- const shellType = flag(rest, '--shell');
239
- const prompt = flag(rest, '--prompt');
240
- const workingDir = flag(rest, '--workdir');
241
- const name = flag(rest, '--name');
242
- const command = flag(rest, '--command');
243
- const model = flag(rest, '--model');
244
- const parentId = flag(rest, '--parent-id');
245
- const useParent = hasFlag(rest, '--parent');
246
- const orchestrator = hasFlag(rest, '--orchestrator');
247
- const createWorkdir = hasFlag(rest, '--create-workdir');
248
- const body = {};
249
- if (shellType)
250
- body.shellType = shellType;
251
- if (prompt)
252
- body.prompt = prompt;
253
- if (workingDir)
254
- body.workingDir = workingDir;
255
- if (name)
256
- body.name = name;
257
- if (command)
258
- body.command = command;
259
- if (model)
260
- body.model = model;
261
- if (parentId)
262
- body.parentSessionId = parentId;
263
- else if (useParent)
264
- body.parentSessionId = true;
265
- if (orchestrator)
266
- body.orchestrator = true;
267
- if (createWorkdir)
268
- body.createMissingWorkingDir = true;
269
- const caller = process.env.FTOWN_SESSION_ID?.trim();
270
- const headers = caller ? { 'X-Ftown-Session-Id': caller } : undefined;
271
- const { data } = await api('POST', '/api/sessions', body, headers);
272
- console.log(jsonOut ? JSON.stringify(data, null, 2) : formatCreated(data));
273
- break;
274
- }
275
- case 'get': {
276
- const id = rest.find((a) => !a.startsWith('--'));
277
- if (!id)
278
- throw new Error('Missing session-id');
279
- const { data } = await api('GET', `/api/sessions/${id}`);
280
- console.log(JSON.stringify(data, null, 2));
281
- break;
282
- }
283
- case 'screen': {
284
- const id = rest.find((a) => !a.startsWith('--'));
285
- if (!id)
286
- throw new Error('Missing session-id');
287
- const offset = flag(rest, '--offset') ?? '0';
288
- const limit = flag(rest, '--limit') ?? '200';
289
- const { data } = await api('GET', `/api/sessions/${id}/screen?offset=${offset}&limit=${limit}`);
290
- if (jsonOut) {
291
- console.log(JSON.stringify(data, null, 2));
292
- }
293
- else {
294
- const lines = data.lines ?? [];
295
- for (const line of lines)
296
- console.log(line);
297
- }
298
- break;
299
- }
300
- case 'grep': {
301
- const id = rest.find((a) => !a.startsWith('--'));
302
- const pattern = flag(rest, '--pattern');
303
- if (!id)
304
- throw new Error('Missing session-id');
305
- if (!pattern)
306
- throw new Error('Missing --pattern');
307
- const offset = parseInt(flag(rest, '--offset') ?? '0', 10);
308
- const limit = parseInt(flag(rest, '--limit') ?? '100', 10);
309
- const { data } = await api('POST', `/api/sessions/${id}/grep`, {
310
- pattern,
311
- offset,
312
- limit,
313
- });
314
- console.log(JSON.stringify(data, null, 2));
315
- break;
316
- }
317
- case 'keys': {
318
- const positional = rest.filter((a) => !a.startsWith('--'));
319
- const id = positional[0];
320
- const keys = positional.slice(1).join(' ');
321
- if (!id || !keys)
322
- throw new Error('Usage: keys <session-id> <text>');
323
- await api('POST', `/api/sessions/${id}/keys`, { keys });
324
- console.log(JSON.stringify({ sent: true, sessionId: id }));
325
- break;
326
- }
327
- case 'tell': {
328
- const useParent = hasFlag(rest, '--parent');
329
- const useChildren = hasFlag(rest, '--children');
330
- const useSiblings = hasFlag(rest, '--siblings');
331
- const useKeys = hasFlag(rest, '--keys');
332
- const mailType = flag(rest, '--type');
333
- const threadId = flag(rest, '--thread');
334
- const fanCount = [useParent, useChildren, useSiblings].filter(Boolean).length;
335
- if (fanCount > 1) {
336
- throw new Error('Use only one of --parent, --children, --siblings');
337
- }
338
- if (mailType && !MAIL_TYPES.includes(mailType)) {
339
- throw new Error(`Invalid --type "${mailType}" — use one of: ${MAIL_TYPES.join(', ')}`);
340
- }
341
- const positional = positionals(rest, ['--type', '--thread']);
342
- const self = process.env.FTOWN_SESSION_ID?.trim();
343
- let targets;
344
- let message;
345
- if (fanCount === 1) {
346
- message = positional.join(' ');
347
- targets = await resolveFanout(useParent ? 'parent' : useChildren ? 'children' : 'siblings', self);
348
- }
349
- else {
350
- const target = positional[0];
351
- message = positional.slice(1).join(' ');
352
- if (!target) {
353
- throw new Error('Usage: tell <target|--parent|--children|--siblings> <message...>');
354
- }
355
- targets = [target];
356
- }
357
- if (!message)
358
- throw new Error('Missing message');
359
- if (targets.length === 0)
360
- throw new Error('No matching target sessions');
361
- const fromName = self
362
- ? (await listSessionInfo()).find((s) => s.id === self)?.name
363
- : undefined;
364
- for (const target of targets) {
365
- try {
366
- if (useKeys) {
367
- // Explicit keystroke injection into the target terminal (legacy path).
368
- const reqBody = { text: message };
369
- if (self)
370
- reqBody.from = self;
371
- const { data } = await api('POST', `/api/sessions/${target}/message`, reqBody);
372
- console.log(JSON.stringify({ target, ...data }));
373
- }
374
- else {
375
- const reqBody = { body: message };
376
- if (self)
377
- reqBody.from = self;
378
- if (fromName)
379
- reqBody.fromName = fromName;
380
- if (mailType)
381
- reqBody.type = mailType;
382
- if (threadId)
383
- reqBody.threadId = threadId;
384
- const { data } = await api('POST', `/api/sessions/${target}/inbox`, reqBody);
385
- console.log(JSON.stringify({ target, ...data }));
386
- }
387
- }
388
- catch (err) {
389
- const msg = err instanceof Error ? err.message : String(err);
390
- console.log(JSON.stringify({ target, error: msg }));
391
- }
392
- }
393
- break;
394
- }
395
- case 'inbox':
396
- case 'mail': {
397
- const self = process.env.FTOWN_SESSION_ID?.trim();
398
- if (!self)
399
- throw new Error('inbox requires FTOWN_SESSION_ID to be set');
400
- const params = new URLSearchParams();
401
- params.set('wait', '0');
402
- if (hasFlag(rest, '--peek'))
403
- params.set('peek', '1');
404
- if (hasFlag(rest, '--all'))
405
- params.set('all', '1');
406
- const limit = flag(rest, '--limit');
407
- if (limit)
408
- params.set('limit', limit);
409
- const { data } = await api('GET', `/api/sessions/${self}/inbox?${params.toString()}`);
410
- const messages = data.messages ?? [];
411
- if (hasFlag(rest, '--json')) {
412
- console.log(JSON.stringify({ messages }, null, 2));
413
- }
414
- else if (messages.length === 0) {
415
- console.log('(no mail)');
416
- }
417
- else {
418
- for (const m of messages)
419
- console.log(formatMailMessage(m));
420
- }
421
- break;
422
- }
423
- case 'running': {
424
- const id = rest.find((a) => !a.startsWith('--'));
425
- if (!id)
426
- throw new Error('Missing session-id');
427
- const { data } = await api('GET', `/api/sessions/${id}/running`);
428
- console.log(JSON.stringify(data, null, 2));
429
- break;
430
- }
431
- case 'usage': {
432
- const ids = rest.filter((a) => !a.startsWith('--'));
433
- if (ids.length === 0)
434
- throw new Error('Missing session-id');
435
- const rows = await Promise.all(ids.map(fetchUsageRow));
436
- if (hasFlag(rest, '--json')) {
437
- console.log(JSON.stringify({ sessions: rows }, null, 2));
438
- }
439
- else {
440
- console.log(formatUsageTable(rows));
441
- }
442
- break;
443
- }
444
- case 'remove': {
445
- const id = rest.find((a) => !a.startsWith('--'));
446
- if (!id)
447
- throw new Error('Missing session-id');
448
- const { data } = await api('DELETE', `/api/sessions/${id}`);
449
- console.log(jsonOut ? JSON.stringify(data, null, 2) : `removed ${id}`);
450
- break;
451
- }
452
- case 'archive': {
453
- const { data } = await api('GET', '/api/archive');
454
- const archived = data.archived ?? [];
455
- const summary = archived.map((s) => ({
456
- id: s.id,
457
- name: s.name,
458
- removedAt: s.removedAt,
459
- shellType: s.shellType,
460
- }));
461
- console.log(jsonOut
462
- ? JSON.stringify({ archived: summary }, null, 2)
463
- : summary
464
- .map((s) => `${s.id} ${s.removedAt} ${s.shellType ?? ''} ${s.name ?? ''}`.trimEnd())
465
- .join('\n'));
466
- break;
467
- }
468
- case 'revive': {
469
- const id = rest.find((a) => !a.startsWith('--'));
470
- if (!id)
471
- throw new Error('Missing session-id');
472
- const { data } = await api('POST', `/api/sessions/${id}/revive`);
473
- console.log(jsonOut ? JSON.stringify(data, null, 2) : formatCreated(data));
474
- break;
475
- }
476
- default:
477
- usage();
478
- process.exit(1);
479
- }
480
- }
481
- catch (err) {
482
- const msg = err instanceof Error ? err.message : String(err);
483
- console.error(`ftown-sessions: ${msg}`);
484
- process.exit(1);
485
- }
486
- }
487
- function formatSessionList(data) {
488
- const sessions = data.sessions ?? [];
489
- return sessions
490
- .map((s) => `${s.id} ${s.status} ${s.name ?? ''} ${s.workingDir ?? ''}`.trimEnd())
491
- .join('\n');
492
- }
493
- function formatCreated(data) {
494
- const { session, resumed } = data;
495
- if (!session)
496
- return JSON.stringify(data, null, 2);
497
- // revive responses carry resumed; a fresh conversation lost its context.
498
- const resumeNote = resumed === undefined ? '' : resumed ? ' [resumed]' : ' [fresh conversation]';
499
- return `created ${session.id} ${session.name} (${session.status})${resumeNote}`;
500
- }
501
- main();
502
9
  //# sourceMappingURL=ftown-sessions-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ftown-sessions-cli.js","sourceRoot":"","sources":["../src/ftown-sessions-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ftown-sessions-cli.js","sourceRoot":"","sources":["../src/ftown-sessions-cli.ts"],"names":[],"mappings":";AACA,8EAA8E;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export { isCliEntry } from './cli-entry.js';