harborai 0.5.38 → 0.5.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/reset.d.ts +6 -0
- package/dist/commands/reset.d.ts.map +1 -0
- package/dist/commands/reset.js +277 -0
- package/dist/commands/reset.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +59 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/skills-embedded.d.ts.map +1 -1
- package/dist/skills-embedded.js +149 -4
- package/dist/skills-embedded.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAsMA,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgFtG"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { harborDir } from '../config.js';
|
|
5
|
+
import { readLockfile } from '../daemon.js';
|
|
6
|
+
import { runUpdate } from './update.js';
|
|
7
|
+
function killDaemon() {
|
|
8
|
+
const lock = readLockfile();
|
|
9
|
+
if (!lock)
|
|
10
|
+
return false;
|
|
11
|
+
const lockfilePath = join(harborDir, 'daemon.lock');
|
|
12
|
+
try {
|
|
13
|
+
process.kill(lock.pid, 'SIGTERM');
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// already dead
|
|
17
|
+
}
|
|
18
|
+
// Give it 500ms, then force kill
|
|
19
|
+
try {
|
|
20
|
+
process.kill(lock.pid, 0); // check alive
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
try {
|
|
23
|
+
process.kill(lock.pid, 'SIGKILL');
|
|
24
|
+
}
|
|
25
|
+
catch { }
|
|
26
|
+
}, 500);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// already dead
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
unlinkSync(lockfilePath);
|
|
33
|
+
}
|
|
34
|
+
catch { }
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
function findSocketFiles() {
|
|
38
|
+
const files = [];
|
|
39
|
+
const tmpDirs = ['/tmp', join(homedir(), '.harbor')];
|
|
40
|
+
for (const dir of tmpDirs) {
|
|
41
|
+
if (!existsSync(dir))
|
|
42
|
+
continue;
|
|
43
|
+
try {
|
|
44
|
+
for (const f of readdirSync(dir)) {
|
|
45
|
+
if (f.startsWith('harbor') && f.endsWith('.sock')) {
|
|
46
|
+
files.push(join(dir, f));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
return files;
|
|
53
|
+
}
|
|
54
|
+
function removeHarborDir() {
|
|
55
|
+
const removed = [];
|
|
56
|
+
const skipped = [];
|
|
57
|
+
if (!existsSync(harborDir))
|
|
58
|
+
return { removed, skipped };
|
|
59
|
+
const entries = readdirSync(harborDir, { withFileTypes: true });
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const full = join(harborDir, entry.name);
|
|
62
|
+
try {
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
rmSync(full, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
unlinkSync(full);
|
|
68
|
+
}
|
|
69
|
+
removed.push(entry.name);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
skipped.push(`${entry.name} (${err.message})`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Remove the directory itself
|
|
76
|
+
try {
|
|
77
|
+
rmSync(harborDir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
catch { }
|
|
80
|
+
return { removed, skipped };
|
|
81
|
+
}
|
|
82
|
+
function findAndRemoveHarborSkills() {
|
|
83
|
+
const home = homedir();
|
|
84
|
+
const cleaned = [];
|
|
85
|
+
// Directories where `npx skills add` installs harbor skills
|
|
86
|
+
const skillDirs = [
|
|
87
|
+
join(home, '.claude', 'skills'),
|
|
88
|
+
join(home, '.agents', 'skills'),
|
|
89
|
+
join(home, '.cursor', 'skills'),
|
|
90
|
+
join(home, '.codex', 'skills'),
|
|
91
|
+
join(home, '.gemini', 'skills'),
|
|
92
|
+
];
|
|
93
|
+
for (const dir of skillDirs) {
|
|
94
|
+
if (!existsSync(dir))
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
98
|
+
if (!entry.name.startsWith('harbor'))
|
|
99
|
+
continue;
|
|
100
|
+
const full = join(dir, entry.name);
|
|
101
|
+
try {
|
|
102
|
+
const stat = lstatSync(full);
|
|
103
|
+
if (stat.isSymbolicLink() || stat.isDirectory()) {
|
|
104
|
+
rmSync(full, { recursive: true, force: true });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
unlinkSync(full);
|
|
108
|
+
}
|
|
109
|
+
cleaned.push(full.replace(home, '~'));
|
|
110
|
+
}
|
|
111
|
+
catch { }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch { }
|
|
115
|
+
}
|
|
116
|
+
// Also check project-level .claude/skills in common locations
|
|
117
|
+
// (we only clean global/user-level — project-level is the user's responsibility)
|
|
118
|
+
return cleaned;
|
|
119
|
+
}
|
|
120
|
+
function findAgentConfigs() {
|
|
121
|
+
const home = homedir();
|
|
122
|
+
const found = [];
|
|
123
|
+
// Claude Code: ~/.claude.json
|
|
124
|
+
const claudeJson = join(home, '.claude.json');
|
|
125
|
+
if (existsSync(claudeJson)) {
|
|
126
|
+
try {
|
|
127
|
+
const data = JSON.parse(readFileSync(claudeJson, 'utf8'));
|
|
128
|
+
if (data?.mcpServers?.harbor) {
|
|
129
|
+
found.push({ path: claudeJson, key: 'mcpServers.harbor' });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch { }
|
|
133
|
+
}
|
|
134
|
+
// Cursor: ~/.cursor/mcp.json
|
|
135
|
+
const cursorMcp = join(home, '.cursor', 'mcp.json');
|
|
136
|
+
if (existsSync(cursorMcp)) {
|
|
137
|
+
try {
|
|
138
|
+
const data = JSON.parse(readFileSync(cursorMcp, 'utf8'));
|
|
139
|
+
if (data?.mcpServers?.harbor) {
|
|
140
|
+
found.push({ path: cursorMcp, key: 'mcpServers.harbor' });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch { }
|
|
144
|
+
}
|
|
145
|
+
// Codex: ~/.codex/config.toml — just report, don't parse toml
|
|
146
|
+
const codexConfig = join(home, '.codex', 'config.toml');
|
|
147
|
+
if (existsSync(codexConfig)) {
|
|
148
|
+
try {
|
|
149
|
+
const content = readFileSync(codexConfig, 'utf8');
|
|
150
|
+
if (content.includes('[mcp_servers.harbor]') || content.includes('harbor')) {
|
|
151
|
+
found.push({ path: codexConfig, key: 'mcp_servers.harbor' });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch { }
|
|
155
|
+
}
|
|
156
|
+
// Gemini CLI: ~/.gemini/settings.json
|
|
157
|
+
const geminiSettings = join(home, '.gemini', 'settings.json');
|
|
158
|
+
if (existsSync(geminiSettings)) {
|
|
159
|
+
try {
|
|
160
|
+
const data = JSON.parse(readFileSync(geminiSettings, 'utf8'));
|
|
161
|
+
if (data?.mcpServers?.harbor) {
|
|
162
|
+
found.push({ path: geminiSettings, key: 'mcpServers.harbor' });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch { }
|
|
166
|
+
}
|
|
167
|
+
return found;
|
|
168
|
+
}
|
|
169
|
+
function removeAgentConfigs(configs) {
|
|
170
|
+
const cleaned = [];
|
|
171
|
+
for (const config of configs) {
|
|
172
|
+
if (config.path.endsWith('.toml')) {
|
|
173
|
+
// Can't safely edit TOML — just report
|
|
174
|
+
cleaned.push(`${config.path} — manual removal needed (TOML)`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const data = JSON.parse(readFileSync(config.path, 'utf8'));
|
|
179
|
+
const parts = config.key.split('.');
|
|
180
|
+
let obj = data;
|
|
181
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
182
|
+
obj = obj?.[parts[i]];
|
|
183
|
+
}
|
|
184
|
+
const lastKey = parts[parts.length - 1];
|
|
185
|
+
if (obj && lastKey in obj) {
|
|
186
|
+
delete obj[lastKey];
|
|
187
|
+
writeFileSync(config.path, JSON.stringify(data, null, 2) + '\n');
|
|
188
|
+
cleaned.push(config.path);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
cleaned.push(`${config.path} — failed to clean`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return cleaned;
|
|
196
|
+
}
|
|
197
|
+
export async function runReset(flags) {
|
|
198
|
+
const steps = [];
|
|
199
|
+
// 1. Kill daemon
|
|
200
|
+
const killed = killDaemon();
|
|
201
|
+
steps.push({
|
|
202
|
+
step: 'kill-daemon',
|
|
203
|
+
status: killed ? 'ok' : 'skip',
|
|
204
|
+
detail: killed ? 'Daemon stopped' : 'No daemon running',
|
|
205
|
+
});
|
|
206
|
+
// 2. Clean up stale socket files
|
|
207
|
+
const sockets = findSocketFiles();
|
|
208
|
+
for (const sock of sockets) {
|
|
209
|
+
try {
|
|
210
|
+
unlinkSync(sock);
|
|
211
|
+
}
|
|
212
|
+
catch { }
|
|
213
|
+
}
|
|
214
|
+
if (sockets.length > 0) {
|
|
215
|
+
steps.push({ step: 'clean-sockets', status: 'ok', detail: `Removed ${sockets.length} socket file(s)` });
|
|
216
|
+
}
|
|
217
|
+
// 3. Remove ~/.harbor
|
|
218
|
+
const { removed, skipped } = removeHarborDir();
|
|
219
|
+
if (removed.length > 0) {
|
|
220
|
+
steps.push({ step: 'remove-harbor-dir', status: 'ok', detail: `Removed: ${removed.join(', ')}` });
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
steps.push({ step: 'remove-harbor-dir', status: 'skip', detail: 'No ~/.harbor directory' });
|
|
224
|
+
}
|
|
225
|
+
if (skipped.length > 0) {
|
|
226
|
+
steps.push({ step: 'remove-harbor-dir-warnings', status: 'warn', detail: `Could not remove: ${skipped.join(', ')}` });
|
|
227
|
+
}
|
|
228
|
+
// 4. Remove harbor skills installed via `npx skills add`
|
|
229
|
+
const skillsCleaned = findAndRemoveHarborSkills();
|
|
230
|
+
if (skillsCleaned.length > 0) {
|
|
231
|
+
steps.push({ step: 'remove-skills', status: 'ok', detail: `Removed: ${skillsCleaned.join(', ')}` });
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
steps.push({ step: 'remove-skills', status: 'skip', detail: 'No harbor skills found in agent directories' });
|
|
235
|
+
}
|
|
236
|
+
// 6. Find and clean agent configs
|
|
237
|
+
const agentConfigs = findAgentConfigs();
|
|
238
|
+
if (agentConfigs.length > 0) {
|
|
239
|
+
const cleaned = removeAgentConfigs(agentConfigs);
|
|
240
|
+
steps.push({
|
|
241
|
+
step: 'clean-agent-configs',
|
|
242
|
+
status: 'ok',
|
|
243
|
+
detail: `Cleaned harbor entries from: ${cleaned.join(', ')}`,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
steps.push({ step: 'clean-agent-configs', status: 'skip', detail: 'No harbor entries in agent configs' });
|
|
248
|
+
}
|
|
249
|
+
// 7. Upgrade to latest
|
|
250
|
+
if (flags.upgrade) {
|
|
251
|
+
steps.push({ step: 'upgrade', status: 'ok', detail: 'Upgrading to latest...' });
|
|
252
|
+
if (flags.json) {
|
|
253
|
+
console.log(JSON.stringify({ ok: true, steps }, null, 2));
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
for (const s of steps) {
|
|
257
|
+
const icon = s.status === 'ok' ? '✓' : s.status === 'warn' ? '!' : '·';
|
|
258
|
+
console.log(` ${icon} ${s.step.padEnd(26)} ${s.detail}`);
|
|
259
|
+
}
|
|
260
|
+
console.log('');
|
|
261
|
+
}
|
|
262
|
+
await runUpdate();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (flags.json) {
|
|
266
|
+
console.log(JSON.stringify({ ok: true, steps }, null, 2));
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
for (const s of steps) {
|
|
270
|
+
const icon = s.status === 'ok' ? '✓' : s.status === 'warn' ? '!' : '·';
|
|
271
|
+
console.log(` ${icon} ${s.step.padEnd(26)} ${s.detail}`);
|
|
272
|
+
}
|
|
273
|
+
console.log('');
|
|
274
|
+
console.log('Harbor fully reset. Run `harbor setup` to reconnect.');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAKA,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG7D;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDnE"}
|
package/dist/commands/setup.js
CHANGED
|
@@ -11,6 +11,46 @@ export async function runSetup(profile) {
|
|
|
11
11
|
console.log(JSON.stringify({ status: 'ready', profile, daemonId: existing.daemonId, operatorEmail: existing.operatorEmail }, null, 2));
|
|
12
12
|
return;
|
|
13
13
|
}
|
|
14
|
+
// If there's already a claim in flight (no daemon token yet), check its status
|
|
15
|
+
// before creating a new one. This prevents orphaning an approved claim when the
|
|
16
|
+
// agent re-runs setup after a failed token delivery.
|
|
17
|
+
if (existing?.claimId && existing.claimToken) {
|
|
18
|
+
try {
|
|
19
|
+
const statusRes = await fetch(`${orbitalUrl}/api/setup/claims/${existing.claimId}`, {
|
|
20
|
+
headers: { 'x-harbor-claim-token': existing.claimToken },
|
|
21
|
+
});
|
|
22
|
+
if (statusRes.ok) {
|
|
23
|
+
const statusBody = await statusRes.json();
|
|
24
|
+
if (statusBody.status === 'approved' && statusBody.daemonToken) {
|
|
25
|
+
saveProfile({
|
|
26
|
+
...existing,
|
|
27
|
+
daemonId: statusBody.daemonId ?? existing.daemonId,
|
|
28
|
+
daemonToken: statusBody.daemonToken,
|
|
29
|
+
daemonTokenExpiresAt: statusBody.daemonTokenExpiresAt,
|
|
30
|
+
operatorEmail: statusBody.operatorEmail,
|
|
31
|
+
});
|
|
32
|
+
console.log(JSON.stringify({ status: 'ready', profile, daemonId: statusBody.daemonId ?? existing.daemonId, operatorEmail: statusBody.operatorEmail }, null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (statusBody.status === 'approved' || statusBody.status === 'approving') {
|
|
36
|
+
// Approved but token window expired — fall through to create a fresh claim
|
|
37
|
+
}
|
|
38
|
+
else if (statusBody.status === 'pending') {
|
|
39
|
+
// Still waiting — remind the agent to share the URL
|
|
40
|
+
console.log(JSON.stringify({
|
|
41
|
+
status: 'pending',
|
|
42
|
+
profile,
|
|
43
|
+
claimUrl: existing.claimUrl,
|
|
44
|
+
message: 'Waiting for operator approval. Share the claimUrl with your operator, then run: harbor setup status',
|
|
45
|
+
}, null, 2));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Network error — fall through to create a new claim
|
|
52
|
+
}
|
|
53
|
+
}
|
|
14
54
|
// Deterministic per-machine daemonId — survives reinstalls, unique across VMs
|
|
15
55
|
const daemonId = existing?.daemonId || buildDaemonId(profile);
|
|
16
56
|
const res = await fetch(`${orbitalUrl}/api/setup/claims`, {
|
|
@@ -27,11 +67,11 @@ export async function runSetup(profile) {
|
|
|
27
67
|
claimToken: body.claimToken,
|
|
28
68
|
});
|
|
29
69
|
console.log(JSON.stringify({
|
|
30
|
-
|
|
70
|
+
status: body.status,
|
|
31
71
|
profile,
|
|
32
72
|
daemonId: body.daemonId,
|
|
33
|
-
status: body.status,
|
|
34
73
|
claimUrl: body.claimUrl,
|
|
74
|
+
message: 'Share the claimUrl with your operator and ask them to approve. Then run: harbor setup status',
|
|
35
75
|
}, null, 2));
|
|
36
76
|
// Scaffold stub profiles for other detected agents
|
|
37
77
|
const agents = detectInstalledAgents();
|
|
@@ -57,6 +97,16 @@ export async function runSetupStatus(profile) {
|
|
|
57
97
|
const res = await fetch(`${orbitalUrl}/api/setup/claims/${existing.claimId}`, {
|
|
58
98
|
headers: { 'x-harbor-claim-token': existing.claimToken },
|
|
59
99
|
});
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
if (res.status === 404) {
|
|
102
|
+
// Claim expired or not found — need a fresh setup
|
|
103
|
+
console.log(JSON.stringify({ status: 'expired', profile, message: 'Claim not found or expired. Run: harbor setup' }, null, 2));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
console.error(`Unexpected response: ${res.status}`);
|
|
107
|
+
}
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
60
110
|
const body = await res.json();
|
|
61
111
|
if (body.status === 'approved' && body.daemonToken) {
|
|
62
112
|
saveProfile({
|
|
@@ -66,6 +116,13 @@ export async function runSetupStatus(profile) {
|
|
|
66
116
|
daemonTokenExpiresAt: body.daemonTokenExpiresAt,
|
|
67
117
|
operatorEmail: body.operatorEmail,
|
|
68
118
|
});
|
|
119
|
+
console.log(JSON.stringify({ status: 'ready', profile, daemonId: body.daemonId, operatorEmail: body.operatorEmail }, null, 2));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (body.status === 'approved') {
|
|
123
|
+
// Approved but token window closed (token_delivered_at set or KV expired) — need a fresh claim
|
|
124
|
+
console.log(JSON.stringify({ status: 'approved_no_token', profile, claimUrl: existing.claimUrl, message: 'Approved but token delivery window closed. Run: harbor setup' }, null, 2));
|
|
125
|
+
return;
|
|
69
126
|
}
|
|
70
127
|
console.log(JSON.stringify({ profile, ...body, claimUrl: existing.claimUrl }, null, 2));
|
|
71
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAClF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe;IAC5C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAClF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvI,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,gFAAgF;IAChF,qDAAqD;IACrD,IAAI,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,qBAAqB,QAAQ,CAAC,OAAO,EAAE,EAAE;gBAClF,OAAO,EAAE,EAAE,sBAAsB,EAAE,QAAQ,CAAC,UAAU,EAAE;aACzD,CAAC,CAAC;YACH,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,EAMtC,CAAC;gBAEF,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBAC/D,WAAW,CAAC;wBACV,GAAG,QAAQ;wBACX,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;wBAClD,WAAW,EAAE,UAAU,CAAC,WAAW;wBACnC,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;wBACrD,aAAa,EAAE,UAAU,CAAC,aAAa;qBACxC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAChK,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC1E,2EAA2E;gBAC7E,CAAC;qBAAM,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC3C,oDAAoD;oBACpD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;wBACzB,MAAM,EAAE,SAAS;wBACjB,OAAO;wBACP,QAAQ,EAAE,QAAQ,CAAC,QAAQ;wBAC3B,OAAO,EAAE,qGAAqG;qBAC/G,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,mBAAmB,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAM1B,CAAC;IAEF,WAAW,CAAC;QACV,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,8FAA8F;KACxG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEb,mDAAmD;IACnD,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;YAAE,SAAS;QACvC,IAAI,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QACpD,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9E,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,oBAAoB,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,qBAAqB,QAAQ,CAAC,OAAO,EAAE,EAAE;QAC5E,OAAO,EAAE,EAAE,sBAAsB,EAAE,QAAQ,CAAC,UAAU,EAAE;KACzD,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,kDAAkD;YAClD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,+CAA+C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjI,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAM1B,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACnD,WAAW,CAAC;YACV,GAAG,QAAQ;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/H,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,+FAA+F;QAC/F,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,8DAA8D,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACrL,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { runWhoami } from './commands/whoami.js';
|
|
|
11
11
|
import { runPlugins } from './commands/plugins.js';
|
|
12
12
|
import { runUpdate } from './commands/update.js';
|
|
13
13
|
import { runDoctor } from './commands/doctor.js';
|
|
14
|
+
import { runReset } from './commands/reset.js';
|
|
14
15
|
import { runSkills } from './commands/skills.js';
|
|
15
16
|
import { runAgents } from './commands/agents.js';
|
|
16
17
|
maybeCheckForUpdate();
|
|
@@ -62,6 +63,7 @@ runs:
|
|
|
62
63
|
|
|
63
64
|
system:
|
|
64
65
|
doctor run diagnostic checks
|
|
66
|
+
doctor --reset kill daemon, wipe ~/.harbor, clean agent configs, upgrade
|
|
65
67
|
update update harbor to the latest version
|
|
66
68
|
|
|
67
69
|
options:
|
|
@@ -125,7 +127,13 @@ else if (command === 'skills') {
|
|
|
125
127
|
runSkills(rest, json);
|
|
126
128
|
}
|
|
127
129
|
else if (command === 'doctor') {
|
|
128
|
-
|
|
130
|
+
if (rest.includes('--reset')) {
|
|
131
|
+
const upgrade = !rest.includes('--no-upgrade');
|
|
132
|
+
await runReset({ upgrade, json, yes: rest.includes('--yes') || rest.includes('-y') });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
await runDoctor(profile, json);
|
|
136
|
+
}
|
|
129
137
|
}
|
|
130
138
|
else if (command === 'update') {
|
|
131
139
|
await runUpdate();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC;AAEV,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,mBAAmB,EAAE,CAAC;AAEtB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;AACxB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;AAEvC,SAAS,WAAW,CAAC,IAAc,EAAE,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-embedded.d.ts","sourceRoot":"","sources":["../src/skills-embedded.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAErF,eAAO,MAAM,MAAM,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"skills-embedded.d.ts","sourceRoot":"","sources":["../src/skills-embedded.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAErF,eAAO,MAAM,MAAM,EAAE,aAAa,EA2PjC,CAAC;AAEF,eAAO,MAAM,SAAS,4BAAwC,CAAC"}
|
package/dist/skills-embedded.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
export const SKILLS = [
|
|
3
3
|
{
|
|
4
4
|
name: "ai-grok",
|
|
5
|
-
description: "Use Harbor to chat with xAI's Grok models. Chat completions
|
|
6
|
-
content: "---\nname: ai-grok\ndescription: Use Harbor to chat with xAI's Grok models. Chat completions
|
|
5
|
+
description: "Use Harbor to chat with xAI's Grok models. Chat completions and live web search via the Responses API.",
|
|
6
|
+
content: "---\nname: ai-grok\ndescription: Use Harbor to chat with xAI's Grok models. Chat completions and live web search via the Responses API.\n---\n\nChat with xAI's Grok models through Harbor. Runs server-side on orbital — the `XAI_API_KEY` never leaves the server. The agent passes arguments via `harbor p.ai.grok <tool>`.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `chat` | Chat completion with Grok | `--model`, `--messages` |\n| `search` | Web/X-grounded response with live search (Responses API) | `--model`, `--input`, `--tools` |\n| `embeddings` | Generate text embeddings | `--model`, `--input` |\n| `models` | List available Grok models | — |\n\n## Examples\n\n```bash\n# Plain chat\nharbor p.ai.grok chat --model \"grok-3-mini\" --messages '[{\"role\":\"user\",\"content\":\"Explain distributed consensus\"}]'\n\n# Live web search (use search, not chat)\nharbor p.ai.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"What happened in tech news today?\"}]'\n\n# X (Twitter) search\nharbor p.ai.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"What is Elon Musk saying about AI?\"}]' --tools '[{\"type\":\"x_search\",\"allowed_x_handles\":[\"elonmusk\"]}]'\n\n# Both web and X search together\nharbor p.ai.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"Latest xAI news\"}]' --tools '[{\"type\":\"web_search\"},{\"type\":\"x_search\"}]'\n\n# Web search restricted to specific domains\nharbor p.ai.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"Latest releases\"}]' --tools '[{\"type\":\"web_search\",\"filters\":{\"allowed_domains\":[\"github.com\"]}}]'\n\nharbor p.ai.grok embeddings --input \"Hello world\"\nharbor p.ai.grok models\n```\n\n## Parameters\n\n### chat\n- `--model` (string, required) — model ID (e.g. `grok-3`, `grok-3-mini`)\n- `--messages` (JSON array, required) — array of `{role, content}` message objects\n- `--max_tokens` (number) — maximum tokens in response\n- `--temperature` (number, 0-2) — sampling temperature\n- `--top_p` (number) — nucleus sampling\n- `--stream` (boolean) — enable streaming\n\n### search\nUses the xAI Responses API (`/v1/responses`). This is the correct endpoint for live search — the Chat Completions endpoint deprecated both `x_search` and `web_search` on January 12, 2026 (now returns 410).\n- `--model` (string, required) — model ID (e.g. `grok-3-mini`)\n- `--input` (JSON array, required) — array of `{role, content}` message objects\n- `--tools` (JSON array) — one or more tool objects. Omit to default to `web_search` only.\n\n**web_search tool options** (params go inside a `filters` key):\n```json\n{\"type\": \"web_search\", \"filters\": {\"allowed_domains\": [\"example.com\"]}}\n{\"type\": \"web_search\", \"filters\": {\"excluded_domains\": [\"reddit.com\"]}}\n{\"type\": \"web_search\", \"enable_image_understanding\": true}\n```\n\n**x_search tool options** (params go directly on the tool object, not in `filters`):\n```json\n{\"type\": \"x_search\", \"allowed_x_handles\": [\"elonmusk\", \"OpenAI\"]}\n{\"type\": \"x_search\", \"excluded_x_handles\": [\"spam_account\"]}\n{\"type\": \"x_search\", \"from_date\": \"2025-01-01\", \"to_date\": \"2025-12-31\"}\n{\"type\": \"x_search\", \"enable_image_understanding\": true, \"enable_video_understanding\": true}\n```\nMax 10 handles. `allowed_x_handles` and `excluded_x_handles` are mutually exclusive.\n\n### embeddings\n- `--model` (string, required, default: `embedding-beta`) — embedding model ID\n- `--input` (string, required) — text to embed\n\n### models\nNo parameters — lists all available Grok models.\n\n## Secrets\n\nOperator configures `XAI_API_KEY` — an API key from [x.ai](https://x.ai).\n\n## Notes\n\n- **Use `search` for live web search, not `chat`.** The Chat Completions endpoint deprecated web search support. The `search` tool uses the Responses API which is the current standard.\n- `models` tool returns the full list of available model IDs.\n- Grok models tend to be less filtered than other providers — useful for unbiased analysis.\n\n## Discovery\n\nRun `harbor plugins tools ai.grok` to see all available tools and parameters.\nRun `harbor plugins tools ai.grok --json` for machine-readable specs.\n",
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
name: "ai-openrouter",
|
|
@@ -100,10 +100,155 @@ export const SKILLS = [
|
|
|
100
100
|
description: "Use Harbor to run Linear commands. Issue tracking, project management, and workflow automation.",
|
|
101
101
|
content: "---\nname: services-linear\ndescription: Use Harbor to run Linear commands. Issue tracking, project management, and workflow automation.\n---\n\nRun Linear CLI (`linear`, from `schpet/linear-cli`) commands through Harbor for issue tracking, project management, cycles, labels, documents, and raw GraphQL queries.\n\n## Prerequisites\n\nThe CLI binary is `linear` from [schpet/linear-cli](https://github.com/schpet/linear-cli) — agent-friendly, Deno/Rust-based. **Not** `@linear/cli` (whose binary is `lin` — a Git checkout helper, not a full issue manager).\n\n### macOS\n\n```bash\nbrew install schpet/tap/linear\n```\n\n### Linux / any platform (npm)\n\n```bash\nnpm install -g @schpet/linear-cli\n# or: pnpm add -g @schpet/linear-cli\n# or: bun add -g @schpet/linear-cli\n```\n\nPre-built binaries also available at https://github.com/schpet/linear-cli/releases/latest\n\n### Authentication\n\nCreate an API key at [linear.app/settings/account/security](https://linear.app/settings/account/security), then:\n\n```bash\nlinear auth\nlinear config # configure default team and workspace\n```\n\n## Commands\n\n### Issues\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear issue list` | List your issues (default: unstarted state) |\n| `harbor p.services.linear issue list --state started` | Filter by state (`triage`, `backlog`, `unstarted`, `started`, `completed`, `canceled`) |\n| `harbor p.services.linear issue list --all-states` | Show all states |\n| `harbor p.services.linear issue list --all-assignees` | Show all assignees |\n| `harbor p.services.linear issue list --team ENG` | Filter by team |\n| `harbor p.services.linear issue list --project \"Q2 Launch\"` | Filter by project |\n| `harbor p.services.linear issue list --cycle active` | Filter by cycle |\n| `harbor p.services.linear issue list --limit 100` | Set max results (default: 50, 0 = unlimited) |\n| `harbor p.services.linear issue create --title \"...\" --team ENG` | Create an issue |\n| `harbor p.services.linear issue update ENG-123 --state \"In Progress\"` | Update issue state |\n| `harbor p.services.linear issue view ENG-123` | View issue details |\n| `harbor p.services.linear issue start ENG-123` | Start working on an issue |\n| `harbor p.services.linear issue delete ENG-123` | Delete an issue |\n| `harbor p.services.linear issue comment ENG-123` | Manage issue comments |\n| `harbor p.services.linear issue attach ENG-123 ./file.png` | Attach a file |\n\n### Teams\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear team list` | List teams |\n| `harbor p.services.linear team create` | Create a team |\n\n### Projects\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear project list` | List projects |\n| `harbor p.services.linear project view <id>` | View project details |\n| `harbor p.services.linear project create` | Create a project |\n| `harbor p.services.linear project update <id>` | Update a project |\n\n### Cycles\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear cycle list` | List cycles for a team |\n| `harbor p.services.linear cycle view <ref>` | View cycle details |\n\n### Labels\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear label list` | List issue labels |\n| `harbor p.services.linear label create` | Create a label |\n| `harbor p.services.linear label delete <name>` | Delete a label |\n\n### Documents\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear document list` | List documents |\n| `harbor p.services.linear document view <id>` | View document content |\n| `harbor p.services.linear document create` | Create a document |\n| `harbor p.services.linear document update <id>` | Update a document |\n\n### Raw API\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.services.linear api '{ viewer { id name } }'` | Run a raw GraphQL query |\n| `harbor p.services.linear api --paginate '{ issues { nodes { id title } } }'` | Auto-paginate results |\n\n## Examples\n\n```bash\n# List your in-progress issues\nharbor p.services.linear issue list --state started\n\n# List all issues across all states and assignees\nharbor p.services.linear issue list --all-states --all-assignees --team ENG\n\n# Create a high-priority bug\nharbor p.services.linear issue create \\\n --title \"Auth timeout on mobile\" \\\n --team ENG \\\n --label bug \\\n --priority 2 \\\n --assignee self \\\n --description \"Users see a timeout after 30s on iOS\"\n\n# Create issue with description from file\nharbor p.services.linear issue create \\\n --title \"RFC: New auth flow\" \\\n --team ENG \\\n --description-file ./rfc.md\n\n# Move issue to done\nharbor p.services.linear issue update ENG-123 --state \"Done\"\n\n# Add a label and change priority\nharbor p.services.linear issue update ENG-123 --label urgent --priority 1\n\n# View issue details\nharbor p.services.linear issue view ENG-123\n\n# List issues in the active cycle\nharbor p.services.linear issue list --cycle active\n\n# List projects\nharbor p.services.linear project list\n\n# Raw GraphQL: get all high-priority issues\nharbor p.services.linear api '{ issues(filter: { priority: { eq: 1 } }) { nodes { identifier title } } }'\n\n# Target a specific workspace\nharbor p.services.linear --workspace my-org issue list\n```\n\n## Secrets\n\nThe operator must configure:\n- `LINEAR_API_KEY` — Linear personal API key\n\nGet it from [Linear Settings → API → Personal API keys](https://linear.app/settings/api).\n\n## Error handling\n\n| Error | Fix |\n|-------|-----|\n| `Unauthorized` or `Not authenticated` | Operator needs to set LINEAR_API_KEY. Use `harbor msg` to request. |\n| `Team not found` | Check team key with `harbor p.services.linear team list`. |\n| `Issue not found` | Verify issue identifier (e.g., ENG-123) exists and is in the target workspace. |\n| `Workspace not found` | Pass `--workspace <slug>` if you have multiple workspaces. |\n\n## Discovery\n\nRun `harbor plugins tools services.linear` to see all available tools and parameters.\nRun `harbor plugins tools services.linear --json` for machine-readable specs.\n",
|
|
102
102
|
},
|
|
103
|
+
{
|
|
104
|
+
name: "search-parallel",
|
|
105
|
+
description: "Use Harbor to search the web and run async deep research via Parallel.ai. AI-powered search, content extraction, and research tasks.",
|
|
106
|
+
content: "---\nname: search-parallel\ndescription: Use Harbor to search the web and run async deep research via Parallel.ai.\n---\n\nAI-powered web search, URL extraction, and async research via Parallel.ai through Harbor. Runs server-side on orbital — `PARALLEL_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `search` | AI-powered web search | `--objective`, `--mode`, `--max_results` |\n| `extract` | Extract clean content from URLs | `--urls`, `--objective` |\n| `create_task` | Create async deep research task | `--input`, `--processor` |\n| `get_task` | Poll async task for status | `--run_id` |\n| `get_task_result` | Get completed task result | `--run_id` |\n\n## Examples\n\n```bash\nharbor p.search.parallel search --objective \"Latest Cloudflare Workers pricing\"\nharbor p.search.parallel search --objective \"React 19 features\" --mode agentic --max_results 20\nharbor p.search.parallel extract --urls '[\"https://example.com\"]' --objective \"pricing information\"\n\n# Async deep research\nRUN=$(harbor p.search.parallel create_task --input \"What are the tradeoffs of Raft vs Paxos?\" --processor ultra)\nharbor p.search.parallel get_task_result --run_id \"$RUN_ID\"\n```\n\n## Parameters\n\n### search\n- `--objective` (string, required) — natural language search goal\n- `--mode` (string) — `one-shot` (default), `agentic`, or `fast`\n- `--max_results` (number, default: 10)\n- `--search_queries` (JSON array) — specific keyword queries\n- `--source_policy` (JSON object) — `{include_domains, exclude_domains}`\n\n### extract\n- `--urls` (JSON array, required) — URLs to extract content from\n- `--objective` (string) — focus extraction on a goal\n- `--full_content` (boolean) — return full page content\n\n### create_task\n- `--input` (string, required) — research question\n- `--processor` (string) — `core`, `base` (default), or `ultra`\n- `--task_spec` (JSON object) — optional `{output_schema}` for structured output\n\n## Secrets\n\nOperator configures `PARALLEL_API_KEY` from [parallel.ai](https://parallel.ai).\n\n## Discovery\n\nRun `harbor plugins tools search.parallel` to see all available tools.\n",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "audio-elevenlabs",
|
|
110
|
+
description: "Use Harbor to generate speech and sound effects via ElevenLabs. TTS, voice listing, and sound generation.",
|
|
111
|
+
content: "---\nname: audio-elevenlabs\ndescription: Use Harbor to generate speech and sound effects via ElevenLabs.\n---\n\nText-to-speech and sound effects via ElevenLabs through Harbor. Runs server-side on orbital — `ELEVENLABS_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `text_to_speech` | Convert text to speech | `--voice_id`, `--text`, `--model_id` |\n| `sound_effects` | Generate sound effects from text | `--text`, `--duration_seconds` |\n| `voices` | List available voices | — |\n\n## Examples\n\n```bash\n# List voices to find a voice_id\nharbor p.audio.elevenlabs voices\n\n# Text to speech\nharbor p.audio.elevenlabs text_to_speech --voice_id \"21m00Tcm4TlvDq8ikWAM\" --text \"Hello world\" --model_id eleven_turbo_v2\n\n# Sound effects\nharbor p.audio.elevenlabs sound_effects --text \"thunder rumbling in the distance\" --duration_seconds 5\n```\n\n## Parameters\n\n### text_to_speech\n- `--voice_id` (string, required) — voice ID (get from `voices`)\n- `--text` (string, required) — text to synthesize\n- `--model_id` (string, default: `eleven_monolingual_v1`) — TTS model\n- `--voice_settings` (JSON object) — `{stability, similarity_boost, style, use_speaker_boost}`\n\n### sound_effects\n- `--text` (string, required) — description of sound to generate\n- `--duration_seconds` (number) — desired duration\n\n## Secrets\n\nOperator configures `ELEVENLABS_API_KEY` from [elevenlabs.io](https://elevenlabs.io).\n\n## Discovery\n\nRun `harbor plugins tools audio.elevenlabs` to see all available tools.\n",
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "audio-deepgram",
|
|
115
|
+
description: "Use Harbor to transcribe audio and synthesize speech via Deepgram. STT and TTS.",
|
|
116
|
+
content: "---\nname: audio-deepgram\ndescription: Use Harbor to transcribe audio and synthesize speech via Deepgram.\n---\n\nSpeech-to-text transcription and Aura TTS via Deepgram through Harbor. Runs server-side on orbital — `DEEPGRAM_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `transcribe_url` | Transcribe audio from a URL | `--url`, `--model`, `--language` |\n| `text_to_speech` | Synthesize speech (Aura) | `--text`, `--model` |\n\n## Examples\n\n```bash\nharbor p.audio.deepgram transcribe_url --url \"https://example.com/audio.mp3\"\nharbor p.audio.deepgram transcribe_url --url \"https://example.com/call.wav\" --model nova-2 --language en --smart_format true\nharbor p.audio.deepgram text_to_speech --text \"Hello, world\" --model aura-asteria-en\n```\n\n## Parameters\n\n### transcribe_url\n- `--url` (string, required) — URL of audio to transcribe\n- `--model` (string, default: `nova-2`) — transcription model\n- `--language` (string) — language code (e.g. `en`, `es`)\n- `--punctuate` (boolean, default: true)\n- `--smart_format` (boolean, default: true)\n\n### text_to_speech\n- `--text` (string, required) — text to synthesize\n- `--model` (string, default: `aura-asteria-en`) — Aura voice model\n\n## Secrets\n\nOperator configures `DEEPGRAM_API_KEY` from [deepgram.com](https://deepgram.com).\n\n## Discovery\n\nRun `harbor plugins tools audio.deepgram` to see all available tools.\n",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: "web-firecrawl",
|
|
120
|
+
description: "Use Harbor to scrape, crawl, extract, and search the web via Firecrawl. Full-fidelity page content as markdown.",
|
|
121
|
+
content: "---\nname: web-firecrawl\ndescription: Use Harbor to scrape, crawl, extract, and search the web via Firecrawl.\n---\n\nWeb scraping, crawling, structured extraction, and search via Firecrawl through Harbor. Runs server-side on orbital — `FIRECRAWL_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `scrape` | Scrape a single URL | `--url`, `--formats`, `--onlyMainContent` |\n| `crawl` | Crawl a site (async, returns job ID) | `--url`, `--limit`, `--maxDiscoveryDepth` |\n| `extract` | Extract structured data from URLs | `--urls`, `--prompt`, `--schema` |\n| `map` | Discover all URLs on a site | `--url`, `--search`, `--limit` |\n| `search` | Search web and return scraped content | `--query`, `--limit` |\n\n## Examples\n\n```bash\n# Scrape a page as markdown\nharbor p.web.firecrawl scrape --url \"https://docs.example.com/api\"\n\n# Crawl site (up to 50 pages)\nharbor p.web.firecrawl crawl --url \"https://docs.example.com\" --limit 50\n\n# Extract structured data\nharbor p.web.firecrawl extract --urls '[\"https://shop.example.com/product\"]' --prompt \"Extract product name, price, and availability\"\n\n# Discover all URLs\nharbor p.web.firecrawl map --url \"https://example.com\" --limit 200\n\n# Search and scrape\nharbor p.web.firecrawl search --query \"cloudflare workers pricing\" --limit 5\n```\n\n## Parameters\n\n### scrape\n- `--url` (string, required)\n- `--formats` (JSON array, default: `[\"markdown\"]`) — `markdown`, `html`, `rawHtml`, `links`, `screenshot`\n- `--onlyMainContent` (boolean, default: true)\n- `--waitFor` (number) — ms to wait for dynamic content\n\n### crawl / map / extract — see `harbor plugins tools web.firecrawl --json` for full schemas\n\n## Secrets\n\nOperator configures `FIRECRAWL_API_KEY` from [firecrawl.dev](https://firecrawl.dev).\n\n## Discovery\n\nRun `harbor plugins tools web.firecrawl` to see all available tools.\n",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "web-supadata",
|
|
125
|
+
description: "Use Harbor to get video transcripts, social media metadata, AI extraction, and web scraping via Supadata. Supports YouTube, TikTok, Instagram, X, and Facebook.",
|
|
126
|
+
content: "---\nname: web-supadata\ndescription: Use Harbor to get video transcripts, social media metadata, and web scraping via Supadata.\n---\n\nVideo transcripts, social metadata, AI extraction, and web scraping from YouTube, TikTok, Instagram, X/Twitter, and Facebook via Supadata through Harbor.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `transcript` | Get video transcript | `--url`, `--lang`, `--text` |\n| `metadata` | Fetch social post metadata | `--url` |\n| `extract` | AI-powered video data extraction (async) | `--url`, `--prompt`, `--schema` |\n| `extract_result` | Poll extract job | `--jobId` |\n| `scrape` | Scrape web page as markdown | `--url` |\n| `crawl` | Crawl website (async) | `--url`, `--maxPages` |\n| `map` | Discover site URLs | `--url` |\n| `youtube_video` | Get YouTube video metadata | `--videoId` |\n| `youtube_channel` | Get YouTube channel info | `--id` or `--handle` |\n| `youtube_search` | Search YouTube | `--query`, `--limit`, `--type` |\n\n## Examples\n\n```bash\n# Get transcript from a YouTube video\nharbor p.web.supadata transcript --url \"https://youtube.com/watch?v=dQw4w9WgXcQ\"\n\n# Get metadata from a TikTok post\nharbor p.web.supadata metadata --url \"https://tiktok.com/@user/video/123\"\n\n# Search YouTube\nharbor p.web.supadata youtube_search --query \"Cloudflare Workers tutorial\" --limit 10 --type video\n\n# Get YouTube channel info\nharbor p.web.supadata youtube_channel --handle \"@cloudflare\"\n\n# Scrape a web page\nharbor p.web.supadata scrape --url \"https://example.com/article\"\n```\n\n## Secrets\n\nOperator configures `SUPADATA_API_KEY` from [supadata.ai](https://supadata.ai).\n\n## Discovery\n\nRun `harbor plugins tools web.supadata` to see all available tools.\n",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "web-jina",
|
|
130
|
+
description: "Use Harbor for embeddings and reranking via Jina AI. Semantic search, RAG pipelines, and document ranking.",
|
|
131
|
+
content: "---\nname: web-jina\ndescription: Use Harbor for embeddings and reranking via Jina AI.\n---\n\nEmbeddings and reranking via Jina AI through Harbor. Useful for semantic search, RAG, and document ranking.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `embed` | Generate text/image embeddings | `--input`, `--model`, `--task` |\n| `rerank` | Rerank documents by relevance | `--query`, `--documents`, `--top_n` |\n\n## Examples\n\n```bash\n# Embed texts for retrieval\nharbor p.web.jina embed --input '[\"query text\"]' --task retrieval.query\nharbor p.web.jina embed --input '[\"doc 1\",\"doc 2\"]' --task retrieval.passage\n\n# Rerank search results\nharbor p.web.jina rerank --query \"What is RAG?\" --documents '[\"RAG stands for...\",\"Another doc...\"]' --top_n 3\n```\n\n## Parameters\n\n### embed\n- `--input` (JSON array, required) — texts (or image URLs for clip models)\n- `--model` (string, default: `jina-embeddings-v3`) — also: `jina-clip-v2`\n- `--task` (string, default: `retrieval.query`) — `retrieval.query`, `retrieval.passage`, `separation`, `classification`, `text-matching`\n- `--dimensions` (number) — 256, 512, or 1024\n- `--normalized` (boolean, default: true)\n\n### rerank\n- `--query` (string, required)\n- `--documents` (JSON array, required)\n- `--model` (string, default: `jina-reranker-v3`)\n- `--top_n` (number, default: 5)\n\n## Secrets\n\nOperator configures `JINA_API_KEY` from [jina.ai](https://jina.ai).\n\n## Discovery\n\nRun `harbor plugins tools web.jina` to see all available tools.\n",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "web-diffbot",
|
|
135
|
+
description: "Use Harbor to extract structured data from any URL via Diffbot. Articles, products, discussions, and images — auto-detected.",
|
|
136
|
+
content: "---\nname: web-diffbot\ndescription: Use Harbor to extract structured data from any URL via Diffbot.\n---\n\nAuto-classify and extract structured data from any URL via Diffbot through Harbor. Returns article text, product data, discussion threads, or image URLs — automatically detected.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `analyze` | Auto-detect type and extract | `--url`, `--token`, `--discussion` |\n| `article` | Extract article content | `--url`, `--token`, `--paging` |\n| `product` | Extract product data | `--url`, `--token`, `--discussion` |\n| `discussion` | Extract forum/comment threads | `--url`, `--token`, `--maxPages` |\n| `image` | Extract image data | `--url`, `--token` |\n\n## Examples\n\n```bash\n# Auto-detect and extract (easiest)\nharbor p.web.diffbot analyze --token \"$TOKEN\" --url \"https://techcrunch.com/article/...\"\n\n# Extract article content\nharbor p.web.diffbot article --token \"$TOKEN\" --url \"https://example.com/blog-post\"\n\n# Extract product\nharbor p.web.diffbot product --token \"$TOKEN\" --url \"https://amazon.com/dp/B08...\"\n```\n\n## Parameters (common across tools)\n- `--token` (string, required) — Diffbot API token\n- `--url` (string, required) — URL to extract\n- `--fields` (string) — comma-separated fields (e.g. `title,text,images`)\n- `--timeout` (number, default: 30000) — ms\n- `--discussion` (boolean) — include comments/reviews\n- `--paging` (boolean) — follow multi-page articles\n\n## Secrets\n\nOperator configures `DIFFBOT_TOKEN` from [diffbot.com](https://diffbot.com).\n\n## Notes\n\n- `analyze` is the best default — it auto-detects the page type.\n- The `--token` is passed as a query param; use the secret configured by the operator.\n\n## Discovery\n\nRun `harbor plugins tools web.diffbot` to see all available tools.\n",
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: "web-scrapingbee",
|
|
140
|
+
description: "Use Harbor to scrape any URL with JS rendering, proxy rotation, and anti-bot bypass via ScrapingBee.",
|
|
141
|
+
content: "---\nname: web-scrapingbee\ndescription: Use Harbor to scrape any URL with JS rendering and anti-bot bypass via ScrapingBee.\n---\n\nProxy-backed web scraping with JS rendering, anti-bot bypass, AI extraction, and screenshots via ScrapingBee through Harbor.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `scrape` | Scrape with JS rendering | `--url`, `--api_key`, `--return_page_markdown` |\n| `screenshot` | Screenshot a page | `--url`, `--api_key`, `--screenshot_full_page` |\n| `ai_extract` | AI extraction from page | `--url`, `--api_key`, `--ai_query` |\n| `usage` | Check remaining credits | `--api_key` |\n\n## Examples\n\n```bash\n# Scrape with JS rendering, return markdown\nharbor p.web.scrapingbee scrape --api_key \"$KEY\" --url \"https://spa-example.com\" --return_page_markdown true\n\n# Scrape with premium proxy (US)\nharbor p.web.scrapingbee scrape --api_key \"$KEY\" --url \"https://example.com\" --premium_proxy true --country_code us\n\n# AI extraction\nharbor p.web.scrapingbee ai_extract --api_key \"$KEY\" --url \"https://example.com\" --ai_query \"What is the product price?\"\n\n# Full-page screenshot\nharbor p.web.scrapingbee screenshot --api_key \"$KEY\" --url \"https://example.com\" --screenshot_full_page true\n```\n\n## Secrets\n\nOperator configures `SCRAPINGBEE_API_KEY` from [scrapingbee.com](https://scrapingbee.com).\n\n## Notes\n\n- The `--api_key` param uses the operator-configured secret value at runtime.\n- Use `--premium_proxy true` for hard-to-scrape sites (costs more credits).\n- `--return_page_markdown true` is the most agent-friendly output format.\n\n## Discovery\n\nRun `harbor plugins tools web.scrapingbee` to see all available tools.\n",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "memory-mem0",
|
|
145
|
+
description: "Use Harbor to store, search, and manage AI memories via Mem0. Persistent user memory with auto-dedup and contradiction resolution.",
|
|
146
|
+
content: "---\nname: memory-mem0\ndescription: Use Harbor to store, search, and manage AI memories via Mem0.\n---\n\nPersistent AI memory layer via Mem0 through Harbor. Store conversation memories, search them semantically, and manage per-user/agent/app scoping.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `add_memory` | Store memories from messages or text | `--messages` or `--text`, `--user_id` |\n| `search_memories` | Semantic search across memories | `--query`, `--filters`, `--top_k` |\n| `get_all_memories` | List all memories for a user/agent | `--filters` |\n| `get_memory` | Get a memory by ID | `--memory_id` |\n| `update_memory` | Update memory text | `--memory_id`, `--text` |\n| `delete_memory` | Delete a memory | `--memory_id` |\n| `delete_all_memories` | Delete all memories matching filters | `--filters` |\n| `memory_history` | Get edit history of a memory | `--memory_id` |\n| `list_entities` | List all users with memories | — |\n| `batch_delete` | Delete multiple memories | `--memory_ids` |\n\n## Examples\n\n```bash\n# Store memories from a conversation\nharbor p.memory.mem0 add_memory --user_id alice --messages '[{\"role\":\"user\",\"content\":\"I prefer TypeScript over Python\"}]'\n\n# Store a raw fact\nharbor p.memory.mem0 add_memory --user_id alice --text \"Alice is a senior engineer at Stripe\"\n\n# Search memories\nharbor p.memory.mem0 search_memories --query \"programming preferences\" --filters '{\"user_id\":\"alice\"}' --top_k 5\n\n# List all memories for a user\nharbor p.memory.mem0 get_all_memories --filters '{\"user_id\":\"alice\"}'\n\n# Delete all memories for a user\nharbor p.memory.mem0 delete_all_memories --filters '{\"user_id\":\"alice\"}'\n```\n\n## Secrets\n\nOperator configures `MEM0_API_KEY` from [mem0.ai](https://mem0.ai).\n\n## Notes\n\n- Mem0 auto-deduplicates and resolves contradictions when adding memories.\n- Scope memories with `user_id`, `agent_id`, `app_id`, or `session_id`.\n- Use `search_memories` with `rerank: true` for better relevance.\n\n## Discovery\n\nRun `harbor plugins tools memory.mem0` to see all available tools.\n",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "memory-zep",
|
|
150
|
+
description: "Use Harbor for temporal knowledge graph memory via Zep. Sessions, messages, facts, and graph-based retrieval.",
|
|
151
|
+
content: "---\nname: memory-zep\ndescription: Use Harbor for temporal knowledge graph memory via Zep.\n---\n\nTemporal knowledge graph memory via Zep through Harbor. Track how facts change over time with sessions, messages, and graph-based entity/relationship retrieval.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `create_user` | Create a user | `--user_id`, `--email` |\n| `get_user` | Get user details | `--userId` |\n| `delete_user` | Delete user and all data | `--userId` |\n| `create_session` | Create a conversation session | `--session_id`, `--user_id` |\n| `get_session` | Get session details | `--sessionId` |\n| `add_messages` | Add messages to session | `--sessionId`, `--messages` |\n| `get_messages` | Get messages from session | `--sessionId`, `--limit` |\n| `get_session_memory` | Get extracted facts + summary | `--sessionId`, `--lastn` |\n| `add_graph_data` | Add data to user knowledge graph | `--userId`, `--data`, `--type` |\n| `search_graph` | Semantic search over graph | `--userId`, `--query`, `--scope` |\n| `get_edges` | Get fact edges from graph | `--userId` |\n| `get_nodes` | Get entity nodes from graph | `--userId` |\n\n## Examples\n\n```bash\n# Set up a user and session\nharbor p.memory.zep create_user --user_id alice --email alice@example.com\nharbor p.memory.zep create_session --session_id s-123 --user_id alice\n\n# Add conversation messages\nharbor p.memory.zep add_messages --sessionId s-123 --messages '[{\"role_type\":\"user\",\"content\":\"I prefer dark mode\"}]'\n\n# Get extracted memory for context injection\nharbor p.memory.zep get_session_memory --sessionId s-123\n\n# Add facts to the knowledge graph\nharbor p.memory.zep add_graph_data --userId alice --data \"Alice is the lead engineer on project Phoenix\" --type text\n\n# Search the knowledge graph\nharbor p.memory.zep search_graph --userId alice --query \"projects\" --scope edges\n```\n\n## Secrets\n\nOperator configures `ZEP_API_KEY` from [getzep.com](https://www.getzep.com).\n\n## Discovery\n\nRun `harbor plugins tools memory.zep` to see all available tools.\n",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: "memory-supermemory",
|
|
155
|
+
description: "Use Harbor to store documents, extract memories, and search across them via Supermemory. Container-scoped multi-tenant memory + RAG.",
|
|
156
|
+
content: "---\nname: memory-supermemory\ndescription: Use Harbor to store documents, extract memories, and search via Supermemory.\n---\n\nMemory + RAG API via Supermemory through Harbor. Store documents, extract memories automatically, build user profiles, and search with knowledge graph enrichment. Multi-tenant via container tags.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `add_document` | Store a document | `--content`, `--containerTags`, `--metadata` |\n| `batch_add_documents` | Store multiple documents | `--documents` |\n| `ingest_conversation` | Ingest a conversation thread | `--conversation_id`, `--messages` |\n| `search` | Semantic search across documents | `--query`, `--containerTags`, `--topK` |\n| `get_document` | Get document by ID | `--id` |\n| `list_documents` | List documents | `--containerTags`, `--page` |\n| `get_memories` | Get auto-extracted memories | `--containerTag` |\n| `search_memories` | Search extracted memories | `--query`, `--containerTags` |\n| `update_document` | Update document content | `--id`, `--content` |\n| `delete_document` | Delete a document | `--id` |\n| `get_spaces` | List container spaces | — |\n| `update_space` | Configure memory/RAG per space | `--tag`, `--memoryEnabled` |\n\n## Examples\n\n```bash\n# Store a document scoped to a user\nharbor p.memory.supermemory add_document --content \"Meeting notes: Q3 planning session...\" --containerTags '[\"user:alice\"]'\n\n# Search within a user's scope\nharbor p.memory.supermemory search --query \"Q3 planning\" --containerTags '[\"user:alice\"]' --topK 5\n\n# Ingest a conversation for context\nharbor p.memory.supermemory ingest_conversation --conversation_id conv-1 --messages '[{\"role\":\"user\",\"content\":\"...\"}]'\n\n# Get auto-extracted memories\nharbor p.memory.supermemory get_memories --containerTag user:alice\n```\n\n## Secrets\n\nOperator configures `SUPERMEMORY_API_KEY` from [supermemory.ai](https://supermemory.ai).\n\n## Discovery\n\nRun `harbor plugins tools memory.supermemory` to see all available tools.\n",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "chat-slack",
|
|
160
|
+
description: "Use Harbor to post messages, read channels, react, and upload files in Slack workspaces.",
|
|
161
|
+
content: "---\nname: chat-slack\ndescription: Use Harbor to post messages, read channels, react, and upload files in Slack workspaces.\n---\n\nSlack bot API via Harbor. Post messages, read history, manage threads, and react to messages. Runs server-side on orbital — `SLACK_BOT_TOKEN` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `post_message` | Post to a channel or thread | `--channel`, `--text`, `--thread_ts` |\n| `update_message` | Edit a message | `--channel`, `--ts`, `--text` |\n| `list_channels` | List accessible channels | `--types`, `--limit` |\n| `channel_history` | Read message history | `--channel`, `--limit` |\n| `thread_replies` | Read thread replies | `--channel`, `--ts` |\n| `add_reaction` | React to a message | `--channel`, `--timestamp`, `--name` |\n| `upload_file` | Upload text content as file | `--channels`, `--content`, `--filename` |\n\n## Examples\n\n```bash\n# Post to a channel\nharbor p.chat.slack post_message --channel C1234567890 --text \"Deployment complete :rocket:\"\n\n# Reply in a thread\nharbor p.chat.slack post_message --channel C1234567890 --thread_ts \"1234567890.123456\" --text \"Done!\"\n\n# Read recent messages\nharbor p.chat.slack channel_history --channel C1234567890 --limit 10\n\n# Add a reaction\nharbor p.chat.slack add_reaction --channel C1234567890 --timestamp \"1234567890.123456\" --name thumbsup\n\n# List channels\nharbor p.chat.slack list_channels --types public_channel\n```\n\n## Secrets\n\nOperator configures `SLACK_BOT_TOKEN` — a Slack bot token (starts with `xoxb-`) with appropriate scopes: `chat:write`, `channels:history`, `channels:read`, `files:write`.\n\n## Notes\n\n- Channel IDs are used (not names). Use `list_channels` to find them.\n- The `--ts` timestamp is the message timestamp from Slack API responses.\n\n## Discovery\n\nRun `harbor plugins tools chat.slack` to see all available tools.\n",
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
name: "chat-discord",
|
|
165
|
+
description: "Use Harbor to send messages, manage threads, and react in Discord servers.",
|
|
166
|
+
content: "---\nname: chat-discord\ndescription: Use Harbor to send messages, manage threads, and react in Discord servers.\n---\n\nDiscord bot API via Harbor. Send messages, read channel history, manage threads, and react. Runs server-side on orbital — `DISCORD_BOT_TOKEN` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `send_message` | Send a message to a channel | `--channel_id`, `--content`, `--embeds` |\n| `edit_message` | Edit a message | `--channel_id`, `--message_id`, `--content` |\n| `get_channel_messages` | Get recent messages | `--channel_id`, `--limit` |\n| `create_reaction` | React to a message | `--channel_id`, `--message_id`, `--emoji` |\n| `list_guild_channels` | List all server channels | `--guild_id` |\n| `create_thread` | Create thread from message | `--channel_id`, `--message_id`, `--name` |\n\n## Examples\n\n```bash\n# Send a message\nharbor p.chat.discord send_message --channel_id 123456789 --content \"Build succeeded!\"\n\n# Read recent messages\nharbor p.chat.discord get_channel_messages --channel_id 123456789 --limit 20\n\n# Create a thread\nharbor p.chat.discord create_thread --channel_id 123456789 --message_id 987654321 --name \"Issue discussion\"\n\n# List server channels\nharbor p.chat.discord list_guild_channels --guild_id 111222333\n```\n\n## Secrets\n\nOperator configures `DISCORD_BOT_TOKEN` — a Discord bot token. The bot needs to be added to the server with appropriate permissions (Send Messages, Read Message History, etc.).\n\n## Discovery\n\nRun `harbor plugins tools chat.discord` to see all available tools.\n",
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: "web-browserbase",
|
|
170
|
+
description: "Use Harbor to run managed headless browser sessions via Browserbase. Page fetch, search, and session management.",
|
|
171
|
+
content: "---\nname: web-browserbase\ndescription: Use Harbor to run managed headless browser sessions via Browserbase.\n---\n\nManaged headless browser sessions via Browserbase through Harbor. Useful for fetching pages requiring JS rendering, web automation, and search.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `create_session` | Create a browser session | `--browserSettings`, `--timeout` |\n| `list_sessions` | List sessions | `--status` |\n| `get_session` | Get session details | `--id` |\n| `fetch` | Lightweight browser page fetch | `--url` |\n| `search` | Web search via browser | `--query` |\n\n## Examples\n\n```bash\nharbor p.web.browserbase fetch --url \"https://example.com\"\nharbor p.web.browserbase search --query \"Cloudflare Workers pricing 2026\"\nharbor p.web.browserbase list_sessions\n```\n\n## Secrets\n\nOperator configures `BROWSERBASE_API_KEY` from [browserbase.com](https://browserbase.com).\n\n## Discovery\n\nRun `harbor plugins tools web.browserbase` to see all available tools.\n",
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: "email-resend",
|
|
175
|
+
description: "Use Harbor to send transactional emails via Resend. Send, schedule, and manage sending domains.",
|
|
176
|
+
content: "---\nname: email-resend\ndescription: Use Harbor to send transactional emails via Resend.\n---\n\nTransactional email via Resend through Harbor. Send, schedule, and manage sending domains. Runs server-side on orbital — `RESEND_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `send_email` | Send an email | `--from`, `--to`, `--subject`, `--html` or `--text` |\n| `get_email` | Get sent email details | `--email_id` |\n| `list_domains` | List sending domains | — |\n| `create_domain` | Add a domain | `--name`, `--region` |\n| `get_domain` | Get domain details + DNS records | `--domain_id` |\n| `verify_domain` | Trigger DNS verification | `--domain_id` |\n| `list_api_keys` | List API keys | — |\n\n## Examples\n\n```bash\n# Send an email\nharbor p.email.resend send_email \\\n --from \"Acme <noreply@acme.com>\" \\\n --to '[\"user@example.com\"]' \\\n --subject \"Your receipt\" \\\n --html \"<p>Thanks for your order!</p>\"\n\n# Send plain text\nharbor p.email.resend send_email --from \"bot@acme.com\" --to '[\"user@example.com\"]' --subject \"Alert\" --text \"Server down\"\n\n# Schedule for later\nharbor p.email.resend send_email --from \"bot@acme.com\" --to '[\"user@example.com\"]' --subject \"Weekly report\" --text \"...\" --scheduled_at \"2026-04-14T09:00:00Z\"\n\n# Check domain DNS status\nharbor p.email.resend list_domains\nharbor p.email.resend verify_domain --domain_id dom_abc123\n```\n\n## Secrets\n\nOperator configures `RESEND_API_KEY` from [resend.com](https://resend.com).\n\n## Notes\n\n- `from` must use a verified domain or Resend's shared domain (`onboarding@resend.dev`).\n- Use `list_domains` to see DNS verification status.\n\n## Discovery\n\nRun `harbor plugins tools email.resend` to see all available tools.\n",
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: "db-neon",
|
|
180
|
+
description: "Use Harbor to manage Neon serverless Postgres projects and branches. Create projects, fork branches, and get connection strings.",
|
|
181
|
+
content: "---\nname: db-neon\ndescription: Use Harbor to manage Neon serverless Postgres projects and branches.\n---\n\nNeon serverless Postgres management via Harbor. Create projects, fork branches, and get connection strings. Runs server-side on orbital — `NEON_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_projects` | List all projects | `--limit`, `--cursor` |\n| `create_project` | Create a Postgres project | `--project` (object) |\n| `get_project` | Get project details | `--project_id` |\n| `delete_project` | Delete a project | `--project_id` |\n| `list_branches` | List project branches | `--project_id` |\n| `create_branch` | Fork a branch (instant CoW) | `--project_id`, `--branch` (object) |\n| `get_branch` | Get branch details | `--project_id`, `--branch_id` |\n| `get_connection_string` | Get connection string for a branch | `--project_id`, `--branch_id` |\n| `list_endpoints` | List compute endpoints | `--project_id` |\n\n## Examples\n\n```bash\n# List your projects\nharbor p.db.neon list_projects\n\n# Create a new project in us-east-2\nharbor p.db.neon create_project --project '{\"name\":\"my-app\",\"region_id\":\"aws-us-east-2\",\"pg_version\":16}'\n\n# Fork a branch for a PR\nharbor p.db.neon create_branch --project_id pj-abc123 --branch '{\"name\":\"pr-42\",\"parent_id\":\"br-main\"}'\n\n# Get connection string\nharbor p.db.neon get_connection_string --project_id pj-abc123 --branch_id br-pr42\n```\n\n## Secrets\n\nOperator configures `NEON_API_KEY` from [console.neon.tech](https://console.neon.tech).\n\n## Notes\n\n- Branches are instant copy-on-write forks — great for CI/PR isolation.\n- Each branch has its own endpoint and connection string.\n\n## Discovery\n\nRun `harbor plugins tools db.neon` to see all available tools.\n",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: "db-turso",
|
|
185
|
+
description: "Use Harbor to manage Turso LibSQL databases, groups, and auth tokens. Multi-region SQLite at the edge.",
|
|
186
|
+
content: "---\nname: db-turso\ndescription: Use Harbor to manage Turso LibSQL databases, groups, and auth tokens.\n---\n\nTurso LibSQL database management via Harbor. Create and manage databases, groups, and auth tokens for connecting libSQL clients. Runs server-side on orbital — `TURSO_API_TOKEN` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_organizations` | List orgs | — |\n| `list_databases` | List databases in an org | `--org` |\n| `create_database` | Create a database | `--org`, `--name`, `--group` |\n| `get_database` | Get DB details and hostname | `--org`, `--name` |\n| `delete_database` | Delete a database | `--org`, `--name` |\n| `list_groups` | List replication groups | `--org` |\n| `create_group` | Create a group with primary location | `--org`, `--name`, `--location` |\n| `create_token` | Create a DB auth token | `--org`, `--name`, `--expiration`, `--authorization` |\n\n## Examples\n\n```bash\n# List organizations\nharbor p.db.turso list_organizations\n\n# List databases in your org\nharbor p.db.turso list_databases --org my-org\n\n# Create a database\nharbor p.db.turso create_database --org my-org --name my-db --group default\n\n# Get the hostname\nharbor p.db.turso get_database --org my-org --name my-db\n\n# Create an auth token for a database (read-only, expires in 2 weeks)\nharbor p.db.turso create_token --org my-org --name my-db --expiration 2w --authorization read-only\n```\n\n## Secrets\n\nOperator configures `TURSO_API_TOKEN` from [turso.tech](https://turso.tech).\n\n## Notes\n\n- `--location` codes: `iad`, `lhr`, `sin`, `nrt`, `syd`, etc.\n- The DB hostname from `get_database` is used in your libSQL connection URL: `libsql://<hostname>`.\n\n## Discovery\n\nRun `harbor plugins tools db.turso` to see all available tools.\n",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: "ai-groq",
|
|
190
|
+
description: "Use Harbor for ultra-fast AI inference via Groq. Chat completions, embeddings, and model listing.",
|
|
191
|
+
content: "---\nname: ai-groq\ndescription: Use Harbor for ultra-fast AI inference via Groq.\n---\n\nOpenAI-compatible chat completions and embeddings via Groq through Harbor. Known for sub-second inference on open models. Runs server-side on orbital — `GROQ_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `chat_completions` | Chat with a model | `--model`, `--messages` |\n| `list_models` | List available models | — |\n| `embeddings` | Generate text embeddings | `--model`, `--input` |\n\n## Examples\n\n```bash\nharbor p.ai.groq chat_completions --model llama-3.3-70b-versatile --messages '[{\"role\":\"user\",\"content\":\"Explain RLHF in one paragraph\"}]'\nharbor p.ai.groq list_models\nharbor p.ai.groq embeddings --model nomic-embed-text-v1_5 --input '[\"text to embed\"]'\n```\n\n## Parameters\n\n### chat_completions\n- `--model` (string, required) — e.g. `llama-3.3-70b-versatile`, `gemma2-9b-it`, `mixtral-8x7b-32768`\n- `--messages` (JSON array, required) — `[{role, content}]`\n- `--temperature` (number, 0–2)\n- `--max_tokens` (number)\n- `--tools` (JSON array) — function definitions for tool calling\n- `--tool_choice` (string) — `auto`, `none`, `required`, or function name\n\n### embeddings\n- `--model` (string, required) — embedding model ID\n- `--input` (JSON array, required) — texts to embed\n\n## Secrets\n\nOperator configures `GROQ_API_KEY` from [console.groq.com](https://console.groq.com).\n\n## Discovery\n\nRun `harbor plugins tools ai.groq` to see all available tools.\n",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
name: "ai-mistral",
|
|
195
|
+
description: "Use Harbor for chat completions, FIM code completions, embeddings, and moderation via Mistral AI.",
|
|
196
|
+
content: "---\nname: ai-mistral\ndescription: Use Harbor for chat, FIM completions, embeddings, and moderation via Mistral AI.\n---\n\nMistral AI inference via Harbor. Chat completions, fill-in-the-middle code completions (Codestral), embeddings, and content moderation. Runs server-side on orbital — `MISTRAL_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `chat_completions` | Chat with a Mistral model | `--model`, `--messages` |\n| `fim_completions` | Fill-in-the-middle code completion | `--model`, `--prompt`, `--suffix` |\n| `embeddings` | Generate text embeddings | `--model`, `--input` |\n| `moderate` | Classify text for harmful content | `--input` |\n| `list_models` | List available models | — |\n\n## Examples\n\n```bash\nharbor p.ai.mistral chat_completions --model mistral-large-latest --messages '[{\"role\":\"user\",\"content\":\"Write a haiku\"}]'\nharbor p.ai.mistral fim_completions --model codestral-latest --prompt \"def add(a, b):\" --suffix \" return result\"\nharbor p.ai.mistral embeddings --model mistral-embed --input '[\"semantic search text\"]'\nharbor p.ai.mistral moderate --input '[\"some text to check\"]'\n```\n\n## Parameters\n\n### chat_completions\n- `--model` (required) — `mistral-large-latest`, `mistral-small-latest`, `open-mistral-nemo`\n- `--messages` (JSON array, required)\n- `--tools` (JSON array) — function calling tool definitions\n- `--tool_choice` (string) — `auto`, `any`, `none`, or specific tool name\n\n### fim_completions (Codestral)\n- `--model` (required, default: `codestral-latest`)\n- `--prompt` (string, required) — code before cursor\n- `--suffix` (string) — code after cursor; model fills the gap\n\n## Secrets\n\nOperator configures `MISTRAL_API_KEY` from [console.mistral.ai](https://console.mistral.ai).\n\n## Discovery\n\nRun `harbor plugins tools ai.mistral` to see all available tools.\n",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "ai-cerebras",
|
|
200
|
+
description: "Use Harbor for ultra-low-latency AI inference via Cerebras. Sub-100ms chat completions.",
|
|
201
|
+
content: "---\nname: ai-cerebras\ndescription: Use Harbor for ultra-low-latency AI inference via Cerebras.\n---\n\nOpenAI-compatible chat completions via Cerebras through Harbor. Cerebras runs open models with sub-100ms latency at scale. Runs server-side on orbital — `CEREBRAS_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `chat_completions` | Chat with a model | `--model`, `--messages` |\n| `list_models` | List available models | — |\n\n## Examples\n\n```bash\nharbor p.ai.cerebras chat_completions --model llama-4-scout-17b-16e-instruct --messages '[{\"role\":\"user\",\"content\":\"Summarize in 3 bullet points\"}]'\nharbor p.ai.cerebras chat_completions --model llama3.1-70b --messages '[{\"role\":\"user\",\"content\":\"Classify this text\"}]' --response_format '{\"type\":\"json_object\"}'\nharbor p.ai.cerebras list_models\n```\n\n## Parameters\n\n### chat_completions\n- `--model` (required) — `llama-4-scout-17b-16e-instruct`, `llama3.1-8b`, `llama3.1-70b`, `deepseek-r1-distill-llama-70b`\n- `--messages` (JSON array, required)\n- `--temperature` (number, 0–1.5)\n- `--max_tokens` (number)\n- `--tools` (JSON array) — function calling\n- `--response_format` (JSON object) — `{\"type\":\"json_object\"}` for JSON mode\n\n## Secrets\n\nOperator configures `CEREBRAS_API_KEY` from [cloud.cerebras.ai](https://cloud.cerebras.ai).\n\n## Discovery\n\nRun `harbor plugins tools ai.cerebras` to see all available tools.\n",
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: "observability-sentry",
|
|
205
|
+
description: "Use Harbor to list Sentry issues, get details, resolve errors, and check releases.",
|
|
206
|
+
content: "---\nname: observability-sentry\ndescription: Use Harbor to list Sentry issues, resolve errors, and check releases.\n---\n\nSentry error tracking via Harbor. List and triage issues, get event details, manage releases, and update issue status. Runs server-side on orbital — `SENTRY_AUTH_TOKEN` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_projects` | List all projects | `--org` |\n| `list_issues` | List project issues | `--org`, `--project`, `--query`, `--sort` |\n| `get_issue` | Get issue details | `--issue_id` |\n| `update_issue` | Resolve, assign, or bookmark | `--issue_id`, `--status`, `--assignedTo` |\n| `list_issue_events` | List occurrences of an issue | `--issue_id` |\n| `list_releases` | List releases | `--org`, `--query` |\n| `get_release` | Get release details | `--org`, `--version` |\n\n## Examples\n\n```bash\n# List recent unresolved issues\nharbor p.observability.sentry list_issues --org my-org --project my-app --query \"is:unresolved\" --sort date\n\n# Get issue details\nharbor p.observability.sentry get_issue --issue_id 123456789\n\n# Resolve an issue\nharbor p.observability.sentry update_issue --issue_id 123456789 --status resolved\n\n# Assign an issue\nharbor p.observability.sentry update_issue --issue_id 123456789 --assignedTo alice@example.com\n\n# List releases\nharbor p.observability.sentry list_releases --org my-org\n```\n\n## Secrets\n\nOperator configures `SENTRY_AUTH_TOKEN` from [sentry.io/settings/auth-tokens](https://sentry.io/settings/auth-tokens/).\n\n## Notes\n\n- `--org` is the organization slug, not the display name.\n- Use `--query \"is:unresolved assigned:me\"` to find your assigned issues.\n\n## Discovery\n\nRun `harbor plugins tools observability.sentry` to see all available tools.\n",
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: "analytics-posthog",
|
|
210
|
+
description: "Use Harbor to capture events and manage feature flags via PostHog.",
|
|
211
|
+
content: "---\nname: analytics-posthog\ndescription: Use Harbor to capture analytics events and manage feature flags via PostHog.\n---\n\nPostHog analytics via Harbor. Capture events, manage feature flags, and inspect projects. Runs server-side on orbital — `POSTHOG_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_projects` | List projects | — |\n| `capture_event` | Capture an analytics event | `--api_key`, `--event`, `--distinct_id` |\n| `list_feature_flags` | List feature flags | `--project_id` |\n| `get_feature_flag` | Get flag details | `--project_id`, `--id` |\n| `create_feature_flag` | Create a feature flag | `--project_id`, `--name`, `--key` |\n\n## Examples\n\n```bash\n# List projects to find project_id\nharbor p.analytics.posthog list_projects\n\n# Capture an event (use project API key, not personal key)\nharbor p.analytics.posthog capture_event --api_key \"phc_xxx\" --event \"agent_run_complete\" --distinct_id \"user-123\" --properties '{\"tool\":\"harbor\",\"status\":\"success\"}'\n\n# List feature flags\nharbor p.analytics.posthog list_feature_flags --project_id 12345\n\n# Create a feature flag\nharbor p.analytics.posthog create_feature_flag --project_id 12345 --name \"New sidebar\" --key new-sidebar\n```\n\n## Secrets\n\nOperator configures `POSTHOG_API_KEY` — personal API key from PostHog settings. Note: `capture_event` uses the project API key (`phc_...`), not the personal key.\n\n## Discovery\n\nRun `harbor plugins tools analytics.posthog` to see all available tools.\n",
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: "vector-pinecone",
|
|
215
|
+
description: "Use Harbor to manage Pinecone vector indexes and collections. List, create, and configure serverless indexes.",
|
|
216
|
+
content: "---\nname: vector-pinecone\ndescription: Use Harbor to manage Pinecone vector indexes and collections.\n---\n\nPinecone vector index management via Harbor. Create serverless indexes, manage collections, and configure index settings. Runs server-side on orbital — `PINECONE_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_indexes` | List all indexes | — |\n| `create_index` | Create a vector index | `--name`, `--dimension`, `--metric`, `--spec` |\n| `describe_index` | Get index details | `--index_name` |\n| `delete_index` | Delete an index | `--index_name` |\n| `configure_index` | Update index config | `--index_name`, `--deletion_protection` |\n| `list_collections` | List collections | — |\n| `create_collection` | Snapshot index to collection | `--name`, `--source` |\n| `describe_collection` | Get collection details | `--collection_name` |\n| `delete_collection` | Delete a collection | `--collection_name` |\n\n## Examples\n\n```bash\n# List indexes\nharbor p.vector.pinecone list_indexes\n\n# Create a serverless index (match your embedding model dimension)\nharbor p.vector.pinecone create_index \\\n --name my-embeddings \\\n --dimension 1536 \\\n --metric cosine \\\n --spec '{\"serverless\":{\"cloud\":\"aws\",\"region\":\"us-east-1\"}}'\n\n# Get index details (includes host URL for data plane calls)\nharbor p.vector.pinecone describe_index --index_name my-embeddings\n\n# Snapshot to collection\nharbor p.vector.pinecone create_collection --name my-snapshot --source my-embeddings\n```\n\n## Secrets\n\nOperator configures `PINECONE_API_KEY` from [app.pinecone.io](https://app.pinecone.io).\n\n## Notes\n\n- This plugin manages the **control plane** (index/collection CRUD). For data plane operations (upsert, query, fetch), connect directly to the index host using the API key.\n- `dimension` must match the embedding model output (e.g. 1536 for OpenAI ada-002, 768 for many sentence transformers).\n\n## Discovery\n\nRun `harbor plugins tools vector.pinecone` to see all available tools.\n",
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
name: "infra-render",
|
|
220
|
+
description: "Use Harbor to manage Render services. List, create, deploy, and configure web services, static sites, workers, and cron jobs.",
|
|
221
|
+
content: "---\nname: infra-render\ndescription: Use Harbor to manage Render services — deploy web services, static sites, workers, and cron jobs.\n---\n\nRender infrastructure management via Harbor. List, create, deploy, and monitor web services, static sites, background workers, and cron jobs. Runs server-side on orbital — `RENDER_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `list_services` | List all services | `--type`, `--name`, `--limit` |\n| `get_service` | Get service details | `--id` |\n| `create_service` | Create a service | `--ownerId`, `--type`, `--name`, `--repo` |\n| `delete_service` | Delete a service | `--id` |\n| `list_deploys` | List deploys for a service | `--serviceId`, `--limit` |\n| `trigger_deploy` | Trigger a new deploy | `--serviceId`, `--clearCache` |\n| `get_deploy` | Get deploy details | `--serviceId`, `--deployId` |\n| `list_env_groups` | List environment groups | `--limit` |\n| `get_env_group` | Get env group details | `--id` |\n\n## Examples\n\n```bash\n# List your services\nharbor p.infra.render list_services\nharbor p.infra.render list_services --type web_service\n\n# Get service details\nharbor p.infra.render get_service --id srv-abc123\n\n# Trigger a deploy\nharbor p.infra.render trigger_deploy --serviceId srv-abc123\nharbor p.infra.render trigger_deploy --serviceId srv-abc123 --clearCache clear\n\n# Watch deploy progress\nharbor p.infra.render list_deploys --serviceId srv-abc123 --limit 3\nharbor p.infra.render get_deploy --serviceId srv-abc123 --deployId dep-xyz\n```\n\n## Secrets\n\nOperator configures `RENDER_API_KEY` from [dashboard.render.com/u/settings](https://dashboard.render.com/u/settings).\n\n## Discovery\n\nRun `harbor plugins tools infra.render` to see all available tools.\n",
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
name: "ai-cohere",
|
|
225
|
+
description: "Use Harbor for chat with RAG, embeddings, and reranking via Cohere.",
|
|
226
|
+
content: "---\nname: ai-cohere\ndescription: Use Harbor for chat with RAG, embeddings, and reranking via Cohere.\n---\n\nCohere AI via Harbor. Chat with optional RAG document grounding, multilingual embeddings, and reranking. Runs server-side on orbital — `COHERE_API_KEY` never leaves the server.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `chat` | Chat with optional RAG | `--model`, `--messages`, `--documents` |\n| `embed` | Generate multilingual embeddings | `--model`, `--texts`, `--input_type` |\n| `rerank` | Rerank documents by query relevance | `--model`, `--query`, `--documents` |\n\n## Examples\n\n```bash\n# Chat\nharbor p.ai.cohere chat --model command-a-03-2025 --messages '[{\"role\":\"user\",\"content\":\"Summarize the key points\"}]'\n\n# Chat with RAG (documents grounding the response)\nharbor p.ai.cohere chat --model command-a-03-2025 \\\n --messages '[{\"role\":\"user\",\"content\":\"What is the return policy?\"}]' \\\n --documents '[{\"data\":{\"text\":\"Returns accepted within 30 days\"}}]'\n\n# Embed texts for a retrieval index\nharbor p.ai.cohere embed --model embed-v4.0 --texts '[\"text to index\"]' --input_type search_document\n\n# Rerank search results\nharbor p.ai.cohere rerank --model rerank-v3.5 --query \"return policy\" --documents '[\"doc 1\",\"doc 2\"]' --top_n 3\n```\n\n## Parameters\n\n### embed\n- `--model` (required) — `embed-v4.0`, `embed-multilingual-v3.0`\n- `--texts` (JSON array, required) — texts to embed\n- `--input_type` (string) — `search_document`, `search_query`, `classification`, `clustering`\n- `--embedding_types` (JSON array) — `float`, `int8`, `binary`\n\n## Secrets\n\nOperator configures `COHERE_API_KEY` from [dashboard.cohere.com](https://dashboard.cohere.com).\n\n## Discovery\n\nRun `harbor plugins tools ai.cohere` to see all available tools.\n",
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: "notifications-ntfy",
|
|
230
|
+
description: "Use Harbor to publish push notifications via ntfy. Delivers to phones, desktops, and webhooks.",
|
|
231
|
+
content: "---\nname: notifications-ntfy\ndescription: Use Harbor to publish push notifications via ntfy.\n---\n\nPush notifications via ntfy through Harbor. Publish to topics with priority, tags, actions, and attachments. Subscribers receive notifications on phones, desktops, and webhooks.\n\n## Tools\n\n| Tool | Description | Key Params |\n|------|-------------|------------|\n| `publish` | Publish a notification | `--topic`, `--message`, `--title`, `--priority` |\n| `poll` | Poll cached messages from topic | `--topic`, `--since` |\n\n## Examples\n\n```bash\n# Basic notification\nharbor p.notifications.ntfy publish --topic my-alerts --message \"Deployment complete\" --title \"Deploy\"\n\n# High priority with tags\nharbor p.notifications.ntfy publish --topic my-alerts --message \"CPU at 95%\" --title \"Alert\" --priority 4 --tags '[\"warning\",\"server\"]'\n\n# With click URL\nharbor p.notifications.ntfy publish --topic my-alerts --message \"New issue filed\" --click \"https://github.com/org/repo/issues/42\"\n\n# Schedule for later\nharbor p.notifications.ntfy publish --topic my-alerts --message \"Daily report\" --delay \"9am\"\n\n# Poll recent messages\nharbor p.notifications.ntfy poll --topic my-alerts --since 1h\n```\n\n## Parameters\n\n### publish\n- `--topic` (string, required) — target topic name\n- `--message` (string, required) — notification body\n- `--title` (string) — notification heading\n- `--priority` (number) — 1=min, 2=low, 3=default, 4=high, 5=urgent\n- `--tags` (JSON array) — emoji tags (e.g. `[\"warning\",\"skull\"]`)\n- `--click` (string) — URL to open on notification click\n- `--attach` (string) — URL of attachment\n- `--delay` (string) — schedule delivery (e.g. `\"30min\"`, `\"9am\"`, ISO 8601)\n- `--email` (string) — forward to email address\n\n## Secrets\n\nNo secret required for public ntfy.sh topics. For private servers, the operator configures the `NTFY_URL` and optional `NTFY_TOKEN`.\n\n## Discovery\n\nRun `harbor plugins tools notifications.ntfy` to see all available tools.\n",
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
name: "db-supabase",
|
|
235
|
+
description: "Use Harbor to run Supabase CLI commands. Local dev, migrations, edge functions, and storage.",
|
|
236
|
+
content: "---\nname: db-supabase\ndescription: Use Harbor to run Supabase CLI commands — migrations, edge functions, and storage.\n---\n\nRun Supabase CLI (`supabase`) commands through Harbor for local dev, schema migrations, edge functions, and storage management.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.db.supabase db_push` | Push local migrations to remote |\n| `harbor p.db.supabase db_pull` | Pull remote schema changes locally |\n| `harbor p.db.supabase db_reset` | Reset local database |\n| `harbor p.db.supabase db_diff` | Diff local schema vs remote |\n| `harbor p.db.supabase migration_list` | List migrations |\n| `harbor p.db.supabase functions_deploy --name my-fn` | Deploy edge function |\n| `harbor p.db.supabase functions_list` | List edge functions |\n| `harbor p.db.supabase storage_ls --path bucket/path` | List storage objects |\n\n## Examples\n\n```bash\nharbor p.db.supabase migration_list\nharbor p.db.supabase db_push\nharbor p.db.supabase functions_deploy --name my-function\nharbor p.db.supabase storage_ls --path public/\n```\n\n## Secrets\n\nOperator must configure `SUPABASE_ACCESS_TOKEN` and `SUPABASE_PROJECT_REF`. Authentication is via `supabase login` locally or env vars in CI.\n\n## Discovery\n\nRun `harbor plugins tools db.supabase` to see all available tools.\n",
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: "db-planetscale",
|
|
240
|
+
description: "Use Harbor to run PlanetScale CLI commands. Branching MySQL databases.",
|
|
241
|
+
content: "---\nname: db-planetscale\ndescription: Use Harbor to run PlanetScale CLI commands — branching MySQL databases.\n---\n\nRun PlanetScale CLI (`pscale`) commands through Harbor for managing branching MySQL databases.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `harbor p.db.planetscale database_list` | List databases |\n| `harbor p.db.planetscale branch_list --database mydb` | List branches |\n| `harbor p.db.planetscale branch_create --database mydb --name pr-42` | Fork a branch |\n\n## Examples\n\n```bash\nharbor p.db.planetscale database_list\nharbor p.db.planetscale branch_list --database my-app\nharbor p.db.planetscale branch_create --database my-app --name feature-auth\n```\n\n## Secrets\n\nOperator configures `PLANETSCALE_TOKEN` and `PLANETSCALE_TOKEN_ID` from PlanetScale dashboard → Settings → API.\n\n## Discovery\n\nRun `harbor plugins tools db.planetscale` to see all available tools.\n",
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: "db-convex",
|
|
245
|
+
description: "Use Harbor to run Convex CLI commands. Reactive backend with real-time sync, ACID transactions, and scheduled functions.",
|
|
246
|
+
content: "---\nname: db-convex\ndescription: Use Harbor to run Convex CLI commands — reactive backend platform.\n---\n\nRun Convex CLI commands through Harbor for managing the Convex reactive backend — functions, data, and deployments.\n\n## About Convex\n\nConvex is a reactive backend platform with:\n- Real-time sync to clients\n- ACID transactions\n- Scheduled functions and cron jobs\n- Built-in search and file storage\n- TypeScript-first schema\n\n## Commands\n\n```bash\nharbor p.db.convex dev # Start dev server\nharbor p.db.convex deploy # Deploy to production\nharbor p.db.convex run functionName # Run a Convex function\nharbor p.db.convex import data.json # Import data\nharbor p.db.convex export # Export data\nharbor p.db.convex dashboard # Open dashboard\n```\n\n## Secrets\n\nOperator configures `CONVEX_DEPLOY_KEY` from [dashboard.convex.dev](https://dashboard.convex.dev) → Project Settings → Deploy Keys.\n\n## Discovery\n\nRun `harbor plugins tools db.convex` to see all available tools.\n",
|
|
247
|
+
},
|
|
103
248
|
{
|
|
104
249
|
name: "plugins-overview",
|
|
105
|
-
description: "Use Harbor plugins to access tools and services. Covers
|
|
106
|
-
content: "---\nname: plugins-overview\ndescription: Use Harbor plugins to access tools and services. Covers search (exa, brave, serper, tavily), infra (modal, flyio, railway, vercel, do), services (gh, composio, linear), AI (openrouter, grok), and media (replicate, fal). Use when the agent needs to search, deploy, manage infrastructure, interact with GitHub/Linear, or generate media.\n---\n\n# Harbor Plugins\n\nHarbor is a control plane that lets operators grant AI agents access to tools and services through a lease-based permission system. Agents run `harbor` CLI commands; operators approve access through a web dashboard.\n\n## Quick reference\n\n| Slug | Name | Class | What it does |\n|------|------|-------|-------------|\n| `infra.modal` | Modal | CLI | Cloud compute for ML/data workloads |\n| `infra.flyio` | Fly.io | CLI | Deploy and manage apps globally |\n| `infra.railway` | Railway | CLI | Deploy infrastructure instantly |\n| `infra.vercel` | Vercel | CLI | Deploy frontend projects |\n| `infra.do` | DigitalOcean | CLI | Cloud infrastructure management |\n| `services.gh` | GitHub CLI | CLI | GitHub from the command line |\n| `services.composio` | Composio | CLI | Universal tool integration for agents |\n| `services.linear` | Linear | CLI | Issue tracking from the command line |\n| `search.exa` | Exa | API | AI-native semantic/keyword/deep search |\n| `search.brave` | Brave Search | API | Privacy-focused web search |\n| `search.serper` | Serper | API | Google Search results (web, images, news) |\n| `search.tavily` | Tavily | API | AI-optimized search with LLM answers |\n| `media.replicate` | Replicate | API | Generative media via prediction API |\n| `media.fal` | fal.ai | API | Image, video, and audio generation |\n| `ai.openrouter` | OpenRouter | API | Unified AI gateway, 300+ models |\n| `ai.grok` | Grok | API | xAI chat completions with live web search |\n\nShort aliases work too: `harbor p.modal` = `harbor p.infra.modal`.\n\n## Before using any plugin\n\n```bash\n# Check what's available and what has active leases\nharbor status\n\n# See who you're connected to\nharbor whoami\n```\n\nIf `harbor status` shows a plugin without a lease and you need it for your current task, request access. **Only request plugins you actually need right now — never bulk-request all available plugins.**\n\n```bash\nharbor request <slug> --reason \"I need <slug> to do X\"\n```\n\n## CLI binary install commands\n\nCLI plugins need the binary installed locally. API plugins don't — orbital executes them remotely.\n\n| Plugin | Binary | Install |\n|--------|--------|---------|\n| `infra.modal` | `modal` | `pip install modal` |\n| `infra.flyio` | `flyctl` | `brew install flyctl` or `curl -L https://fly.io/install.sh \\| sh` |\n| `infra.railway` | `railway` | `brew install railway` or `npm i -g @railway/cli` |\n| `infra.vercel` | `vercel` | `npm i -g vercel` |\n| `infra.do` | `doctl` | `brew install doctl` |\n| `services.gh` | `gh` | `brew install gh` or `conda install gh` |\n| `services.composio` | `composio` | `pip install composio-core` |\n| `services.linear` | `linear` | `brew install schpet/tap/linear` |\n\n---\n\n## Infra plugins\n\n### infra.modal — Modal\n\nCloud compute for ML, data pipelines, and GPU workloads.\n\n```bash\nharbor p.modal volume list\nharbor p.modal app list\nharbor p.modal run my_script.py\n```\n\nSecrets: `MODAL_TOKEN_ID`, `MODAL_TOKEN_SECRET`\n\n### infra.flyio — Fly.io\n\nDeploy and manage apps globally on Fly's edge network.\n\n```bash\nharbor p.flyio apps list\nharbor p.flyio status --app myapp\nharbor p.flyio deploy --app myapp\n```\n\nSecrets: `FLY_API_TOKEN`\n\n### infra.railway — Railway\n\nInstant infrastructure deployment.\n\n```bash\nharbor p.railway status\nharbor p.railway up\nharbor p.railway logs\n```\n\nSecrets: `RAILWAY_TOKEN`\n\n### infra.vercel — Vercel\n\nDeploy and manage frontend projects.\n\n```bash\nharbor p.vercel ls\nharbor p.vercel deploy --prod\nharbor p.vercel env ls\n```\n\nSecrets: `VERCEL_TOKEN`\n\n### infra.do — DigitalOcean\n\nCloud infrastructure management.\n\n```bash\nharbor p.do compute droplet list\nharbor p.do apps list\nharbor p.do databases list\n```\n\nSecrets: `DIGITALOCEAN_ACCESS_TOKEN`\n\n---\n\n## Services plugins\n\n### services.gh — GitHub CLI\n\nFull GitHub access from the command line.\n\n```bash\nharbor p.gh issue list --repo owner/repo\nharbor p.gh pr create --title \"Fix bug\" --body \"Details\"\nharbor p.gh run list --repo owner/repo\n```\n\nSecrets: `GITHUB_TOKEN`\n\n### services.composio — Composio\n\nUniversal tool integration for agents.\n\n```bash\nharbor p.composio apps\nharbor p.composio actions --app github\nharbor p.composio execute <action-name> --params '{\"key\":\"value\"}'\n```\n\nSecrets: `COMPOSIO_API_KEY`\n\n### services.linear — Linear\n\nIssue tracking from the command line.\n\n```bash\nharbor p.linear issue list\nharbor p.linear issue create --title \"Bug\" --team \"ENG\"\nharbor p.linear project list\n```\n\nSecrets: `LINEAR_API_KEY`\n\n---\n\n## Search plugins (API — no local install needed)\n\n### search.exa — Exa\n\nAI-native web search with semantic, keyword, and deep search modes.\n\n```bash\nharbor p.exa search --query \"latest AI news\"\nharbor p.exa findSimilar --url \"https://example.com\"\nharbor p.exa contents --ids '[\"https://example.com\"]'\nharbor p.exa answer --query \"What is RLHF?\"\n```\n\nSecrets: `EXA_API_KEY`\n\n### search.brave — Brave Search\n\nPrivacy-focused web search.\n\n```bash\nharbor p.brave search --q \"cloudflare workers tutorial\"\nharbor p.brave search --q \"AI news\" --freshness pd --count 5\n```\n\nSecrets: `BRAVE_API_KEY`\n\n### search.serper — Serper\n\nGoogle Search results — web, images, news.\n\n```bash\nharbor p.serper search --q \"kubernetes best practices\"\nharbor p.serper news --q \"AI regulation\" --num 5\nharbor p.serper images --q \"architecture diagram\"\n```\n\nSecrets: `SERPER_API_KEY`\n\n### search.tavily — Tavily\n\nAI-optimized search with ranked results and optional LLM answers.\n\n```bash\nharbor p.tavily search --query \"RAG best practices\" --search_depth advanced\nharbor p.tavily extract --urls '[\"https://example.com\"]'\n```\n\nSecrets: `TAVILY_API_KEY`\n\n---\n\n## Media plugins (API — no local install needed)\n\n### media.replicate — Replicate\n\nGenerative media via the Replicate prediction API.\n\n```bash\n# Create a prediction (async)\nharbor p.replicate create-prediction --version \"<sha>\" --input '{\"prompt\":\"a sunset\"}'\n\n# Poll for result\nharbor p.replicate get-prediction --prediction_id \"<id>\"\n\n# Use an official model (auto-resolves version)\nharbor p.replicate create-prediction-official --owner stability-ai --name sdxl --input '{\"prompt\":\"a sunset\"}'\n```\n\nSecrets: `REPLICATE_API_TOKEN`\n\n### media.fal — fal.ai\n\nImage, video, and audio generation.\n\n```bash\nharbor p.fal generate --model_id \"fal-ai/flux/schnell\" --prompt \"a cat in space\"\nharbor p.fal queue-submit --model_id \"fal-ai/flux-pro\" --prompt \"detailed landscape\" --image_size landscape_16_9\n```\n\nSecrets: `FAL_KEY`\n\n---\n\n## AI plugins (API — no local install needed)\n\n### ai.openrouter — OpenRouter\n\nUnified AI gateway with 300+ models from 60+ providers.\n\n```bash\nharbor p.openrouter chat --model \"anthropic/claude-sonnet-4\" --messages '[{\"role\":\"user\",\"content\":\"Hello\"}]'\nharbor p.openrouter models\n```\n\nSecrets: `OPENROUTER_API_KEY`\n\n### ai.grok — Grok (xAI)\n\nChat completions with optional live web search.\n\n```bash\nharbor p.grok chat --model \"grok-4-fast\" --messages '[{\"role\":\"user\",\"content\":\"What happened today?\"}]'\n\n# With live web search\nharbor p.grok chat --model \"grok-4-fast\" --messages '[{\"role\":\"user\",\"content\":\"Latest news\"}]' --tools '[{\"type\":\"web_search\"}]'\n```\n\nSecrets: `XAI_API_KEY`\n\n---\n\n## Error handling\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `lease_required` | No active lease for this plugin | `harbor request <slug>` — ask operator to grant lease |\n| `lease_expired` | Lease timed out | `harbor request <slug>` to renew |\n| `plugin_setup_required` | Operator hasn't enabled the plugin | `harbor request <slug>` — operator must configure it in dashboard |\n| `Token missing` | Secrets not configured | `harbor msg \"Plugin <slug> needs API keys in secrets\"` |\n| `unauthorized` | Daemon token expired | `harbor setup status` to refresh |\n| Binary not found | CLI tool not installed | See install commands above |\n| Run killed mid-execution | Operator revoked the lease | Stop and report — this was intentional |\n\n## Operator communication\n\n```bash\n# Send context to the operator\nharbor msg \"Starting deployment — this will take ~2 minutes\"\n\n# Check for operator messages\nharbor messages\n\n# Request access to a plugin\nharbor request search.exa\n```\n\n## Multi-plugin workflows\n\nRequest only what you need, when you need it:\n\n```bash\nharbor status\nharbor request search.exa --reason \"Need to research topic for the user\"\n\n# Execute first step\nRESULTS=$(harbor p.exa search --query \"topic\")\n\n# Request next plugin only when you actually need it\nharbor request services.gh --reason \"Need to file research findings\"\nharbor p.gh issue create --title \"Research: topic\" --body \"$RESULTS\"\n```\n\n**Do not** loop through `harbor status` and request every available plugin.\n",
|
|
250
|
+
description: "Use Harbor plugins to access tools and services. Covers all plugin categories: search, AI, web, audio, memory, chat, database, infra, services, email, analytics, vector, and notifications.",
|
|
251
|
+
content: "---\nname: plugins-overview\ndescription: Use Harbor plugins to access tools and services.\n---\n\n# Harbor Plugins\n\nHarbor is a control plane that lets operators grant AI agents access to tools and services through a lease-based permission system. Agents run `harbor` CLI commands; operators approve access through a web dashboard.\n\n## Quick reference\n\n| Slug | Name | Class | What it does |\n|------|------|-------|-------------|\n| `infra.modal` | Modal | CLI | Cloud compute for ML/data workloads |\n| `infra.flyio` | Fly.io | CLI | Deploy and manage apps globally |\n| `infra.railway` | Railway | CLI | Deploy infrastructure instantly |\n| `infra.vercel` | Vercel | CLI | Deploy frontend projects |\n| `infra.do` | DigitalOcean | CLI | Cloud infrastructure management |\n| `infra.render` | Render | API | Web services, static sites, workers, cron jobs |\n| `infra.cloudflare` | Cloudflare | CLI | Workers, Pages, KV, R2, D1, Queues |\n| `services.gh` | GitHub CLI | CLI | GitHub from the command line |\n| `services.composio` | Composio | CLI | Universal tool integration for agents |\n| `services.linear` | Linear | CLI | Issue tracking from the command line |\n| `search.exa` | Exa | API | AI-native semantic/keyword/deep search |\n| `search.brave` | Brave Search | API | Privacy-focused web search |\n| `search.serper` | Serper | API | Google Search results (web, images, news) |\n| `search.tavily` | Tavily | API | AI-optimized search with LLM answers |\n| `search.parallel` | Parallel.ai | API | AI search, extraction, and async research |\n| `media.replicate` | Replicate | API | Generative media via prediction API |\n| `media.fal` | fal.ai | API | Image, video, and audio generation |\n| `ai.openrouter` | OpenRouter | API | Unified AI gateway, 300+ models |\n| `ai.grok` | Grok (xAI) | API | Chat and live web+X search |\n| `ai.groq` | Groq | API | Ultra-fast inference on open models |\n| `ai.mistral` | Mistral | API | Chat, FIM code completion, embeddings |\n| `ai.cerebras` | Cerebras | API | Sub-100ms inference |\n| `ai.cohere` | Cohere | API | Chat with RAG, embeddings, reranking |\n| `audio.elevenlabs` | ElevenLabs | API | TTS and sound effects |\n| `audio.deepgram` | Deepgram | API | STT transcription and Aura TTS |\n| `web.firecrawl` | Firecrawl | API | Scrape, crawl, extract, search |\n| `web.supadata` | Supadata | API | Video transcripts, social metadata, scraping |\n| `web.jina` | Jina AI | API | Embeddings and reranking |\n| `web.diffbot` | Diffbot | API | Structured extraction from any URL |\n| `web.scrapingbee` | ScrapingBee | API | JS rendering, proxy scraping, screenshots |\n| `web.browserbase` | Browserbase | API | Managed headless browser sessions |\n| `memory.mem0` | Mem0 | API | AI memory with auto-dedup |\n| `memory.zep` | Zep | API | Temporal knowledge graph memory |\n| `memory.supermemory` | Supermemory | API | Memory + RAG with container scoping |\n| `chat.slack` | Slack | API | Post messages, read channels |\n| `chat.discord` | Discord | API | Send messages, manage threads |\n| `email.resend` | Resend | API | Send transactional emails |\n| `db.neon` | Neon | API | Serverless Postgres with instant branching |\n| `db.turso` | Turso | API | LibSQL at the edge |\n| `db.supabase` | Supabase | CLI | Migrations, edge functions, storage |\n| `db.planetscale` | PlanetScale | CLI | Branching MySQL |\n| `db.convex` | Convex | CLI | Reactive backend platform |\n| `vector.pinecone` | Pinecone | API | Vector index management |\n| `observability.sentry` | Sentry | API | Error tracking, issues, releases |\n| `analytics.posthog` | PostHog | API | Events and feature flags |\n| `notifications.ntfy` | ntfy | API | Push notifications to any device |\n\nShort aliases work too: `harbor p.modal` = `harbor p.infra.modal`.\n\n## Before using any plugin\n\n```bash\n# Check what's available and what has active leases\nharbor status\n\n# See who you're connected to\nharbor whoami\n```\n\nIf `harbor status` shows a plugin without a lease and you need it for your current task, request access. **Only request plugins you actually need right now — never bulk-request all available plugins.**\n\n```bash\nharbor request <slug> --reason \"I need <slug> to do X\"\n```\n\n## CLI binary install commands\n\nCLI plugins need the binary installed locally. API plugins don't — orbital executes them remotely.\n\n| Plugin | Binary | Install |\n|--------|--------|---------|\n| `infra.modal` | `modal` | `pip install modal` |\n| `infra.flyio` | `flyctl` | `brew install flyctl` or `curl -L https://fly.io/install.sh \\| sh` |\n| `infra.railway` | `railway` | `brew install railway` or `npm i -g @railway/cli` |\n| `infra.vercel` | `vercel` | `npm i -g vercel` |\n| `infra.do` | `doctl` | `brew install doctl` |\n| `services.gh` | `gh` | `brew install gh` or `conda install gh` |\n| `services.composio` | `composio` | `pip install composio-core` |\n| `services.linear` | `linear` | `brew install schpet/tap/linear` |\n\n---\n\n## Infra plugins\n\n### infra.modal — Modal\n\nCloud compute for ML, data pipelines, and GPU workloads.\n\n```bash\nharbor p.modal volume list\nharbor p.modal app list\nharbor p.modal run my_script.py\n```\n\nSecrets: `MODAL_TOKEN_ID`, `MODAL_TOKEN_SECRET`\n\n### infra.flyio — Fly.io\n\nDeploy and manage apps globally on Fly's edge network.\n\n```bash\nharbor p.flyio apps list\nharbor p.flyio status --app myapp\nharbor p.flyio deploy --app myapp\n```\n\nSecrets: `FLY_API_TOKEN`\n\n### infra.railway — Railway\n\nInstant infrastructure deployment.\n\n```bash\nharbor p.railway status\nharbor p.railway up\nharbor p.railway logs\n```\n\nSecrets: `RAILWAY_TOKEN`\n\n### infra.vercel — Vercel\n\nDeploy and manage frontend projects.\n\n```bash\nharbor p.vercel ls\nharbor p.vercel deploy --prod\nharbor p.vercel env ls\n```\n\nSecrets: `VERCEL_TOKEN`\n\n### infra.do — DigitalOcean\n\nCloud infrastructure management.\n\n```bash\nharbor p.do compute droplet list\nharbor p.do apps list\nharbor p.do databases list\n```\n\nSecrets: `DIGITALOCEAN_ACCESS_TOKEN`\n\n---\n\n## Services plugins\n\n### services.gh — GitHub CLI\n\nFull GitHub access from the command line.\n\n```bash\nharbor p.gh issue list --repo owner/repo\nharbor p.gh pr create --title \"Fix bug\" --body \"Details\"\nharbor p.gh run list --repo owner/repo\n```\n\nSecrets: `GITHUB_TOKEN`\n\n### services.composio — Composio\n\nUniversal tool integration for agents.\n\n```bash\nharbor p.composio apps\nharbor p.composio actions --app github\nharbor p.composio execute <action-name> --params '{\"key\":\"value\"}'\n```\n\nSecrets: `COMPOSIO_API_KEY`\n\n### services.linear — Linear\n\nIssue tracking from the command line.\n\n```bash\nharbor p.linear issue list\nharbor p.linear issue create --title \"Bug\" --team \"ENG\"\nharbor p.linear project list\n```\n\nSecrets: `LINEAR_API_KEY`\n\n---\n\n## Search plugins (API — no local install needed)\n\n### search.exa — Exa\n\nAI-native web search with semantic, keyword, and deep search modes.\n\n```bash\nharbor p.exa search --query \"latest AI news\"\nharbor p.exa findSimilar --url \"https://example.com\"\nharbor p.exa contents --ids '[\"https://example.com\"]'\nharbor p.exa answer --query \"What is RLHF?\"\n```\n\nSecrets: `EXA_API_KEY`\n\n### search.brave — Brave Search\n\nPrivacy-focused web search.\n\n```bash\nharbor p.brave search --q \"cloudflare workers tutorial\"\nharbor p.brave search --q \"AI news\" --freshness pd --count 5\n```\n\nSecrets: `BRAVE_API_KEY`\n\n### search.serper — Serper\n\nGoogle Search results — web, images, news.\n\n```bash\nharbor p.serper search --q \"kubernetes best practices\"\nharbor p.serper news --q \"AI regulation\" --num 5\nharbor p.serper images --q \"architecture diagram\"\n```\n\nSecrets: `SERPER_API_KEY`\n\n### search.tavily — Tavily\n\nAI-optimized search with ranked results and optional LLM answers.\n\n```bash\nharbor p.tavily search --query \"RAG best practices\" --search_depth advanced\nharbor p.tavily extract --urls '[\"https://example.com\"]'\n```\n\nSecrets: `TAVILY_API_KEY`\n\n---\n\n## Media plugins (API — no local install needed)\n\n### media.replicate — Replicate\n\nGenerative media via the Replicate prediction API.\n\n```bash\n# Create a prediction (async)\nharbor p.replicate create-prediction --version \"<sha>\" --input '{\"prompt\":\"a sunset\"}'\n\n# Poll for result\nharbor p.replicate get-prediction --prediction_id \"<id>\"\n\n# Use an official model (auto-resolves version)\nharbor p.replicate create-prediction-official --owner stability-ai --name sdxl --input '{\"prompt\":\"a sunset\"}'\n```\n\nSecrets: `REPLICATE_API_TOKEN`\n\n### media.fal — fal.ai\n\nImage, video, and audio generation.\n\n```bash\nharbor p.fal generate --model_id \"fal-ai/flux/schnell\" --prompt \"a cat in space\"\nharbor p.fal queue-submit --model_id \"fal-ai/flux-pro\" --prompt \"detailed landscape\" --image_size landscape_16_9\n```\n\nSecrets: `FAL_KEY`\n\n---\n\n## AI plugins (API — no local install needed)\n\n### ai.openrouter — OpenRouter\n\nUnified AI gateway with 300+ models from 60+ providers.\n\n```bash\nharbor p.openrouter chat --model \"anthropic/claude-sonnet-4\" --messages '[{\"role\":\"user\",\"content\":\"Hello\"}]'\nharbor p.openrouter models\n```\n\nSecrets: `OPENROUTER_API_KEY`\n\n### ai.grok — Grok (xAI)\n\nChat completions and live search (web + X/Twitter) via the Responses API.\n\n```bash\n# Plain chat\nharbor p.grok chat --model \"grok-3-mini\" --messages '[{\"role\":\"user\",\"content\":\"Explain quantum computing\"}]'\n\n# Live web search\nharbor p.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"Latest news\"}]'\n\n# X (Twitter) search\nharbor p.grok search --model \"grok-3-mini\" --input '[{\"role\":\"user\",\"content\":\"trending AI topics\"}]' --tools '[{\"type\":\"x_search\"}]'\n```\n\nSecrets: `XAI_API_KEY`\n\n---\n\n## Error handling\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `lease_required` | No active lease for this plugin | `harbor request <slug>` — ask operator to grant lease |\n| `lease_expired` | Lease timed out | `harbor request <slug>` to renew |\n| `plugin_setup_required` | Operator hasn't enabled the plugin | `harbor request <slug>` — operator must configure it in dashboard |\n| `Token missing` | Secrets not configured | `harbor msg \"Plugin <slug> needs API keys in secrets\"` |\n| `unauthorized` | Daemon token expired | `harbor setup status` to refresh |\n| Binary not found | CLI tool not installed | See install commands above |\n| Run killed mid-execution | Operator revoked the lease | Stop and report — this was intentional |\n\n## Operator communication\n\n```bash\n# Send context to the operator\nharbor msg \"Starting deployment — this will take ~2 minutes\"\n\n# Check for operator messages\nharbor messages\n\n# Request access to a plugin\nharbor request search.exa\n```\n\n## Multi-plugin workflows\n\nRequest only what you need, when you need it:\n\n```bash\nharbor status\nharbor request search.exa --reason \"Need to research topic for the user\"\n\n# Execute first step\nRESULTS=$(harbor p.exa search --query \"topic\")\n\n# Request next plugin only when you actually need it\nharbor request services.gh --reason \"Need to file research findings\"\nharbor p.gh issue create --title \"Research: topic\" --body \"$RESULTS\"\n```\n\n**Do not** loop through `harbor status` and request every available plugin.\n",
|
|
107
252
|
},
|
|
108
253
|
];
|
|
109
254
|
export const SKILL_MAP = new Map(SKILLS.map(s => [s.name, s]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-embedded.js","sourceRoot":"","sources":["../src/skills-embedded.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAI3E,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"skills-embedded.js","sourceRoot":"","sources":["../src/skills-embedded.ts"],"names":[],"mappings":"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"}
|