@tpsdev-ai/cli 0.2.0 → 0.3.1

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 (228) hide show
  1. package/README.md +65 -0
  2. package/bin/tps.cjs +24 -0
  3. package/bin/tps.ts +435 -0
  4. package/package.json +29 -5
  5. package/dist/bin/tps.d.ts +0 -3
  6. package/dist/bin/tps.d.ts.map +0 -1
  7. package/dist/bin/tps.js +0 -414
  8. package/dist/bin/tps.js.map +0 -1
  9. package/dist/src/cli/hire.d.ts +0 -16
  10. package/dist/src/cli/hire.d.ts.map +0 -1
  11. package/dist/src/cli/hire.js +0 -176
  12. package/dist/src/cli/hire.js.map +0 -1
  13. package/dist/src/cli/office.d.ts +0 -7
  14. package/dist/src/cli/office.d.ts.map +0 -1
  15. package/dist/src/cli/office.js +0 -51
  16. package/dist/src/cli/office.js.map +0 -1
  17. package/dist/src/cli/review.d.ts +0 -9
  18. package/dist/src/cli/review.d.ts.map +0 -1
  19. package/dist/src/cli/review.js +0 -109
  20. package/dist/src/cli/review.js.map +0 -1
  21. package/dist/src/cli/roster.d.ts +0 -6
  22. package/dist/src/cli/roster.d.ts.map +0 -1
  23. package/dist/src/cli/roster.js +0 -60
  24. package/dist/src/cli/roster.js.map +0 -1
  25. package/dist/src/commands/backup.d.ts +0 -19
  26. package/dist/src/commands/backup.d.ts.map +0 -1
  27. package/dist/src/commands/backup.js +0 -595
  28. package/dist/src/commands/backup.js.map +0 -1
  29. package/dist/src/commands/bootstrap.d.ts +0 -7
  30. package/dist/src/commands/bootstrap.d.ts.map +0 -1
  31. package/dist/src/commands/bootstrap.js +0 -255
  32. package/dist/src/commands/bootstrap.js.map +0 -1
  33. package/dist/src/commands/branch.d.ts +0 -14
  34. package/dist/src/commands/branch.d.ts.map +0 -1
  35. package/dist/src/commands/branch.js +0 -395
  36. package/dist/src/commands/branch.js.map +0 -1
  37. package/dist/src/commands/context.d.ts +0 -9
  38. package/dist/src/commands/context.d.ts.map +0 -1
  39. package/dist/src/commands/context.js +0 -57
  40. package/dist/src/commands/context.js.map +0 -1
  41. package/dist/src/commands/git.d.ts +0 -8
  42. package/dist/src/commands/git.d.ts.map +0 -1
  43. package/dist/src/commands/git.js +0 -53
  44. package/dist/src/commands/git.js.map +0 -1
  45. package/dist/src/commands/identity.d.ts +0 -13
  46. package/dist/src/commands/identity.d.ts.map +0 -1
  47. package/dist/src/commands/identity.js +0 -231
  48. package/dist/src/commands/identity.js.map +0 -1
  49. package/dist/src/commands/mail.d.ts +0 -12
  50. package/dist/src/commands/mail.d.ts.map +0 -1
  51. package/dist/src/commands/mail.js +0 -251
  52. package/dist/src/commands/mail.js.map +0 -1
  53. package/dist/src/commands/office-manager.d.ts +0 -147
  54. package/dist/src/commands/office-manager.d.ts.map +0 -1
  55. package/dist/src/commands/office-manager.js +0 -171
  56. package/dist/src/commands/office-manager.js.map +0 -1
  57. package/dist/src/commands/office.d.ts +0 -12
  58. package/dist/src/commands/office.d.ts.map +0 -1
  59. package/dist/src/commands/office.js +0 -480
  60. package/dist/src/commands/office.js.map +0 -1
  61. package/dist/src/commands/roster.d.ts +0 -10
  62. package/dist/src/commands/roster.d.ts.map +0 -1
  63. package/dist/src/commands/roster.js +0 -143
  64. package/dist/src/commands/roster.js.map +0 -1
  65. package/dist/src/commands/secrets.d.ts +0 -9
  66. package/dist/src/commands/secrets.d.ts.map +0 -1
  67. package/dist/src/commands/secrets.js +0 -54
  68. package/dist/src/commands/secrets.js.map +0 -1
  69. package/dist/src/commands/status.d.ts +0 -33
  70. package/dist/src/commands/status.d.ts.map +0 -1
  71. package/dist/src/commands/status.js +0 -407
  72. package/dist/src/commands/status.js.map +0 -1
  73. package/dist/src/generators/brief.d.ts +0 -6
  74. package/dist/src/generators/brief.d.ts.map +0 -1
  75. package/dist/src/generators/brief.js +0 -33
  76. package/dist/src/generators/brief.js.map +0 -1
  77. package/dist/src/generators/claude-code.d.ts +0 -18
  78. package/dist/src/generators/claude-code.d.ts.map +0 -1
  79. package/dist/src/generators/claude-code.js +0 -85
  80. package/dist/src/generators/claude-code.js.map +0 -1
  81. package/dist/src/generators/codex.d.ts +0 -23
  82. package/dist/src/generators/codex.d.ts.map +0 -1
  83. package/dist/src/generators/codex.js +0 -83
  84. package/dist/src/generators/codex.js.map +0 -1
  85. package/dist/src/generators/ollama.d.ts +0 -18
  86. package/dist/src/generators/ollama.d.ts.map +0 -1
  87. package/dist/src/generators/ollama.js +0 -97
  88. package/dist/src/generators/ollama.js.map +0 -1
  89. package/dist/src/generators/openclaw.d.ts +0 -15
  90. package/dist/src/generators/openclaw.d.ts.map +0 -1
  91. package/dist/src/generators/openclaw.js +0 -107
  92. package/dist/src/generators/openclaw.js.map +0 -1
  93. package/dist/src/generators/registry.d.ts +0 -36
  94. package/dist/src/generators/registry.d.ts.map +0 -1
  95. package/dist/src/generators/registry.js +0 -99
  96. package/dist/src/generators/registry.js.map +0 -1
  97. package/dist/src/schema/manifest.d.ts +0 -287
  98. package/dist/src/schema/manifest.d.ts.map +0 -1
  99. package/dist/src/schema/manifest.js +0 -65
  100. package/dist/src/schema/manifest.js.map +0 -1
  101. package/dist/src/schema/report.d.ts +0 -166
  102. package/dist/src/schema/report.d.ts.map +0 -1
  103. package/dist/src/schema/report.js +0 -90
  104. package/dist/src/schema/report.js.map +0 -1
  105. package/dist/src/schema/sanitizer.d.ts +0 -30
  106. package/dist/src/schema/sanitizer.d.ts.map +0 -1
  107. package/dist/src/schema/sanitizer.js +0 -99
  108. package/dist/src/schema/sanitizer.js.map +0 -1
  109. package/dist/src/soundstage/mock-llm.d.ts +0 -3
  110. package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
  111. package/dist/src/soundstage/mock-llm.js +0 -68
  112. package/dist/src/soundstage/mock-llm.js.map +0 -1
  113. package/dist/src/utils/agent-info.d.ts +0 -28
  114. package/dist/src/utils/agent-info.d.ts.map +0 -1
  115. package/dist/src/utils/agent-info.js +0 -102
  116. package/dist/src/utils/agent-info.js.map +0 -1
  117. package/dist/src/utils/archive.d.ts +0 -20
  118. package/dist/src/utils/archive.d.ts.map +0 -1
  119. package/dist/src/utils/archive.js +0 -108
  120. package/dist/src/utils/archive.js.map +0 -1
  121. package/dist/src/utils/config-inject.d.ts +0 -27
  122. package/dist/src/utils/config-inject.d.ts.map +0 -1
  123. package/dist/src/utils/config-inject.js +0 -83
  124. package/dist/src/utils/config-inject.js.map +0 -1
  125. package/dist/src/utils/config.d.ts +0 -30
  126. package/dist/src/utils/config.d.ts.map +0 -1
  127. package/dist/src/utils/config.js +0 -55
  128. package/dist/src/utils/config.js.map +0 -1
  129. package/dist/src/utils/connection-state.d.ts +0 -27
  130. package/dist/src/utils/connection-state.d.ts.map +0 -1
  131. package/dist/src/utils/connection-state.js +0 -81
  132. package/dist/src/utils/connection-state.js.map +0 -1
  133. package/dist/src/utils/context.d.ts +0 -14
  134. package/dist/src/utils/context.d.ts.map +0 -1
  135. package/dist/src/utils/context.js +0 -68
  136. package/dist/src/utils/context.js.map +0 -1
  137. package/dist/src/utils/github-webhook.d.ts +0 -3
  138. package/dist/src/utils/github-webhook.d.ts.map +0 -1
  139. package/dist/src/utils/github-webhook.js +0 -105
  140. package/dist/src/utils/github-webhook.js.map +0 -1
  141. package/dist/src/utils/identity.d.ts +0 -124
  142. package/dist/src/utils/identity.d.ts.map +0 -1
  143. package/dist/src/utils/identity.js +0 -434
  144. package/dist/src/utils/identity.js.map +0 -1
  145. package/dist/src/utils/internal-mail.d.ts +0 -18
  146. package/dist/src/utils/internal-mail.d.ts.map +0 -1
  147. package/dist/src/utils/internal-mail.js +0 -75
  148. package/dist/src/utils/internal-mail.js.map +0 -1
  149. package/dist/src/utils/loop-detector.d.ts +0 -27
  150. package/dist/src/utils/loop-detector.d.ts.map +0 -1
  151. package/dist/src/utils/loop-detector.js +0 -42
  152. package/dist/src/utils/loop-detector.js.map +0 -1
  153. package/dist/src/utils/mail-handler.d.ts +0 -19
  154. package/dist/src/utils/mail-handler.d.ts.map +0 -1
  155. package/dist/src/utils/mail-handler.js +0 -94
  156. package/dist/src/utils/mail-handler.js.map +0 -1
  157. package/dist/src/utils/mail.d.ts +0 -22
  158. package/dist/src/utils/mail.d.ts.map +0 -1
  159. package/dist/src/utils/mail.js +0 -111
  160. package/dist/src/utils/mail.js.map +0 -1
  161. package/dist/src/utils/manifest.d.ts +0 -36
  162. package/dist/src/utils/manifest.d.ts.map +0 -1
  163. package/dist/src/utils/manifest.js +0 -94
  164. package/dist/src/utils/manifest.js.map +0 -1
  165. package/dist/src/utils/noise-ik-transport.d.ts +0 -18
  166. package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
  167. package/dist/src/utils/noise-ik-transport.js +0 -357
  168. package/dist/src/utils/noise-ik-transport.js.map +0 -1
  169. package/dist/src/utils/nono.d.ts +0 -72
  170. package/dist/src/utils/nono.d.ts.map +0 -1
  171. package/dist/src/utils/nono.js +0 -166
  172. package/dist/src/utils/nono.js.map +0 -1
  173. package/dist/src/utils/outbox.d.ts +0 -10
  174. package/dist/src/utils/outbox.d.ts.map +0 -1
  175. package/dist/src/utils/outbox.js +0 -29
  176. package/dist/src/utils/outbox.js.map +0 -1
  177. package/dist/src/utils/output.d.ts +0 -17
  178. package/dist/src/utils/output.d.ts.map +0 -1
  179. package/dist/src/utils/output.js +0 -83
  180. package/dist/src/utils/output.js.map +0 -1
  181. package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
  182. package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
  183. package/dist/src/utils/plain-tcp-transport.js +0 -209
  184. package/dist/src/utils/plain-tcp-transport.js.map +0 -1
  185. package/dist/src/utils/provision.d.ts +0 -2
  186. package/dist/src/utils/provision.d.ts.map +0 -1
  187. package/dist/src/utils/provision.js +0 -193
  188. package/dist/src/utils/provision.js.map +0 -1
  189. package/dist/src/utils/relay.d.ts +0 -30
  190. package/dist/src/utils/relay.d.ts.map +0 -1
  191. package/dist/src/utils/relay.js +0 -539
  192. package/dist/src/utils/relay.js.map +0 -1
  193. package/dist/src/utils/sandbox.d.ts +0 -37
  194. package/dist/src/utils/sandbox.d.ts.map +0 -1
  195. package/dist/src/utils/sandbox.js +0 -126
  196. package/dist/src/utils/sandbox.js.map +0 -1
  197. package/dist/src/utils/transport.d.ts +0 -62
  198. package/dist/src/utils/transport.d.ts.map +0 -1
  199. package/dist/src/utils/transport.js +0 -75
  200. package/dist/src/utils/transport.js.map +0 -1
  201. package/dist/src/utils/vault.d.ts +0 -21
  202. package/dist/src/utils/vault.d.ts.map +0 -1
  203. package/dist/src/utils/vault.js +0 -67
  204. package/dist/src/utils/vault.js.map +0 -1
  205. package/dist/src/utils/wall.d.ts +0 -5
  206. package/dist/src/utils/wall.d.ts.map +0 -1
  207. package/dist/src/utils/wall.js +0 -51
  208. package/dist/src/utils/wall.js.map +0 -1
  209. package/dist/src/utils/wire-delivery.d.ts +0 -10
  210. package/dist/src/utils/wire-delivery.d.ts.map +0 -1
  211. package/dist/src/utils/wire-delivery.js +0 -57
  212. package/dist/src/utils/wire-delivery.js.map +0 -1
  213. package/dist/src/utils/wire-frame.d.ts +0 -10
  214. package/dist/src/utils/wire-frame.d.ts.map +0 -1
  215. package/dist/src/utils/wire-frame.js +0 -66
  216. package/dist/src/utils/wire-frame.js.map +0 -1
  217. package/dist/src/utils/wire-mail.d.ts +0 -54
  218. package/dist/src/utils/wire-mail.d.ts.map +0 -1
  219. package/dist/src/utils/wire-mail.js +0 -24
  220. package/dist/src/utils/wire-mail.js.map +0 -1
  221. package/dist/src/utils/workspace.d.ts +0 -14
  222. package/dist/src/utils/workspace.d.ts.map +0 -1
  223. package/dist/src/utils/workspace.js +0 -53
  224. package/dist/src/utils/workspace.js.map +0 -1
  225. package/dist/src/utils/ws-noise-transport.d.ts +0 -18
  226. package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
  227. package/dist/src/utils/ws-noise-transport.js +0 -356
  228. package/dist/src/utils/ws-noise-transport.js.map +0 -1
@@ -1,480 +0,0 @@
1
- import { spawnSync } from "node:child_process";
2
- import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
3
- import { homedir } from "node:os";
4
- import { dirname, join } from "node:path";
5
- import { fileURLToPath } from "node:url";
6
- import { sanitizeIdentifier } from "../schema/sanitizer.js";
7
- import { connectionAlive, listHostStates } from "../utils/connection-state.js";
8
- import { fingerprint, loadHostIdentity, registerBranch, revokeBranch } from "../utils/identity.js";
9
- import { NoiseIkTransport } from "../utils/noise-ik-transport.js";
10
- import { provisionTeam } from "../utils/provision.js";
11
- import { connectAndKeepAlive, startRelay } from "../utils/relay.js";
12
- import { isSandboxReady, loadImageIntoSandbox, sandboxExec, sandboxSocketPath, waitForSandbox } from "../utils/sandbox.js";
13
- import { MSG_JOIN_COMPLETE, MSG_MAIL_DELIVER } from "../utils/wire-mail.js";
14
- import { WsNoiseTransport } from "../utils/ws-noise-transport.js";
15
- import { branchRoot as sharedBranchRoot, resolveTeamId, workspacePath as sharedWorkspacePath } from "../utils/workspace.js";
16
- import { runOfficeManager, loadWorkspaceManifest } from "./office-manager.js";
17
- const __dirname = dirname(fileURLToPath(import.meta.url));
18
- const BOOTSTRAP_TEMPLATE = `#!/bin/bash
19
- set -e
20
-
21
- # Install dependencies (skip if already available, e.g., soundstage image)
22
- if ! command -v openclaw >/dev/null 2>&1; then
23
- npm install -g openclaw || { echo "ERROR: openclaw install failed"; exit 1; }
24
- npm install -g @tpsdev-ai/cli || echo "TPS not on npm yet, skipping"
25
- fi
26
-
27
- openclaw --version
28
-
29
- # Detect config location
30
- # Standard branch office: workspace/.openclaw/openclaw.json
31
- # Multi-agent office: team-root/.openclaw/openclaw.json (workspace is a subdir)
32
- if [ -f "__WORKSPACE__/.openclaw/openclaw.json" ]; then
33
- CONFIG="__WORKSPACE__/.openclaw/openclaw.json"
34
- elif [ -f "__WORKSPACE__/../.openclaw/openclaw.json" ]; then
35
- CONFIG="__WORKSPACE__/../.openclaw/openclaw.json"
36
- else
37
- echo "No openclaw.json found"
38
- exit 1
39
- fi
40
-
41
- echo "Starting gateway with config: $CONFIG"
42
-
43
- # If mock LLM script exists, start it (soundstage mode)
44
- # mock-llm.js lives in team root (outside workspace) so agents can't modify it
45
- if [ -f "__TEAM_ROOT__/mock-llm.js" ]; then
46
- echo "Starting mock LLM (soundstage mode)..."
47
- nohup node __TEAM_ROOT__/mock-llm.js > __TEAM_ROOT__/mock-llm.log 2>&1 &
48
- sleep 1
49
- fi
50
-
51
- # Run gateway in background (nohup to survive shell exit)
52
- nohup openclaw gateway run --config "$CONFIG" > __WORKSPACE__/gateway.log 2>&1 &
53
- echo "Branch office agent ready (gateway pid $!)"
54
- `;
55
- function branchRoot() {
56
- return sharedBranchRoot();
57
- }
58
- function workspacePath(agentId) {
59
- return sharedWorkspacePath(agentId);
60
- }
61
- function sandboxName(agentId) {
62
- const teamId = resolveTeamId(agentId);
63
- return `tps-${teamId}`;
64
- }
65
- function relayPidFile(agentId) {
66
- return join(workspacePath(agentId), "relay.pid");
67
- }
68
- function outboxCounts(agentId) {
69
- const ws = workspacePath(agentId);
70
- const root = join(ws, "mail", "outbox");
71
- const countDir = (dir) => existsSync(dir) ? readdirSync(dir).filter(f => f.endsWith(".json")).length : 0;
72
- return {
73
- newCount: countDir(join(root, "new")),
74
- curCount: countDir(join(root, "cur")),
75
- failedCount: countDir(join(root, "failed")),
76
- };
77
- }
78
- function validateAgent(agent) {
79
- if (!agent) {
80
- console.error("Agent name is required.");
81
- process.exit(1);
82
- }
83
- const safe = sanitizeIdentifier(agent);
84
- if (safe !== agent) {
85
- console.error(`Invalid agent identifier: ${agent}`);
86
- process.exit(1);
87
- }
88
- return agent;
89
- }
90
- function resolveSandboxId(agentId) {
91
- const result = spawnSync("nono", ["list", "--json"], { encoding: "utf8" });
92
- if (result.status !== 0)
93
- return null;
94
- try {
95
- const states = JSON.parse(result.stdout);
96
- const target = sandboxName(agentId);
97
- const found = states.find((s) => s.name === target);
98
- return found ? found.id : null;
99
- }
100
- catch {
101
- return null;
102
- }
103
- }
104
- export function parseJoinToken(tokenUrl) {
105
- const url = new URL(tokenUrl);
106
- if (url.protocol !== "tps:" || url.host !== "join") {
107
- throw new Error("Invalid join token protocol. Must be tps://join?...");
108
- }
109
- const host = url.searchParams.get("host");
110
- const port = Number(url.searchParams.get("port"));
111
- const pubkey = url.searchParams.get("pubkey");
112
- const sigpubkey = url.searchParams.get("sigpubkey");
113
- const fp = url.searchParams.get("fp");
114
- if (!host || isNaN(port) || !pubkey || !sigpubkey || !fp) {
115
- throw new Error("Invalid join token: missing required parameters");
116
- }
117
- return {
118
- host,
119
- port,
120
- transport: url.searchParams.get("transport") || "ws",
121
- encryptionPubkey: new Uint8Array(Buffer.from(pubkey, "base64url")),
122
- signingPubkey: new Uint8Array(Buffer.from(sigpubkey, "base64url")),
123
- fingerprint: fp,
124
- };
125
- }
126
- function setupWorkspace(agent) {
127
- const ws = workspacePath(agent);
128
- mkdirSync(join(ws, "mail", "inbox", "new"), { recursive: true });
129
- mkdirSync(join(ws, "mail", "inbox", "cur"), { recursive: true });
130
- mkdirSync(join(ws, "mail", "outbox", "new"), { recursive: true });
131
- mkdirSync(join(ws, "mail", "outbox", "cur"), { recursive: true });
132
- mkdirSync(join(ws, "mail", "outbox", "failed"), { recursive: true });
133
- mkdirSync(join(ws, "mail", "outbox", "paused"), { recursive: true });
134
- const bootstrap = join(ws, "bootstrap.sh");
135
- if (!existsSync(bootstrap)) {
136
- const teamRoot = join(branchRoot(), agent);
137
- const template = BOOTSTRAP_TEMPLATE
138
- .replaceAll("__WORKSPACE__", ws)
139
- .replaceAll("__TEAM_ROOT__", teamRoot);
140
- writeFileSync(bootstrap, template, { mode: 0o755 });
141
- }
142
- else {
143
- console.log("Using existing bootstrap.sh");
144
- }
145
- return ws;
146
- }
147
- export async function runOffice(args) {
148
- switch (args.action) {
149
- case "start": {
150
- if (args.manifest) {
151
- try {
152
- provisionTeam(args.manifest, branchRoot());
153
- if (args.soundstage && args.agent) {
154
- const team = validateAgent(args.agent);
155
- const teamRoot = join(branchRoot(), team);
156
- const ws = join(teamRoot, "workspace");
157
- const marker = join(teamRoot, "soundstage.json");
158
- mkdirSync(teamRoot, { recursive: true });
159
- writeFileSync(marker, JSON.stringify({ enabled: true, startedAt: new Date().toISOString() }));
160
- const teamBootstrap = join(teamRoot, "bootstrap.sh");
161
- let bs = BOOTSTRAP_TEMPLATE
162
- .replaceAll("__WORKSPACE__", ws)
163
- .replaceAll("__TEAM_ROOT__", teamRoot);
164
- const workspaceBootstrap = join(ws, "bootstrap.sh");
165
- if (existsSync(workspaceBootstrap)) {
166
- bs = readFileSync(workspaceBootstrap, "utf-8").replaceAll("__TEAM_ROOT__", teamRoot);
167
- }
168
- writeFileSync(teamBootstrap, bs, { mode: 0o755 });
169
- }
170
- console.log(`Team provisioned from manifest.`);
171
- }
172
- catch (e) {
173
- console.error(`Failed to provision team: ${e.message}`);
174
- process.exit(1);
175
- }
176
- return;
177
- }
178
- const agent = validateAgent(args.agent);
179
- const sName = sandboxName(agent);
180
- const ws = setupWorkspace(agent);
181
- if (args.soundstage) {
182
- console.log("🎬 Soundstage mode enabled (Mock LLM, local isolation)");
183
- const teamRoot = join(branchRoot(), agent);
184
- const marker = join(teamRoot, "soundstage.json");
185
- mkdirSync(teamRoot, { recursive: true });
186
- writeFileSync(marker, JSON.stringify({ enabled: true, startedAt: new Date().toISOString() }));
187
- const soundstageImage = join(__dirname, "..", "..", "images", "tps-soundstage.tar");
188
- if (existsSync(soundstageImage)) {
189
- console.log(`Loading soundstage image: ${soundstageImage}`);
190
- loadImageIntoSandbox(sName, soundstageImage);
191
- }
192
- const bootstrap = join(ws, "bootstrap.sh");
193
- if (existsSync(bootstrap)) {
194
- const bs = readFileSync(bootstrap, "utf-8").replaceAll("__TEAM_ROOT__", teamRoot);
195
- writeFileSync(bootstrap, bs, { mode: 0o755 });
196
- }
197
- }
198
- const teamId = resolveTeamId(agent);
199
- const isTeam = teamId !== agent;
200
- if (isTeam) {
201
- console.log(`(Shared team sandbox: ${teamId})`);
202
- }
203
- if (process.env.TPS_OFFICE_SKIP_VM === "1") {
204
- console.log(`✓ Sandbox ready for ${agent} (SKIPPED).`);
205
- return;
206
- }
207
- console.log(`Starting sandbox VM for ${agent}...`);
208
- spawnSync("nono", ["start", sName, "--mount", `${ws}:/workspace`, "--image", "node:22-alpine"], { stdio: "inherit" });
209
- if (!waitForSandbox(sName)) {
210
- console.error("Timed out waiting for sandbox to be ready.");
211
- process.exit(1);
212
- }
213
- console.log(`✓ Sandbox ready for ${agent}.`);
214
- // Auto-run Office Manager if a workspace manifest exists
215
- if (loadWorkspaceManifest(ws)) {
216
- console.log("Workspace manifest found — running Office Manager...");
217
- await runOfficeManager(ws, { dryRun: false });
218
- }
219
- return;
220
- }
221
- case "setup": {
222
- const agent = validateAgent(args.agent);
223
- const ws = workspacePath(agent);
224
- const ok = await runOfficeManager(ws, { dryRun: args.dryRun ?? false });
225
- if (!ok)
226
- process.exit(1);
227
- return;
228
- }
229
- case "stop": {
230
- const agent = validateAgent(args.agent);
231
- const sName = sandboxName(agent);
232
- const soundstageMarker = join(branchRoot(), agent, "soundstage.json");
233
- if (existsSync(soundstageMarker)) {
234
- try {
235
- unlinkSync(soundstageMarker);
236
- }
237
- catch { }
238
- }
239
- const sid = resolveSandboxId(agent);
240
- if (!sid) {
241
- process.stderr.write("No sandbox found for agent\n");
242
- process.exit(1);
243
- }
244
- console.log(`Stopping sandbox VM for ${agent}...`);
245
- const stopResult = spawnSync("nono", ["stop", sName], { stdio: "inherit" });
246
- if (stopResult.status !== 0) {
247
- process.exit(stopResult.status ?? 1);
248
- }
249
- return;
250
- }
251
- case "list": {
252
- const root = branchRoot();
253
- if (!existsSync(root)) {
254
- console.log("No branch-office workspaces found.");
255
- return;
256
- }
257
- const agents = readdirSync(root).filter((d) => existsSync(join(root, d)));
258
- if (agents.length === 0) {
259
- console.log("No branch-office workspaces found.");
260
- return;
261
- }
262
- for (const a of agents) {
263
- const sid = resolveSandboxId(a);
264
- console.log(`- ${a}${sid ? ` (${sid})` : ""}`);
265
- }
266
- return;
267
- }
268
- case "status": {
269
- if (!args.agent) {
270
- const states = listHostStates();
271
- if (states.length === 0) {
272
- console.log("No active branch connections.");
273
- return;
274
- }
275
- for (const s of states) {
276
- const alive = connectionAlive(s.branch);
277
- const age = Math.round((Date.now() - new Date(s.connectedAt).getTime()) / 1000);
278
- const lastAck = s.lastHeartbeatAck
279
- ? Math.round((Date.now() - new Date(s.lastHeartbeatAck).getTime()) / 1000) + "s ago"
280
- : "never";
281
- const anomaly = !alive ? " ⚠️ STALE (PID dead)" : s.reconnectCount > 3 ? ` ⚠️ ${s.reconnectCount} reconnects` : "";
282
- console.log(`${s.branch.padEnd(12)} ${alive ? "connected" : "STALE"} ${age}s ↑${s.messagesSent}msg ↓${s.messagesReceived}msg last ack: ${lastAck}${anomaly}`);
283
- }
284
- return;
285
- }
286
- const agent = validateAgent(args.agent);
287
- const sid = resolveSandboxId(agent);
288
- const ws = workspacePath(agent);
289
- const relayRunning = existsSync(relayPidFile(agent));
290
- const counts = outboxCounts(agent);
291
- const sName2 = sandboxName(agent);
292
- const vmReady = sid ? isSandboxReady(sName2) : false;
293
- const soundstageMarker = join(branchRoot(), agent, "soundstage.json");
294
- const isSoundstage = existsSync(soundstageMarker);
295
- console.log(`Agent: ${agent}`);
296
- console.log(`Workspace: ${ws}`);
297
- if (isSoundstage) {
298
- console.log(`Mode: 🎬 soundstage (mock LLM, real sandbox)`);
299
- }
300
- console.log(`Sandbox: ${sid || "not running"}${vmReady ? " (VM ready)" : ""}`);
301
- if (sid)
302
- console.log(`Socket: ${sandboxSocketPath(sName2)}`);
303
- console.log(`Relay: ${relayRunning ? "running" : "stopped"}`);
304
- console.log(`Outbox pending: ${counts.newCount} (cur=${counts.curCount}, failed=${counts.failedCount})`);
305
- const pausedDir = join(ws, "mail", "outbox", "paused");
306
- if (existsSync(pausedDir)) {
307
- const pausedCount = readdirSync(pausedDir).filter((f) => f.endsWith(".json")).length;
308
- if (pausedCount > 0) {
309
- console.log(`⚠️ Paused messages (loop detected): ${pausedCount}`);
310
- console.log(` Review: ${pausedDir}`);
311
- }
312
- }
313
- return;
314
- }
315
- case "relay": {
316
- const agent = validateAgent(args.agent);
317
- const stop = startRelay(agent);
318
- process.on("SIGTERM", () => {
319
- stop();
320
- process.exit(0);
321
- });
322
- process.on("SIGINT", () => {
323
- stop();
324
- process.exit(0);
325
- });
326
- setInterval(() => { }, 60_000);
327
- return;
328
- }
329
- case "exec": {
330
- const agent = validateAgent(args.agent);
331
- const sName2 = sandboxName(agent);
332
- const ws = workspacePath(agent);
333
- if (!isSandboxReady(sName2)) {
334
- console.error(`Sandbox VM for ${agent} is not ready. Start it with: tps office start ${agent}`);
335
- process.exit(1);
336
- }
337
- const cmd = args.command;
338
- if (!cmd || cmd.length === 0) {
339
- console.error("Usage: tps office exec <agent> -- <command...>");
340
- process.exit(1);
341
- }
342
- const result = sandboxExec(sName2, cmd, {
343
- workspace: ws,
344
- image: "node:22-alpine",
345
- });
346
- if (result.stdout)
347
- process.stdout.write(result.stdout);
348
- if (result.stderr)
349
- process.stderr.write(result.stderr);
350
- process.exit(result.status ?? 1);
351
- return;
352
- }
353
- case "join": {
354
- if (!args.agent || !args.joinToken) {
355
- console.error("Usage: tps office join <name> <join-token>");
356
- process.exit(1);
357
- }
358
- const agent = validateAgent(args.agent);
359
- const token = parseJoinToken(args.joinToken);
360
- registerBranch(agent, token.signingPubkey, {
361
- fingerprint: `sha256:${fingerprint(token.signingPubkey)}`,
362
- trust: "standard",
363
- }, token.encryptionPubkey);
364
- console.log(`Connecting to ${token.host}:${token.port}...`);
365
- const hostKp = await loadHostIdentity();
366
- const wire = token.transport === "ws" ? new WsNoiseTransport(hostKp) : new NoiseIkTransport(hostKp);
367
- const channel = await wire.connect({
368
- host: token.host,
369
- port: token.port,
370
- branchId: agent,
371
- hostPublicKey: token.encryptionPubkey,
372
- });
373
- console.log(`Noise_IK handshake OK — branch fingerprint verified: ${token.fingerprint}`);
374
- await channel.send({
375
- type: MSG_JOIN_COMPLETE,
376
- seq: 0,
377
- ts: new Date().toISOString(),
378
- body: {
379
- hostPubkey: Buffer.from(hostKp.encryption.publicKey).toString("base64url"),
380
- hostFingerprint: fingerprint(hostKp.encryption.publicKey),
381
- hostId: process.env.TPS_HOST_ID || "host",
382
- },
383
- });
384
- const ws = workspacePath(agent);
385
- mkdirSync(ws, { recursive: true });
386
- const remoteRecord = {
387
- host: token.host,
388
- port: token.port,
389
- branchId: agent,
390
- fingerprint: token.fingerprint,
391
- pubkey: Buffer.from(token.encryptionPubkey).toString("base64url"),
392
- joinedAt: new Date().toISOString(),
393
- transport: token.transport,
394
- };
395
- writeFileSync(join(ws, "remote.json"), JSON.stringify(remoteRecord, null, 2), "utf-8");
396
- await channel.close();
397
- console.log(`Branch '${agent}' registered.`);
398
- console.log("Host pubkey sent to branch.");
399
- return;
400
- }
401
- case "revoke": {
402
- const agent = validateAgent(args.agent);
403
- revokeBranch(agent, "manual revocation");
404
- const ws = workspacePath(agent);
405
- const rPath = join(ws, "remote.json");
406
- if (existsSync(rPath)) {
407
- try {
408
- unlinkSync(rPath);
409
- }
410
- catch { }
411
- }
412
- console.log(`Branch '${agent}' revoked.`);
413
- return;
414
- }
415
- case "sync": {
416
- if (!args.agent) {
417
- console.error("Usage: tps office sync <name>");
418
- process.exit(1);
419
- }
420
- const { syncRemoteBranch: syncRemote } = await import("../utils/relay.js");
421
- const { received } = await syncRemote(args.agent);
422
- console.log(`Sync complete. Received ${received} message(s).`);
423
- return;
424
- }
425
- case "connect": {
426
- if (!args.agent) {
427
- console.error("Usage: tps office connect <name>");
428
- process.exit(1);
429
- }
430
- const hostKp = await loadHostIdentity();
431
- const stop = await connectAndKeepAlive(args.agent, {
432
- onMessage: (msg) => {
433
- if (msg.type === MSG_MAIL_DELIVER) {
434
- console.log(`\n[${new Date().toLocaleTimeString()}] ✉️ Mail received`);
435
- }
436
- }
437
- });
438
- console.log(`Persistent connection active for '${args.agent}'. Press Ctrl+C to disconnect.`);
439
- process.on("SIGINT", async () => {
440
- await stop();
441
- process.exit(0);
442
- });
443
- setInterval(() => { }, 60_000);
444
- return;
445
- }
446
- case "kill": {
447
- let killed = 0;
448
- const { listHostStates, clearHostState } = await import("../utils/connection-state.js");
449
- const states = listHostStates();
450
- for (const s of states) {
451
- try {
452
- process.kill(s.pid, "SIGTERM");
453
- clearHostState(s.branch);
454
- killed++;
455
- }
456
- catch {
457
- clearHostState(s.branch);
458
- }
459
- }
460
- const pidPath = join(process.env.HOME || homedir(), ".tps", "branch", "branch.pid");
461
- if (existsSync(pidPath)) {
462
- try {
463
- const pid = Number(readFileSync(pidPath, "utf-8").trim());
464
- if (pid) {
465
- process.kill(pid, "SIGTERM");
466
- killed++;
467
- }
468
- }
469
- catch { }
470
- try {
471
- rmSync(pidPath, { force: true });
472
- }
473
- catch { }
474
- }
475
- console.log(`Kill switch engaged. Terminated ${killed} TPS process(es).`);
476
- break;
477
- }
478
- }
479
- }
480
- //# sourceMappingURL=office.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"office.js","sourceRoot":"","sources":["../../../src/commands/office.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- interface RosterArgs {
2
- action: "list" | "show" | "find";
3
- agent?: string;
4
- channel?: string;
5
- json?: boolean;
6
- configPath?: string;
7
- }
8
- export declare function runRoster(args: RosterArgs): void;
9
- export {};
10
- //# sourceMappingURL=roster.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../../src/commands/roster.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CA4HhD"}
@@ -1,143 +0,0 @@
1
- import { findOpenClawConfig, getAgentList, readOpenClawConfig, resolveConfigPath, resolveWorkspace } from "../utils/config.js";
2
- import { sanitizeIdentifier } from "../schema/sanitizer.js";
3
- import { getAgentInfo } from "../utils/agent-info.js";
4
- function getPrimaryModel(agent) {
5
- const model = agent.model;
6
- if (!model)
7
- return "(default)";
8
- if (typeof model === "string")
9
- return model;
10
- if (typeof model === "object" && model !== null && "primary" in model) {
11
- return String(model.primary || "(default)");
12
- }
13
- return "(default)";
14
- }
15
- function resolveConfig(args) {
16
- const configPath = resolveConfigPath(args.configPath) || findOpenClawConfig();
17
- if (!configPath) {
18
- console.error("No openclaw.json found. Use --config <path>.");
19
- process.exit(1);
20
- }
21
- return readOpenClawConfig(configPath);
22
- }
23
- export function runRoster(args) {
24
- const config = resolveConfig(args);
25
- const agents = getAgentList(config);
26
- switch (args.action) {
27
- case "list": {
28
- const rows = agents.map((a) => ({
29
- id: a.id,
30
- name: a.name || a.id,
31
- model: getPrimaryModel(a),
32
- status: "active",
33
- }));
34
- if (args.json) {
35
- console.log(JSON.stringify(rows, null, 2));
36
- }
37
- else if (rows.length === 0) {
38
- console.log("No agents found.");
39
- }
40
- else {
41
- for (const row of rows) {
42
- console.log(`- ${row.name} (${row.id}) · ${row.model} · ${row.status}`);
43
- }
44
- }
45
- return;
46
- }
47
- case "show": {
48
- if (!args.agent) {
49
- console.error("Usage: tps roster show <agent>");
50
- process.exit(1);
51
- }
52
- const safeAgent = sanitizeIdentifier(args.agent);
53
- if (safeAgent !== args.agent) {
54
- console.error(`Invalid agent id: ${args.agent}`);
55
- process.exit(1);
56
- }
57
- const agent = agents.find((a) => a.id.toLowerCase() === args.agent.toLowerCase() || a.name?.toLowerCase() === args.agent.toLowerCase());
58
- if (!agent) {
59
- console.error(`Agent "${args.agent}" not found`);
60
- process.exit(1);
61
- }
62
- const ws = resolveWorkspace(agent, config);
63
- const info = getAgentInfo(agent.id, ws || undefined);
64
- const card = {
65
- id: agent.id,
66
- name: agent.name || agent.id,
67
- model: getPrimaryModel(agent),
68
- role: info.profile.role,
69
- emoji: info.profile.emoji,
70
- vibe: info.profile.vibe,
71
- contacts: agent.contacts || {},
72
- capabilities: agent.capabilities || {},
73
- mail: info.mail,
74
- memory: info.memory,
75
- workspaceFiles: info.workspaceFileCount,
76
- };
77
- if (args.json) {
78
- console.log(JSON.stringify(card, null, 2));
79
- }
80
- else {
81
- const label = info.profile.emoji ? `${info.profile.emoji} ${card.name}` : card.name;
82
- console.log(`${label} (${card.id})`);
83
- if (info.profile.role)
84
- console.log(` role: ${info.profile.role}`);
85
- if (info.profile.vibe)
86
- console.log(` vibe: ${info.profile.vibe}`);
87
- console.log(` model: ${card.model}`);
88
- if (info.mail.total > 0) {
89
- console.log(` mail: ${info.mail.unread} unread, ${info.mail.read} read (${info.mail.total} total)`);
90
- }
91
- else {
92
- console.log(` mail: no messages`);
93
- }
94
- if (info.memory.latestDate) {
95
- console.log(` memory: ${info.memory.fileCount} journal${info.memory.fileCount !== 1 ? "s" : ""}, latest ${info.memory.latestDate}`);
96
- }
97
- console.log(` workspace: ${info.workspaceFileCount} files`);
98
- const contacts = agent.contacts || {};
99
- if (Object.keys(contacts).length > 0) {
100
- console.log(` contacts: ${JSON.stringify(contacts)}`);
101
- }
102
- }
103
- return;
104
- }
105
- case "find": {
106
- if (!args.channel) {
107
- console.error("Usage: tps roster find --channel <channel>");
108
- process.exit(1);
109
- }
110
- const safeChannel = sanitizeIdentifier(args.channel);
111
- if (safeChannel !== args.channel) {
112
- console.error(`Invalid channel: ${args.channel}`);
113
- process.exit(1);
114
- }
115
- const matches = [];
116
- for (const a of agents) {
117
- const contacts = a.contacts || {};
118
- const value = contacts[args.channel];
119
- if (value === undefined || value === null)
120
- continue;
121
- matches.push({
122
- id: a.id,
123
- name: a.name || a.id,
124
- channel: args.channel,
125
- contact: value,
126
- });
127
- }
128
- if (args.json) {
129
- console.log(JSON.stringify(matches, null, 2));
130
- }
131
- else if (matches.length === 0) {
132
- console.log(`No agents found for channel: ${args.channel}`);
133
- }
134
- else {
135
- for (const m of matches) {
136
- console.log(`- ${m.name} (${m.id}) => ${JSON.stringify(m.contact)}`);
137
- }
138
- }
139
- return;
140
- }
141
- }
142
- }
143
- //# sourceMappingURL=roster.js.map