@tpsdev-ai/cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/bin/tps.cjs +22 -0
- package/bin/tps.ts +435 -0
- package/package.json +29 -5
- package/dist/bin/tps.d.ts +0 -3
- package/dist/bin/tps.d.ts.map +0 -1
- package/dist/bin/tps.js +0 -414
- package/dist/bin/tps.js.map +0 -1
- package/dist/src/cli/hire.d.ts +0 -16
- package/dist/src/cli/hire.d.ts.map +0 -1
- package/dist/src/cli/hire.js +0 -176
- package/dist/src/cli/hire.js.map +0 -1
- package/dist/src/cli/office.d.ts +0 -7
- package/dist/src/cli/office.d.ts.map +0 -1
- package/dist/src/cli/office.js +0 -51
- package/dist/src/cli/office.js.map +0 -1
- package/dist/src/cli/review.d.ts +0 -9
- package/dist/src/cli/review.d.ts.map +0 -1
- package/dist/src/cli/review.js +0 -109
- package/dist/src/cli/review.js.map +0 -1
- package/dist/src/cli/roster.d.ts +0 -6
- package/dist/src/cli/roster.d.ts.map +0 -1
- package/dist/src/cli/roster.js +0 -60
- package/dist/src/cli/roster.js.map +0 -1
- package/dist/src/commands/backup.d.ts +0 -19
- package/dist/src/commands/backup.d.ts.map +0 -1
- package/dist/src/commands/backup.js +0 -595
- package/dist/src/commands/backup.js.map +0 -1
- package/dist/src/commands/bootstrap.d.ts +0 -7
- package/dist/src/commands/bootstrap.d.ts.map +0 -1
- package/dist/src/commands/bootstrap.js +0 -255
- package/dist/src/commands/bootstrap.js.map +0 -1
- package/dist/src/commands/branch.d.ts +0 -14
- package/dist/src/commands/branch.d.ts.map +0 -1
- package/dist/src/commands/branch.js +0 -395
- package/dist/src/commands/branch.js.map +0 -1
- package/dist/src/commands/context.d.ts +0 -9
- package/dist/src/commands/context.d.ts.map +0 -1
- package/dist/src/commands/context.js +0 -57
- package/dist/src/commands/context.js.map +0 -1
- package/dist/src/commands/git.d.ts +0 -8
- package/dist/src/commands/git.d.ts.map +0 -1
- package/dist/src/commands/git.js +0 -53
- package/dist/src/commands/git.js.map +0 -1
- package/dist/src/commands/identity.d.ts +0 -13
- package/dist/src/commands/identity.d.ts.map +0 -1
- package/dist/src/commands/identity.js +0 -231
- package/dist/src/commands/identity.js.map +0 -1
- package/dist/src/commands/mail.d.ts +0 -12
- package/dist/src/commands/mail.d.ts.map +0 -1
- package/dist/src/commands/mail.js +0 -251
- package/dist/src/commands/mail.js.map +0 -1
- package/dist/src/commands/office-manager.d.ts +0 -147
- package/dist/src/commands/office-manager.d.ts.map +0 -1
- package/dist/src/commands/office-manager.js +0 -171
- package/dist/src/commands/office-manager.js.map +0 -1
- package/dist/src/commands/office.d.ts +0 -12
- package/dist/src/commands/office.d.ts.map +0 -1
- package/dist/src/commands/office.js +0 -480
- package/dist/src/commands/office.js.map +0 -1
- package/dist/src/commands/roster.d.ts +0 -10
- package/dist/src/commands/roster.d.ts.map +0 -1
- package/dist/src/commands/roster.js +0 -143
- package/dist/src/commands/roster.js.map +0 -1
- package/dist/src/commands/secrets.d.ts +0 -9
- package/dist/src/commands/secrets.d.ts.map +0 -1
- package/dist/src/commands/secrets.js +0 -54
- package/dist/src/commands/secrets.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -33
- package/dist/src/commands/status.d.ts.map +0 -1
- package/dist/src/commands/status.js +0 -407
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/generators/brief.d.ts +0 -6
- package/dist/src/generators/brief.d.ts.map +0 -1
- package/dist/src/generators/brief.js +0 -33
- package/dist/src/generators/brief.js.map +0 -1
- package/dist/src/generators/claude-code.d.ts +0 -18
- package/dist/src/generators/claude-code.d.ts.map +0 -1
- package/dist/src/generators/claude-code.js +0 -85
- package/dist/src/generators/claude-code.js.map +0 -1
- package/dist/src/generators/codex.d.ts +0 -23
- package/dist/src/generators/codex.d.ts.map +0 -1
- package/dist/src/generators/codex.js +0 -83
- package/dist/src/generators/codex.js.map +0 -1
- package/dist/src/generators/ollama.d.ts +0 -18
- package/dist/src/generators/ollama.d.ts.map +0 -1
- package/dist/src/generators/ollama.js +0 -97
- package/dist/src/generators/ollama.js.map +0 -1
- package/dist/src/generators/openclaw.d.ts +0 -15
- package/dist/src/generators/openclaw.d.ts.map +0 -1
- package/dist/src/generators/openclaw.js +0 -107
- package/dist/src/generators/openclaw.js.map +0 -1
- package/dist/src/generators/registry.d.ts +0 -36
- package/dist/src/generators/registry.d.ts.map +0 -1
- package/dist/src/generators/registry.js +0 -99
- package/dist/src/generators/registry.js.map +0 -1
- package/dist/src/schema/manifest.d.ts +0 -287
- package/dist/src/schema/manifest.d.ts.map +0 -1
- package/dist/src/schema/manifest.js +0 -65
- package/dist/src/schema/manifest.js.map +0 -1
- package/dist/src/schema/report.d.ts +0 -166
- package/dist/src/schema/report.d.ts.map +0 -1
- package/dist/src/schema/report.js +0 -90
- package/dist/src/schema/report.js.map +0 -1
- package/dist/src/schema/sanitizer.d.ts +0 -30
- package/dist/src/schema/sanitizer.d.ts.map +0 -1
- package/dist/src/schema/sanitizer.js +0 -99
- package/dist/src/schema/sanitizer.js.map +0 -1
- package/dist/src/soundstage/mock-llm.d.ts +0 -3
- package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
- package/dist/src/soundstage/mock-llm.js +0 -68
- package/dist/src/soundstage/mock-llm.js.map +0 -1
- package/dist/src/utils/agent-info.d.ts +0 -28
- package/dist/src/utils/agent-info.d.ts.map +0 -1
- package/dist/src/utils/agent-info.js +0 -102
- package/dist/src/utils/agent-info.js.map +0 -1
- package/dist/src/utils/archive.d.ts +0 -20
- package/dist/src/utils/archive.d.ts.map +0 -1
- package/dist/src/utils/archive.js +0 -108
- package/dist/src/utils/archive.js.map +0 -1
- package/dist/src/utils/config-inject.d.ts +0 -27
- package/dist/src/utils/config-inject.d.ts.map +0 -1
- package/dist/src/utils/config-inject.js +0 -83
- package/dist/src/utils/config-inject.js.map +0 -1
- package/dist/src/utils/config.d.ts +0 -30
- package/dist/src/utils/config.d.ts.map +0 -1
- package/dist/src/utils/config.js +0 -55
- package/dist/src/utils/config.js.map +0 -1
- package/dist/src/utils/connection-state.d.ts +0 -27
- package/dist/src/utils/connection-state.d.ts.map +0 -1
- package/dist/src/utils/connection-state.js +0 -81
- package/dist/src/utils/connection-state.js.map +0 -1
- package/dist/src/utils/context.d.ts +0 -14
- package/dist/src/utils/context.d.ts.map +0 -1
- package/dist/src/utils/context.js +0 -68
- package/dist/src/utils/context.js.map +0 -1
- package/dist/src/utils/github-webhook.d.ts +0 -3
- package/dist/src/utils/github-webhook.d.ts.map +0 -1
- package/dist/src/utils/github-webhook.js +0 -105
- package/dist/src/utils/github-webhook.js.map +0 -1
- package/dist/src/utils/identity.d.ts +0 -124
- package/dist/src/utils/identity.d.ts.map +0 -1
- package/dist/src/utils/identity.js +0 -434
- package/dist/src/utils/identity.js.map +0 -1
- package/dist/src/utils/internal-mail.d.ts +0 -18
- package/dist/src/utils/internal-mail.d.ts.map +0 -1
- package/dist/src/utils/internal-mail.js +0 -75
- package/dist/src/utils/internal-mail.js.map +0 -1
- package/dist/src/utils/loop-detector.d.ts +0 -27
- package/dist/src/utils/loop-detector.d.ts.map +0 -1
- package/dist/src/utils/loop-detector.js +0 -42
- package/dist/src/utils/loop-detector.js.map +0 -1
- package/dist/src/utils/mail-handler.d.ts +0 -19
- package/dist/src/utils/mail-handler.d.ts.map +0 -1
- package/dist/src/utils/mail-handler.js +0 -94
- package/dist/src/utils/mail-handler.js.map +0 -1
- package/dist/src/utils/mail.d.ts +0 -22
- package/dist/src/utils/mail.d.ts.map +0 -1
- package/dist/src/utils/mail.js +0 -111
- package/dist/src/utils/mail.js.map +0 -1
- package/dist/src/utils/manifest.d.ts +0 -36
- package/dist/src/utils/manifest.d.ts.map +0 -1
- package/dist/src/utils/manifest.js +0 -94
- package/dist/src/utils/manifest.js.map +0 -1
- package/dist/src/utils/noise-ik-transport.d.ts +0 -18
- package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
- package/dist/src/utils/noise-ik-transport.js +0 -357
- package/dist/src/utils/noise-ik-transport.js.map +0 -1
- package/dist/src/utils/nono.d.ts +0 -72
- package/dist/src/utils/nono.d.ts.map +0 -1
- package/dist/src/utils/nono.js +0 -166
- package/dist/src/utils/nono.js.map +0 -1
- package/dist/src/utils/outbox.d.ts +0 -10
- package/dist/src/utils/outbox.d.ts.map +0 -1
- package/dist/src/utils/outbox.js +0 -29
- package/dist/src/utils/outbox.js.map +0 -1
- package/dist/src/utils/output.d.ts +0 -17
- package/dist/src/utils/output.d.ts.map +0 -1
- package/dist/src/utils/output.js +0 -83
- package/dist/src/utils/output.js.map +0 -1
- package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
- package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
- package/dist/src/utils/plain-tcp-transport.js +0 -209
- package/dist/src/utils/plain-tcp-transport.js.map +0 -1
- package/dist/src/utils/provision.d.ts +0 -2
- package/dist/src/utils/provision.d.ts.map +0 -1
- package/dist/src/utils/provision.js +0 -193
- package/dist/src/utils/provision.js.map +0 -1
- package/dist/src/utils/relay.d.ts +0 -30
- package/dist/src/utils/relay.d.ts.map +0 -1
- package/dist/src/utils/relay.js +0 -539
- package/dist/src/utils/relay.js.map +0 -1
- package/dist/src/utils/sandbox.d.ts +0 -37
- package/dist/src/utils/sandbox.d.ts.map +0 -1
- package/dist/src/utils/sandbox.js +0 -126
- package/dist/src/utils/sandbox.js.map +0 -1
- package/dist/src/utils/transport.d.ts +0 -62
- package/dist/src/utils/transport.d.ts.map +0 -1
- package/dist/src/utils/transport.js +0 -75
- package/dist/src/utils/transport.js.map +0 -1
- package/dist/src/utils/vault.d.ts +0 -21
- package/dist/src/utils/vault.d.ts.map +0 -1
- package/dist/src/utils/vault.js +0 -67
- package/dist/src/utils/vault.js.map +0 -1
- package/dist/src/utils/wall.d.ts +0 -5
- package/dist/src/utils/wall.d.ts.map +0 -1
- package/dist/src/utils/wall.js +0 -51
- package/dist/src/utils/wall.js.map +0 -1
- package/dist/src/utils/wire-delivery.d.ts +0 -10
- package/dist/src/utils/wire-delivery.d.ts.map +0 -1
- package/dist/src/utils/wire-delivery.js +0 -57
- package/dist/src/utils/wire-delivery.js.map +0 -1
- package/dist/src/utils/wire-frame.d.ts +0 -10
- package/dist/src/utils/wire-frame.d.ts.map +0 -1
- package/dist/src/utils/wire-frame.js +0 -66
- package/dist/src/utils/wire-frame.js.map +0 -1
- package/dist/src/utils/wire-mail.d.ts +0 -54
- package/dist/src/utils/wire-mail.d.ts.map +0 -1
- package/dist/src/utils/wire-mail.js +0 -24
- package/dist/src/utils/wire-mail.js.map +0 -1
- package/dist/src/utils/workspace.d.ts +0 -14
- package/dist/src/utils/workspace.d.ts.map +0 -1
- package/dist/src/utils/workspace.js +0 -53
- package/dist/src/utils/workspace.js.map +0 -1
- package/dist/src/utils/ws-noise-transport.d.ts +0 -18
- package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
- package/dist/src/utils/ws-noise-transport.js +0 -356
- 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 +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
|