@troykelly/openclaw-projects 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +273 -19
  2. package/dist/hooks.d.ts.map +1 -1
  3. package/dist/hooks.js +72 -19
  4. package/dist/hooks.js.map +1 -1
  5. package/dist/register-openclaw.d.ts.map +1 -1
  6. package/dist/register-openclaw.js +232 -67
  7. package/dist/register-openclaw.js.map +1 -1
  8. package/dist/tool-guidance/catalog.d.ts +36 -0
  9. package/dist/tool-guidance/catalog.d.ts.map +1 -0
  10. package/dist/tool-guidance/catalog.js +1261 -0
  11. package/dist/tool-guidance/catalog.js.map +1 -0
  12. package/dist/tools/dev-sessions.js +7 -7
  13. package/dist/tools/dev-sessions.js.map +1 -1
  14. package/dist/tools/index.d.ts +1 -0
  15. package/dist/tools/index.d.ts.map +1 -1
  16. package/dist/tools/index.js +2 -0
  17. package/dist/tools/index.js.map +1 -1
  18. package/dist/tools/notebooks.d.ts.map +1 -1
  19. package/dist/tools/notebooks.js +3 -5
  20. package/dist/tools/notebooks.js.map +1 -1
  21. package/dist/tools/notes.d.ts.map +1 -1
  22. package/dist/tools/notes.js +5 -7
  23. package/dist/tools/notes.js.map +1 -1
  24. package/dist/tools/terminal-connections.js +8 -8
  25. package/dist/tools/terminal-connections.js.map +1 -1
  26. package/dist/tools/terminal-search.js +2 -2
  27. package/dist/tools/terminal-search.js.map +1 -1
  28. package/dist/tools/terminal-sessions.js +7 -7
  29. package/dist/tools/terminal-sessions.js.map +1 -1
  30. package/dist/tools/terminal-tunnels.js +3 -3
  31. package/dist/tools/terminal-tunnels.js.map +1 -1
  32. package/dist/tools/threads.d.ts +17 -5
  33. package/dist/tools/threads.d.ts.map +1 -1
  34. package/dist/tools/threads.js +14 -25
  35. package/dist/tools/threads.js.map +1 -1
  36. package/dist/tools/todos.d.ts +1 -1
  37. package/dist/tools/todos.d.ts.map +1 -1
  38. package/dist/tools/todos.js +13 -2
  39. package/dist/tools/todos.js.map +1 -1
  40. package/dist/tools/tool-guide.d.ts +93 -0
  41. package/dist/tools/tool-guide.d.ts.map +1 -0
  42. package/dist/tools/tool-guide.js +257 -0
  43. package/dist/tools/tool-guide.js.map +1 -0
  44. package/dist/types/openclaw-api.d.ts +4 -0
  45. package/dist/types/openclaw-api.d.ts.map +1 -1
  46. package/openclaw.plugin.json +2 -2
  47. package/package.json +2 -2
  48. package/skills/api-integration/SKILL.md +35 -0
  49. package/skills/contact-relationship-map/SKILL.md +39 -0
  50. package/skills/dev-session-report/SKILL.md +39 -0
  51. package/skills/namespace-audit/SKILL.md +38 -0
  52. package/skills/note-meeting/SKILL.md +46 -0
  53. package/skills/terminal-setup/SKILL.md +38 -0
  54. package/skills/weekly-review/SKILL.md +40 -0
@@ -0,0 +1,1261 @@
1
+ /**
2
+ * Static guidance registry for the tool_guide meta-tool.
3
+ * Provides structured usage guidance for every registered tool.
4
+ * Part of Issue #1923.
5
+ */
6
+ /**
7
+ * Per-tool guidance catalog.
8
+ * Keys are tool names exactly as registered with the OpenClaw gateway.
9
+ */
10
+ export const TOOL_CATALOG = {
11
+ // ── Memory tools ──────────────────────────────────────────────
12
+ memory_recall: {
13
+ group: 'memory',
14
+ when_to_use: 'When you need to retrieve stored memories, preferences, facts, or past decisions. Use for context about users, relationships, or prior interactions.',
15
+ when_not_to_use: 'When looking for tasks/todos (use todo_search), projects (use project_search), or messages (use message_search).',
16
+ alternatives: ['context_search', 'api_recall'],
17
+ side_effects: [],
18
+ prerequisites: ['Memories must have been stored previously via memory_store.'],
19
+ example_calls: [
20
+ { description: 'Search for food preferences', params: { query: 'food preferences', limit: 5 } },
21
+ { description: 'Find memories with specific tags', params: { query: 'meeting notes', tags: ['work'] } },
22
+ ],
23
+ },
24
+ memory_store: {
25
+ group: 'memory',
26
+ when_to_use: 'When you need to persist a preference, fact, decision, or context for future reference across sessions.',
27
+ when_not_to_use: 'When creating tasks (use todo_create) or projects (use project_create). Do not store transient or ephemeral information.',
28
+ alternatives: ['skill_store_put'],
29
+ side_effects: ['Creates a new memory record with vector embedding.'],
30
+ prerequisites: [],
31
+ example_calls: [
32
+ { description: 'Store a food preference', params: { content: 'User prefers vegetarian meals', category: 'preference', tags: ['food'] } },
33
+ ],
34
+ },
35
+ memory_forget: {
36
+ group: 'memory',
37
+ when_to_use: 'When a stored memory is outdated, incorrect, or the user requests deletion.',
38
+ when_not_to_use: 'When updating a memory — store a new one instead. Do not delete memories without user consent.',
39
+ alternatives: [],
40
+ side_effects: ['Permanently deletes the memory record.'],
41
+ prerequisites: ['Know the memory ID or have a search query to match.'],
42
+ example_calls: [
43
+ { description: 'Forget by ID', params: { memory_id: '550e8400-e29b-41d4-a716-446655440000' } },
44
+ { description: 'Forget by query', params: { query: 'old phone number' } },
45
+ ],
46
+ },
47
+ // ── Project tools ─────────────────────────────────────────────
48
+ project_list: {
49
+ group: 'projects',
50
+ when_to_use: 'When you need to see all projects or filter by status. Good for getting an overview of active work.',
51
+ when_not_to_use: 'When you already know the project ID (use project_get). When searching by keyword (use project_search).',
52
+ alternatives: ['project_search'],
53
+ side_effects: [],
54
+ prerequisites: [],
55
+ example_calls: [
56
+ { description: 'List active projects', params: { status: 'active' } },
57
+ { description: 'List all projects', params: {} },
58
+ ],
59
+ },
60
+ project_get: {
61
+ group: 'projects',
62
+ when_to_use: 'When you need detailed information about a specific project by ID.',
63
+ when_not_to_use: 'When browsing projects (use project_list) or searching (use project_search).',
64
+ alternatives: ['project_list'],
65
+ side_effects: [],
66
+ prerequisites: ['Need a valid project ID.'],
67
+ example_calls: [
68
+ { description: 'Get project details', params: { project_id: '550e8400-e29b-41d4-a716-446655440000' } },
69
+ ],
70
+ },
71
+ project_create: {
72
+ group: 'projects',
73
+ when_to_use: 'When the user wants to start tracking a new initiative, goal, or body of work.',
74
+ when_not_to_use: 'When adding a simple task (use todo_create). When the project already exists.',
75
+ alternatives: ['todo_create'],
76
+ side_effects: ['Creates a new project work item.'],
77
+ prerequisites: [],
78
+ example_calls: [
79
+ { description: 'Create a home renovation project', params: { name: 'Kitchen Renovation', description: 'Track all kitchen renovation tasks' } },
80
+ ],
81
+ },
82
+ project_search: {
83
+ group: 'projects',
84
+ when_to_use: 'When searching for projects by keyword, semantic similarity, or partial name match.',
85
+ when_not_to_use: 'When you already know the project ID (use project_get). When listing all projects (use project_list).',
86
+ alternatives: ['project_list', 'context_search'],
87
+ side_effects: [],
88
+ prerequisites: [],
89
+ example_calls: [
90
+ { description: 'Search for renovation projects', params: { query: 'renovation' } },
91
+ ],
92
+ },
93
+ // ── Todo tools ────────────────────────────────────────────────
94
+ todo_list: {
95
+ group: 'todos',
96
+ when_to_use: 'When listing tasks/todos, optionally filtered by project or status.',
97
+ when_not_to_use: 'When searching by keyword (use todo_search). When you need project-level info (use project_get).',
98
+ alternatives: ['todo_search'],
99
+ side_effects: [],
100
+ prerequisites: [],
101
+ example_calls: [
102
+ { description: 'List open todos in a project', params: { project_id: '550e8400-e29b-41d4-a716-446655440000', status: 'open' } },
103
+ ],
104
+ },
105
+ todo_create: {
106
+ group: 'todos',
107
+ when_to_use: 'When the user wants to add a new task, shopping list item, reminder, or action item.',
108
+ when_not_to_use: 'When creating a project or epic (use project_create). When storing a memory (use memory_store).',
109
+ alternatives: ['project_create'],
110
+ side_effects: ['Creates a new todo/task work item.'],
111
+ prerequisites: [],
112
+ example_calls: [
113
+ { description: 'Add a shopping list item', params: { title: 'Buy asparagus', project_id: '550e8400-e29b-41d4-a716-446655440000' } },
114
+ { description: 'Create a reminder', params: { title: 'Call mom', not_before: '2026-03-02T10:00:00Z' } },
115
+ ],
116
+ },
117
+ todo_complete: {
118
+ group: 'todos',
119
+ when_to_use: 'When marking a task as done or completed.',
120
+ when_not_to_use: 'When updating task details without completing (there is no general todo_update tool — create a new one if needed).',
121
+ alternatives: [],
122
+ side_effects: ['Marks the todo as completed.'],
123
+ prerequisites: ['Need a valid todo ID.'],
124
+ example_calls: [
125
+ { description: 'Complete a task', params: { id: '550e8400-e29b-41d4-a716-446655440000' } },
126
+ ],
127
+ },
128
+ todo_search: {
129
+ group: 'todos',
130
+ when_to_use: 'When searching for tasks by keyword or semantic similarity.',
131
+ when_not_to_use: 'When listing all tasks in a project (use todo_list). When searching across entity types (use context_search).',
132
+ alternatives: ['todo_list', 'context_search'],
133
+ side_effects: [],
134
+ prerequisites: [],
135
+ example_calls: [
136
+ { description: 'Search for grocery tasks', params: { query: 'groceries' } },
137
+ ],
138
+ },
139
+ // ── Search tools ──────────────────────────────────────────────
140
+ context_search: {
141
+ group: 'search',
142
+ when_to_use: 'When you need to search across multiple entity types (memories, todos, projects, messages) in one query.',
143
+ when_not_to_use: 'When you know exactly which entity type to search — use the specific search tool for better results.',
144
+ alternatives: ['memory_recall', 'todo_search', 'project_search', 'message_search'],
145
+ side_effects: [],
146
+ prerequisites: [],
147
+ example_calls: [
148
+ { description: 'Search everything about dentist', params: { query: 'dentist appointment' } },
149
+ { description: 'Search only memories and todos', params: { query: 'birthday', entity_types: ['memory', 'todo'] } },
150
+ ],
151
+ },
152
+ // ── Contact tools ─────────────────────────────────────────────
153
+ contact_search: {
154
+ group: 'contacts',
155
+ when_to_use: 'When looking up contacts by name, email, phone, or other attributes.',
156
+ when_not_to_use: 'When you already know the contact ID (use contact_get).',
157
+ alternatives: ['contact_get', 'contact_resolve'],
158
+ side_effects: [],
159
+ prerequisites: [],
160
+ example_calls: [
161
+ { description: 'Search by name', params: { query: 'John Smith' } },
162
+ ],
163
+ },
164
+ contact_get: {
165
+ group: 'contacts',
166
+ when_to_use: 'When retrieving full details for a specific contact by ID.',
167
+ when_not_to_use: 'When searching for contacts (use contact_search).',
168
+ alternatives: ['contact_search'],
169
+ side_effects: [],
170
+ prerequisites: ['Need a valid contact ID.'],
171
+ example_calls: [
172
+ { description: 'Get contact details', params: { contact_id: '550e8400-e29b-41d4-a716-446655440000' } },
173
+ ],
174
+ },
175
+ contact_create: {
176
+ group: 'contacts',
177
+ when_to_use: 'When adding a new person to the contacts system with their name and endpoints (email, phone, etc.).',
178
+ when_not_to_use: 'When the contact already exists (use contact_update). Search first to avoid duplicates.',
179
+ alternatives: ['contact_update'],
180
+ side_effects: ['Creates a new contact record.'],
181
+ prerequisites: ['Search first to check the contact does not already exist.'],
182
+ example_calls: [
183
+ { description: 'Create a contact', params: { display_name: 'Jane Doe', endpoints: [{ type: 'email', value: 'jane@example.com' }] } },
184
+ ],
185
+ },
186
+ contact_update: {
187
+ group: 'contacts',
188
+ when_to_use: 'When updating an existing contact\'s details (name, endpoints, metadata).',
189
+ when_not_to_use: 'When creating a new contact (use contact_create). When merging duplicates (use contact_merge).',
190
+ alternatives: ['contact_create', 'contact_merge'],
191
+ side_effects: ['Modifies the contact record.'],
192
+ prerequisites: ['Need a valid contact ID.'],
193
+ example_calls: [
194
+ { description: 'Update display name', params: { contact_id: '550e8400-e29b-41d4-a716-446655440000', display_name: 'Jane Smith' } },
195
+ ],
196
+ },
197
+ contact_merge: {
198
+ group: 'contacts',
199
+ when_to_use: 'When two contact records represent the same person and should be combined.',
200
+ when_not_to_use: 'When updating a single contact (use contact_update).',
201
+ alternatives: ['contact_update'],
202
+ side_effects: ['Merges two contacts — the secondary contact is absorbed into the primary.'],
203
+ prerequisites: ['Need two valid contact IDs. Confirm with user before merging.'],
204
+ example_calls: [
205
+ { description: 'Merge duplicate contacts', params: { survivor_id: '550e8400-0001', loser_id: '550e8400-0002' } },
206
+ ],
207
+ },
208
+ contact_tag_add: {
209
+ group: 'contacts',
210
+ when_to_use: 'When adding a tag/label to a contact for categorization.',
211
+ when_not_to_use: 'When removing tags (use contact_tag_remove).',
212
+ alternatives: [],
213
+ side_effects: ['Adds tag to the contact.'],
214
+ prerequisites: ['Need a valid contact ID.'],
215
+ example_calls: [
216
+ { description: 'Tag a contact as family', params: { contact_id: '550e8400-e29b-41d4-a716-446655440000', tag: 'family' } },
217
+ ],
218
+ },
219
+ contact_tag_remove: {
220
+ group: 'contacts',
221
+ when_to_use: 'When removing a tag/label from a contact.',
222
+ when_not_to_use: 'When adding tags (use contact_tag_add).',
223
+ alternatives: [],
224
+ side_effects: ['Removes tag from the contact.'],
225
+ prerequisites: ['Need a valid contact ID and existing tag.'],
226
+ example_calls: [
227
+ { description: 'Remove family tag', params: { contact_id: '550e8400-e29b-41d4-a716-446655440000', tag: 'family' } },
228
+ ],
229
+ },
230
+ contact_resolve: {
231
+ group: 'contacts',
232
+ when_to_use: 'When resolving a contact from an endpoint (email, phone number) to find the matching contact record.',
233
+ when_not_to_use: 'When searching by name (use contact_search). When you know the contact ID (use contact_get).',
234
+ alternatives: ['contact_search', 'contact_get'],
235
+ side_effects: [],
236
+ prerequisites: ['Need an endpoint value (email or phone).'],
237
+ example_calls: [
238
+ { description: 'Resolve by phone', params: { endpoint: '+61412345678' } },
239
+ ],
240
+ },
241
+ // ── Communication tools ───────────────────────────────────────
242
+ sms_send: {
243
+ group: 'communication',
244
+ when_to_use: 'When sending an SMS or text message to a phone number. Use for short text-based communication via SMS.',
245
+ when_not_to_use: 'When sending email (use email_send). When the recipient prefers a different channel.',
246
+ alternatives: ['email_send'],
247
+ side_effects: ['Sends an SMS message via Twilio. The recipient will receive the message.'],
248
+ prerequisites: ['Twilio must be configured. Need a valid phone number.'],
249
+ example_calls: [
250
+ { description: 'Send an SMS', params: { to: '+61412345678', body: 'Reminder: Dentist at 3pm today' } },
251
+ ],
252
+ },
253
+ email_send: {
254
+ group: 'communication',
255
+ when_to_use: 'When sending an email to a recipient.',
256
+ when_not_to_use: 'When sending SMS (use sms_send). When the message is internal or does not need email delivery.',
257
+ alternatives: ['sms_send'],
258
+ side_effects: ['Sends an email via configured email service. The recipient will receive the email.'],
259
+ prerequisites: ['Email service must be configured. Need a valid email address.'],
260
+ example_calls: [
261
+ { description: 'Send an email', params: { to: 'user@example.com', subject: 'Meeting Notes', body: 'Here are the notes from today.' } },
262
+ ],
263
+ },
264
+ message_search: {
265
+ group: 'communication',
266
+ when_to_use: 'When searching through past messages (SMS, email) by keyword or semantic similarity.',
267
+ when_not_to_use: 'When listing threads (use thread_list). When searching memories (use memory_recall).',
268
+ alternatives: ['context_search', 'thread_get'],
269
+ side_effects: [],
270
+ prerequisites: [],
271
+ example_calls: [
272
+ { description: 'Search messages about invoices', params: { query: 'invoice payment' } },
273
+ ],
274
+ },
275
+ // ── Thread tools ──────────────────────────────────────────────
276
+ thread_list: {
277
+ group: 'threads',
278
+ when_to_use: 'When listing conversation threads (SMS or email threads).',
279
+ when_not_to_use: 'When searching message content (use message_search). When you know the thread ID (use thread_get).',
280
+ alternatives: ['thread_get', 'message_search'],
281
+ side_effects: [],
282
+ prerequisites: [],
283
+ example_calls: [
284
+ { description: 'List recent threads', params: { limit: 10 } },
285
+ ],
286
+ },
287
+ thread_get: {
288
+ group: 'threads',
289
+ when_to_use: 'When retrieving a specific conversation thread with its messages.',
290
+ when_not_to_use: 'When browsing threads (use thread_list). When searching (use message_search).',
291
+ alternatives: ['thread_list'],
292
+ side_effects: [],
293
+ prerequisites: ['Need a valid thread ID.'],
294
+ example_calls: [
295
+ { description: 'Get thread messages', params: { thread_id: '550e8400-e29b-41d4-a716-446655440000' } },
296
+ ],
297
+ },
298
+ // ── Note tools ────────────────────────────────────────────────
299
+ note_create: {
300
+ group: 'notes',
301
+ when_to_use: 'When creating a new freeform note, document, or long-form content.',
302
+ when_not_to_use: 'When storing a simple fact or preference (use memory_store). When creating a task (use todo_create).',
303
+ alternatives: ['memory_store', 'notebook_create'],
304
+ side_effects: ['Creates a new note record.'],
305
+ prerequisites: [],
306
+ example_calls: [
307
+ { description: 'Create a meeting note', params: { title: 'Team standup 2026-03-01', content: 'Discussion points...', visibility: 'private' } },
308
+ ],
309
+ },
310
+ note_get: {
311
+ group: 'notes',
312
+ when_to_use: 'When retrieving a specific note by ID.',
313
+ when_not_to_use: 'When searching for notes (use note_search).',
314
+ alternatives: ['note_search'],
315
+ side_effects: [],
316
+ prerequisites: ['Need a valid note ID.'],
317
+ example_calls: [
318
+ { description: 'Get note details', params: { note_id: '550e8400-e29b-41d4-a716-446655440000' } },
319
+ ],
320
+ },
321
+ note_update: {
322
+ group: 'notes',
323
+ when_to_use: 'When modifying an existing note\'s title, content, or visibility.',
324
+ when_not_to_use: 'When creating a new note (use note_create). When deleting a note (use note_delete).',
325
+ alternatives: [],
326
+ side_effects: ['Modifies the note record.'],
327
+ prerequisites: ['Need a valid note ID.'],
328
+ example_calls: [
329
+ { description: 'Update note content', params: { note_id: '550e8400-e29b-41d4-a716-446655440000', content: 'Updated content...' } },
330
+ ],
331
+ },
332
+ note_delete: {
333
+ group: 'notes',
334
+ when_to_use: 'When permanently removing a note.',
335
+ when_not_to_use: 'When updating a note (use note_update). Confirm with user before deleting.',
336
+ alternatives: [],
337
+ side_effects: ['Permanently deletes the note.'],
338
+ prerequisites: ['Need a valid note ID. Confirm deletion with user.'],
339
+ example_calls: [
340
+ { description: 'Delete a note', params: { note_id: '550e8400-e29b-41d4-a716-446655440000' } },
341
+ ],
342
+ },
343
+ note_search: {
344
+ group: 'notes',
345
+ when_to_use: 'When searching for notes by keyword or semantic similarity.',
346
+ when_not_to_use: 'When you know the note ID (use note_get). When searching across all entity types (use context_search).',
347
+ alternatives: ['note_get', 'context_search'],
348
+ side_effects: [],
349
+ prerequisites: [],
350
+ example_calls: [
351
+ { description: 'Search meeting notes', params: { query: 'standup meeting' } },
352
+ ],
353
+ },
354
+ // ── Notebook tools ────────────────────────────────────────────
355
+ notebook_list: {
356
+ group: 'notebooks',
357
+ when_to_use: 'When listing available notebooks to organize notes.',
358
+ when_not_to_use: 'When you know the notebook ID (use notebook_get).',
359
+ alternatives: ['notebook_get'],
360
+ side_effects: [],
361
+ prerequisites: [],
362
+ example_calls: [
363
+ { description: 'List all notebooks', params: {} },
364
+ ],
365
+ },
366
+ notebook_create: {
367
+ group: 'notebooks',
368
+ when_to_use: 'When creating a new notebook to organize related notes.',
369
+ when_not_to_use: 'When creating a single note (use note_create). When the notebook already exists.',
370
+ alternatives: ['note_create'],
371
+ side_effects: ['Creates a new notebook.'],
372
+ prerequisites: [],
373
+ example_calls: [
374
+ { description: 'Create a work notebook', params: { name: 'Work Notes', description: 'Notes from work meetings' } },
375
+ ],
376
+ },
377
+ notebook_get: {
378
+ group: 'notebooks',
379
+ when_to_use: 'When retrieving a specific notebook and its notes by ID.',
380
+ when_not_to_use: 'When browsing notebooks (use notebook_list).',
381
+ alternatives: ['notebook_list'],
382
+ side_effects: [],
383
+ prerequisites: ['Need a valid notebook ID.'],
384
+ example_calls: [
385
+ { description: 'Get notebook details', params: { notebook_id: '550e8400-e29b-41d4-a716-446655440000' } },
386
+ ],
387
+ },
388
+ // ── Relationship tools ────────────────────────────────────────
389
+ relationship_set: {
390
+ group: 'relationships',
391
+ when_to_use: 'When defining or updating a relationship between two contacts (e.g., spouse, coworker, parent).',
392
+ when_not_to_use: 'When linking entities across systems (use links_set). When querying relationships (use relationship_query).',
393
+ alternatives: ['links_set'],
394
+ side_effects: ['Creates or updates a relationship between contacts.'],
395
+ prerequisites: ['Need two valid contact IDs.'],
396
+ example_calls: [
397
+ { description: 'Set a sibling relationship', params: { contact_id: '550e8400-0001', related_contact_id: '550e8400-0002', relationship_type: 'sibling' } },
398
+ ],
399
+ },
400
+ relationship_query: {
401
+ group: 'relationships',
402
+ when_to_use: 'When querying relationships for a contact to find connected people.',
403
+ when_not_to_use: 'When setting relationships (use relationship_set). When querying entity links (use links_query).',
404
+ alternatives: ['links_query'],
405
+ side_effects: [],
406
+ prerequisites: ['Need a valid contact ID.'],
407
+ example_calls: [
408
+ { description: 'Find family members', params: { contact_id: '550e8400-e29b-41d4-a716-446655440000', relationship_type: 'family' } },
409
+ ],
410
+ },
411
+ // ── Entity link tools ─────────────────────────────────────────
412
+ links_set: {
413
+ group: 'entity_links',
414
+ when_to_use: 'When linking entities (work items, contacts, memories) to each other or external resources.',
415
+ when_not_to_use: 'When setting contact relationships (use relationship_set).',
416
+ alternatives: ['relationship_set'],
417
+ side_effects: ['Creates a link between entities.'],
418
+ prerequisites: ['Need valid entity IDs for both source and target.'],
419
+ example_calls: [
420
+ { description: 'Link a todo to a contact', params: { source_type: 'work_item', source_id: '550e8400-0001', target_type: 'contact', target_id: '550e8400-0002', link_type: 'assigned_to' } },
421
+ ],
422
+ },
423
+ links_query: {
424
+ group: 'entity_links',
425
+ when_to_use: 'When querying links for an entity to find connected items.',
426
+ when_not_to_use: 'When querying contact relationships (use relationship_query).',
427
+ alternatives: ['relationship_query'],
428
+ side_effects: [],
429
+ prerequisites: ['Need a valid entity ID.'],
430
+ example_calls: [
431
+ { description: 'Find linked contacts', params: { source_type: 'work_item', source_id: '550e8400-e29b-41d4-a716-446655440000' } },
432
+ ],
433
+ },
434
+ links_remove: {
435
+ group: 'entity_links',
436
+ when_to_use: 'When removing a link between entities.',
437
+ when_not_to_use: 'When the link should be preserved. Confirm with user before removing.',
438
+ alternatives: [],
439
+ side_effects: ['Removes the entity link.'],
440
+ prerequisites: ['Need a valid link ID.'],
441
+ example_calls: [
442
+ { description: 'Remove a link', params: { link_id: '550e8400-e29b-41d4-a716-446655440000' } },
443
+ ],
444
+ },
445
+ // ── Skill store tools ─────────────────────────────────────────
446
+ skill_store_put: {
447
+ group: 'skill_store',
448
+ when_to_use: 'When storing or updating a reusable skill (prompt, workflow, template) for future use.',
449
+ when_not_to_use: 'When storing a memory/fact (use memory_store). When creating a prompt template (use prompt_template_create).',
450
+ alternatives: ['memory_store', 'prompt_template_create'],
451
+ side_effects: ['Creates or updates a skill in the store.'],
452
+ prerequisites: [],
453
+ example_calls: [
454
+ { description: 'Store a summarization skill', params: { name: 'summarize_email', content: 'Summarize the following email...', collection: 'email_tools' } },
455
+ ],
456
+ },
457
+ skill_store_get: {
458
+ group: 'skill_store',
459
+ when_to_use: 'When retrieving a specific skill by name or ID.',
460
+ when_not_to_use: 'When searching for skills (use skill_store_search). When listing skills (use skill_store_list).',
461
+ alternatives: ['skill_store_search', 'skill_store_list'],
462
+ side_effects: [],
463
+ prerequisites: ['Need a valid skill name or ID.'],
464
+ example_calls: [
465
+ { description: 'Get a skill', params: { name: 'summarize_email' } },
466
+ ],
467
+ },
468
+ skill_store_list: {
469
+ group: 'skill_store',
470
+ when_to_use: 'When listing available skills, optionally filtered by collection.',
471
+ when_not_to_use: 'When searching by keyword (use skill_store_search). When you know the skill name (use skill_store_get).',
472
+ alternatives: ['skill_store_search', 'skill_store_collections'],
473
+ side_effects: [],
474
+ prerequisites: [],
475
+ example_calls: [
476
+ { description: 'List skills in a collection', params: { collection: 'email_tools' } },
477
+ ],
478
+ },
479
+ skill_store_delete: {
480
+ group: 'skill_store',
481
+ when_to_use: 'When removing a skill from the store.',
482
+ when_not_to_use: 'When updating a skill (use skill_store_put). Confirm with user before deleting.',
483
+ alternatives: [],
484
+ side_effects: ['Deletes the skill from the store.'],
485
+ prerequisites: ['Need a valid skill name or ID.'],
486
+ example_calls: [
487
+ { description: 'Delete a skill', params: { name: 'old_skill' } },
488
+ ],
489
+ },
490
+ skill_store_search: {
491
+ group: 'skill_store',
492
+ when_to_use: 'When searching for skills by keyword or semantic similarity.',
493
+ when_not_to_use: 'When listing all skills (use skill_store_list). When you know the skill name (use skill_store_get).',
494
+ alternatives: ['skill_store_list', 'skill_store_get'],
495
+ side_effects: [],
496
+ prerequisites: [],
497
+ example_calls: [
498
+ { description: 'Search for email skills', params: { query: 'email summarization' } },
499
+ ],
500
+ },
501
+ skill_store_collections: {
502
+ group: 'skill_store',
503
+ when_to_use: 'When listing available skill collections to understand how skills are organized.',
504
+ when_not_to_use: 'When searching for individual skills (use skill_store_search).',
505
+ alternatives: ['skill_store_list'],
506
+ side_effects: [],
507
+ prerequisites: [],
508
+ example_calls: [
509
+ { description: 'List all collections', params: {} },
510
+ ],
511
+ },
512
+ skill_store_aggregate: {
513
+ group: 'skill_store',
514
+ when_to_use: 'When getting aggregated statistics about skills in the store (counts, collections).',
515
+ when_not_to_use: 'When retrieving individual skills.',
516
+ alternatives: ['skill_store_collections'],
517
+ side_effects: [],
518
+ prerequisites: [],
519
+ example_calls: [
520
+ { description: 'Get skill statistics', params: {} },
521
+ ],
522
+ },
523
+ // ── File share tools ──────────────────────────────────────────
524
+ file_share: {
525
+ group: 'file_share',
526
+ when_to_use: 'When generating a shareable download link for a file attachment.',
527
+ when_not_to_use: 'When uploading files or managing file content.',
528
+ alternatives: [],
529
+ side_effects: ['Generates a time-limited share URL.'],
530
+ prerequisites: ['Need a valid file attachment ID.'],
531
+ example_calls: [
532
+ { description: 'Create share link', params: { file_id: '550e8400-e29b-41d4-a716-446655440000', expires_in: 3600 } },
533
+ ],
534
+ },
535
+ // ── Terminal connection tools ─────────────────────────────────
536
+ terminal_connection_list: {
537
+ group: 'terminal_connections',
538
+ when_to_use: 'When listing saved SSH/terminal connection configurations.',
539
+ when_not_to_use: 'When managing active sessions (use terminal_session_list).',
540
+ alternatives: ['terminal_session_list'],
541
+ side_effects: [],
542
+ prerequisites: [],
543
+ example_calls: [
544
+ { description: 'List all connections', params: {} },
545
+ ],
546
+ },
547
+ terminal_connection_create: {
548
+ group: 'terminal_connections',
549
+ when_to_use: 'When saving a new SSH/terminal connection configuration.',
550
+ when_not_to_use: 'When starting a session on an existing connection (use terminal_session_start).',
551
+ alternatives: [],
552
+ side_effects: ['Creates a new connection configuration.'],
553
+ prerequisites: ['Need hostname, port, and authentication details.'],
554
+ example_calls: [
555
+ { description: 'Create SSH connection', params: { name: 'prod-server', hostname: 'example.com', port: 22, auth_method: 'key' } },
556
+ ],
557
+ },
558
+ terminal_connection_update: {
559
+ group: 'terminal_connections',
560
+ when_to_use: 'When updating an existing connection configuration.',
561
+ when_not_to_use: 'When creating a new connection (use terminal_connection_create).',
562
+ alternatives: [],
563
+ side_effects: ['Modifies the connection configuration.'],
564
+ prerequisites: ['Need a valid connection ID.'],
565
+ example_calls: [
566
+ { description: 'Update connection port', params: { connection_id: '550e8400-e29b-41d4-a716-446655440000', port: 2222 } },
567
+ ],
568
+ },
569
+ terminal_connection_delete: {
570
+ group: 'terminal_connections',
571
+ when_to_use: 'When removing a saved connection configuration.',
572
+ when_not_to_use: 'When terminating an active session (use terminal_session_terminate).',
573
+ alternatives: [],
574
+ side_effects: ['Deletes the connection configuration.'],
575
+ prerequisites: ['Need a valid connection ID. Confirm with user.'],
576
+ example_calls: [
577
+ { description: 'Delete a connection', params: { connection_id: '550e8400-e29b-41d4-a716-446655440000' } },
578
+ ],
579
+ },
580
+ terminal_connection_test: {
581
+ group: 'terminal_connections',
582
+ when_to_use: 'When testing whether a saved connection can be established successfully.',
583
+ when_not_to_use: 'When starting a full session (use terminal_session_start).',
584
+ alternatives: ['terminal_session_start'],
585
+ side_effects: ['Attempts a test connection to the remote host.'],
586
+ prerequisites: ['Need a valid connection ID with credentials.'],
587
+ example_calls: [
588
+ { description: 'Test a connection', params: { connection_id: '550e8400-e29b-41d4-a716-446655440000' } },
589
+ ],
590
+ },
591
+ terminal_credential_create: {
592
+ group: 'terminal_connections',
593
+ when_to_use: 'When storing SSH credentials (keys, passwords) for terminal connections.',
594
+ when_not_to_use: 'When managing API credentials (use api_credential_manage).',
595
+ alternatives: ['api_credential_manage'],
596
+ side_effects: ['Stores encrypted credentials.'],
597
+ prerequisites: ['Need the credential value (key or password).'],
598
+ example_calls: [
599
+ { description: 'Store an SSH key', params: { name: 'prod-key', kind: 'private_key', value: '...' } },
600
+ ],
601
+ },
602
+ terminal_credential_list: {
603
+ group: 'terminal_connections',
604
+ when_to_use: 'When listing stored terminal credentials (names and types, not values).',
605
+ when_not_to_use: 'When listing API credentials.',
606
+ alternatives: [],
607
+ side_effects: [],
608
+ prerequisites: [],
609
+ example_calls: [
610
+ { description: 'List credentials', params: {} },
611
+ ],
612
+ },
613
+ terminal_credential_delete: {
614
+ group: 'terminal_connections',
615
+ when_to_use: 'When removing stored terminal credentials.',
616
+ when_not_to_use: 'When the credential is still in use by a connection.',
617
+ alternatives: [],
618
+ side_effects: ['Deletes the stored credential.'],
619
+ prerequisites: ['Need a valid credential ID. Ensure no connections depend on it.'],
620
+ example_calls: [
621
+ { description: 'Delete a credential', params: { credential_id: '550e8400-e29b-41d4-a716-446655440000' } },
622
+ ],
623
+ },
624
+ // ── Terminal session tools ────────────────────────────────────
625
+ terminal_session_start: {
626
+ group: 'terminal_sessions',
627
+ when_to_use: 'When starting a new interactive terminal session using a saved connection.',
628
+ when_not_to_use: 'When listing existing sessions (use terminal_session_list).',
629
+ alternatives: [],
630
+ side_effects: ['Opens a new SSH session to the remote host.'],
631
+ prerequisites: ['Need a valid connection ID with working credentials.'],
632
+ example_calls: [
633
+ { description: 'Start a session', params: { connection_id: '550e8400-e29b-41d4-a716-446655440000' } },
634
+ ],
635
+ },
636
+ terminal_session_list: {
637
+ group: 'terminal_sessions',
638
+ when_to_use: 'When listing active terminal sessions.',
639
+ when_not_to_use: 'When listing saved connections (use terminal_connection_list).',
640
+ alternatives: ['terminal_connection_list'],
641
+ side_effects: [],
642
+ prerequisites: [],
643
+ example_calls: [
644
+ { description: 'List active sessions', params: {} },
645
+ ],
646
+ },
647
+ terminal_session_terminate: {
648
+ group: 'terminal_sessions',
649
+ when_to_use: 'When ending an active terminal session.',
650
+ when_not_to_use: 'When deleting a saved connection (use terminal_connection_delete).',
651
+ alternatives: [],
652
+ side_effects: ['Terminates the SSH session.'],
653
+ prerequisites: ['Need a valid session ID.'],
654
+ example_calls: [
655
+ { description: 'Terminate a session', params: { session_id: '550e8400-e29b-41d4-a716-446655440000' } },
656
+ ],
657
+ },
658
+ terminal_session_info: {
659
+ group: 'terminal_sessions',
660
+ when_to_use: 'When getting detailed information about an active terminal session.',
661
+ when_not_to_use: 'When listing all sessions (use terminal_session_list).',
662
+ alternatives: ['terminal_session_list'],
663
+ side_effects: [],
664
+ prerequisites: ['Need a valid session ID.'],
665
+ example_calls: [
666
+ { description: 'Get session info', params: { session_id: '550e8400-e29b-41d4-a716-446655440000' } },
667
+ ],
668
+ },
669
+ terminal_send_command: {
670
+ group: 'terminal_sessions',
671
+ when_to_use: 'When executing a command in an active terminal session and capturing output.',
672
+ when_not_to_use: 'When sending raw keystrokes (use terminal_send_keys). When no session is active.',
673
+ alternatives: ['terminal_send_keys'],
674
+ side_effects: ['Executes a command on the remote host.'],
675
+ prerequisites: ['Need an active terminal session.'],
676
+ example_calls: [
677
+ { description: 'Run a command', params: { session_id: '550e8400-e29b-41d4-a716-446655440000', command: 'ls -la' } },
678
+ ],
679
+ },
680
+ terminal_send_keys: {
681
+ group: 'terminal_sessions',
682
+ when_to_use: 'When sending raw keystrokes to an active terminal session (for interactive programs, ctrl+c, etc.).',
683
+ when_not_to_use: 'When executing a simple command (use terminal_send_command).',
684
+ alternatives: ['terminal_send_command'],
685
+ side_effects: ['Sends keystrokes to the remote host.'],
686
+ prerequisites: ['Need an active terminal session.'],
687
+ example_calls: [
688
+ { description: 'Send ctrl+c', params: { session_id: '550e8400-e29b-41d4-a716-446655440000', keys: '\x03' } },
689
+ ],
690
+ },
691
+ terminal_capture_pane: {
692
+ group: 'terminal_sessions',
693
+ when_to_use: 'When capturing the current terminal screen/pane content from an active session.',
694
+ when_not_to_use: 'When executing commands (use terminal_send_command which returns output).',
695
+ alternatives: ['terminal_send_command'],
696
+ side_effects: [],
697
+ prerequisites: ['Need an active terminal session.'],
698
+ example_calls: [
699
+ { description: 'Capture screen', params: { session_id: '550e8400-e29b-41d4-a716-446655440000' } },
700
+ ],
701
+ },
702
+ // ── Terminal tunnel tools ─────────────────────────────────────
703
+ terminal_tunnel_create: {
704
+ group: 'terminal_tunnels',
705
+ when_to_use: 'When creating an SSH port-forwarding tunnel (local or remote).',
706
+ when_not_to_use: 'When starting a terminal session (use terminal_session_start).',
707
+ alternatives: [],
708
+ side_effects: ['Creates a port-forwarding tunnel through SSH.'],
709
+ prerequisites: ['Need an active terminal session.'],
710
+ example_calls: [
711
+ { description: 'Create local tunnel', params: { session_id: '550e8400-e29b-41d4-a716-446655440000', direction: 'local', local_port: 8080, remote_port: 80 } },
712
+ ],
713
+ },
714
+ terminal_tunnel_list: {
715
+ group: 'terminal_tunnels',
716
+ when_to_use: 'When listing active SSH tunnels.',
717
+ when_not_to_use: 'When listing sessions (use terminal_session_list).',
718
+ alternatives: ['terminal_session_list'],
719
+ side_effects: [],
720
+ prerequisites: [],
721
+ example_calls: [
722
+ { description: 'List tunnels', params: {} },
723
+ ],
724
+ },
725
+ terminal_tunnel_close: {
726
+ group: 'terminal_tunnels',
727
+ when_to_use: 'When closing an SSH port-forwarding tunnel.',
728
+ when_not_to_use: 'When terminating a session (use terminal_session_terminate which closes all tunnels).',
729
+ alternatives: ['terminal_session_terminate'],
730
+ side_effects: ['Closes the tunnel.'],
731
+ prerequisites: ['Need a valid tunnel ID.'],
732
+ example_calls: [
733
+ { description: 'Close a tunnel', params: { tunnel_id: '550e8400-e29b-41d4-a716-446655440000' } },
734
+ ],
735
+ },
736
+ // ── Terminal search tools ─────────────────────────────────────
737
+ terminal_search: {
738
+ group: 'terminal_search',
739
+ when_to_use: 'When searching through terminal session history, command output, or annotations.',
740
+ when_not_to_use: 'When searching memories or messages (use memory_recall or message_search).',
741
+ alternatives: ['terminal_capture_pane'],
742
+ side_effects: [],
743
+ prerequisites: ['Need terminal sessions with recorded history.'],
744
+ example_calls: [
745
+ { description: 'Search command history', params: { query: 'deploy', session_id: '550e8400-e29b-41d4-a716-446655440000' } },
746
+ ],
747
+ },
748
+ terminal_annotate: {
749
+ group: 'terminal_search',
750
+ when_to_use: 'When adding a note or annotation to a terminal session entry for future reference.',
751
+ when_not_to_use: 'When creating a general note (use note_create).',
752
+ alternatives: ['note_create'],
753
+ side_effects: ['Adds annotation to the terminal entry.'],
754
+ prerequisites: ['Need a valid terminal entry ID.'],
755
+ example_calls: [
756
+ { description: 'Annotate a command', params: { entry_id: '550e8400-e29b-41d4-a716-446655440000', annotation: 'This fixed the deployment issue' } },
757
+ ],
758
+ },
759
+ // ── Dev session tools ─────────────────────────────────────────
760
+ dev_session_create: {
761
+ group: 'dev_sessions',
762
+ when_to_use: 'When starting a new development session to track coding work (issues, commits, test results).',
763
+ when_not_to_use: 'When tracking general tasks (use todo_create). When starting a terminal session (use terminal_session_start).',
764
+ alternatives: ['todo_create'],
765
+ side_effects: ['Creates a new dev session record.'],
766
+ prerequisites: [],
767
+ example_calls: [
768
+ { description: 'Start a dev session', params: { title: 'Working on issue #123', issue_url: 'https://github.com/org/repo/issues/123' } },
769
+ ],
770
+ },
771
+ dev_session_list: {
772
+ group: 'dev_sessions',
773
+ when_to_use: 'When listing development sessions, optionally filtered by status.',
774
+ when_not_to_use: 'When you know the session ID (use dev_session_get).',
775
+ alternatives: ['dev_session_get'],
776
+ side_effects: [],
777
+ prerequisites: [],
778
+ example_calls: [
779
+ { description: 'List active dev sessions', params: { status: 'active' } },
780
+ ],
781
+ },
782
+ dev_session_get: {
783
+ group: 'dev_sessions',
784
+ when_to_use: 'When retrieving full details of a specific development session.',
785
+ when_not_to_use: 'When listing sessions (use dev_session_list).',
786
+ alternatives: ['dev_session_list'],
787
+ side_effects: [],
788
+ prerequisites: ['Need a valid dev session ID.'],
789
+ example_calls: [
790
+ { description: 'Get session details', params: { session_id: '550e8400-e29b-41d4-a716-446655440000' } },
791
+ ],
792
+ },
793
+ dev_session_update: {
794
+ group: 'dev_sessions',
795
+ when_to_use: 'When updating a development session with progress, commits, or notes.',
796
+ when_not_to_use: 'When completing a session (use dev_session_complete).',
797
+ alternatives: ['dev_session_complete'],
798
+ side_effects: ['Modifies the dev session record.'],
799
+ prerequisites: ['Need a valid dev session ID.'],
800
+ example_calls: [
801
+ { description: 'Add progress note', params: { session_id: '550e8400-e29b-41d4-a716-446655440000', notes: 'Tests passing, PR ready for review' } },
802
+ ],
803
+ },
804
+ dev_session_complete: {
805
+ group: 'dev_sessions',
806
+ when_to_use: 'When marking a development session as complete.',
807
+ when_not_to_use: 'When updating progress (use dev_session_update). When abandoning (provide a reason).',
808
+ alternatives: ['dev_session_update'],
809
+ side_effects: ['Marks the dev session as completed.'],
810
+ prerequisites: ['Need a valid dev session ID.'],
811
+ example_calls: [
812
+ { description: 'Complete a session', params: { session_id: '550e8400-e29b-41d4-a716-446655440000', summary: 'Fixed bug #123, all tests passing' } },
813
+ ],
814
+ },
815
+ // ── API management tools ──────────────────────────────────────
816
+ api_onboard: {
817
+ group: 'api_management',
818
+ when_to_use: 'When onboarding a new external API by providing its OpenAPI spec for parsing into searchable memories.',
819
+ when_not_to_use: 'When recalling already-onboarded APIs (use api_recall).',
820
+ alternatives: ['api_recall'],
821
+ side_effects: ['Parses the API spec and stores it as searchable memories.'],
822
+ prerequisites: ['Need an OpenAPI spec URL or inline content.'],
823
+ example_calls: [
824
+ { description: 'Onboard from URL', params: { spec_url: 'https://api.example.com/openapi.json', name: 'Example API' } },
825
+ ],
826
+ },
827
+ api_recall: {
828
+ group: 'api_management',
829
+ when_to_use: 'When searching onboarded API memories to find endpoints, operations, and capabilities.',
830
+ when_not_to_use: 'When searching general memories (use memory_recall). When the API has not been onboarded yet (use api_onboard first).',
831
+ alternatives: ['memory_recall', 'api_get'],
832
+ side_effects: [],
833
+ prerequisites: ['API must be onboarded via api_onboard.'],
834
+ example_calls: [
835
+ { description: 'Find user endpoints', params: { query: 'create user account' } },
836
+ ],
837
+ },
838
+ api_get: {
839
+ group: 'api_management',
840
+ when_to_use: 'When retrieving details about a specific onboarded API source.',
841
+ when_not_to_use: 'When searching across APIs (use api_recall). When listing APIs (use api_list).',
842
+ alternatives: ['api_recall', 'api_list'],
843
+ side_effects: [],
844
+ prerequisites: ['Need a valid API source ID.'],
845
+ example_calls: [
846
+ { description: 'Get API details', params: { source_id: '550e8400-e29b-41d4-a716-446655440000' } },
847
+ ],
848
+ },
849
+ api_list: {
850
+ group: 'api_management',
851
+ when_to_use: 'When listing all onboarded API sources.',
852
+ when_not_to_use: 'When searching API operations (use api_recall). When you know the source ID (use api_get).',
853
+ alternatives: ['api_get', 'api_recall'],
854
+ side_effects: [],
855
+ prerequisites: [],
856
+ example_calls: [
857
+ { description: 'List onboarded APIs', params: {} },
858
+ ],
859
+ },
860
+ api_update: {
861
+ group: 'api_management',
862
+ when_to_use: 'When updating an onboarded API source (re-parsing spec, changing config).',
863
+ when_not_to_use: 'When refreshing credentials (use api_refresh). When removing an API (use api_remove).',
864
+ alternatives: ['api_refresh'],
865
+ side_effects: ['Updates the API source and may re-parse the spec.'],
866
+ prerequisites: ['Need a valid API source ID.'],
867
+ example_calls: [
868
+ { description: 'Update API config', params: { source_id: '550e8400-e29b-41d4-a716-446655440000', name: 'Updated API Name' } },
869
+ ],
870
+ },
871
+ api_credential_manage: {
872
+ group: 'api_management',
873
+ when_to_use: 'When managing credentials (API keys, OAuth tokens) for onboarded APIs.',
874
+ when_not_to_use: 'When managing terminal credentials (use terminal_credential_create).',
875
+ alternatives: ['terminal_credential_create'],
876
+ side_effects: ['Stores or updates API credentials.'],
877
+ prerequisites: ['Need a valid API source ID and credential values.'],
878
+ example_calls: [
879
+ { description: 'Set API key', params: { source_id: '550e8400-e29b-41d4-a716-446655440000', credential_type: 'api_key', value: 'sk-...' } },
880
+ ],
881
+ },
882
+ api_refresh: {
883
+ group: 'api_management',
884
+ when_to_use: 'When refreshing an onboarded API source to re-fetch and re-parse its spec.',
885
+ when_not_to_use: 'When updating metadata (use api_update).',
886
+ alternatives: ['api_update'],
887
+ side_effects: ['Re-fetches and re-parses the API spec.'],
888
+ prerequisites: ['Need a valid API source ID.'],
889
+ example_calls: [
890
+ { description: 'Refresh API spec', params: { source_id: '550e8400-e29b-41d4-a716-446655440000' } },
891
+ ],
892
+ },
893
+ api_remove: {
894
+ group: 'api_management',
895
+ when_to_use: 'When soft-deleting an onboarded API source.',
896
+ when_not_to_use: 'When temporarily disabling (not supported — remove and re-onboard). Confirm with user.',
897
+ alternatives: ['api_restore'],
898
+ side_effects: ['Soft-deletes the API source.'],
899
+ prerequisites: ['Need a valid API source ID. Confirm with user.'],
900
+ example_calls: [
901
+ { description: 'Remove an API', params: { source_id: '550e8400-e29b-41d4-a716-446655440000' } },
902
+ ],
903
+ },
904
+ api_restore: {
905
+ group: 'api_management',
906
+ when_to_use: 'When restoring a previously soft-deleted API source.',
907
+ when_not_to_use: 'When the API was never onboarded (use api_onboard).',
908
+ alternatives: ['api_onboard'],
909
+ side_effects: ['Restores the soft-deleted API source.'],
910
+ prerequisites: ['Need a valid deleted API source ID.'],
911
+ example_calls: [
912
+ { description: 'Restore a deleted API', params: { source_id: '550e8400-e29b-41d4-a716-446655440000' } },
913
+ ],
914
+ },
915
+ // ── Prompt template tools ─────────────────────────────────────
916
+ prompt_template_list: {
917
+ group: 'prompt_templates',
918
+ when_to_use: 'When listing available prompt templates.',
919
+ when_not_to_use: 'When you know the template name (use prompt_template_get).',
920
+ alternatives: ['prompt_template_get'],
921
+ side_effects: [],
922
+ prerequisites: [],
923
+ example_calls: [
924
+ { description: 'List templates', params: {} },
925
+ ],
926
+ },
927
+ prompt_template_get: {
928
+ group: 'prompt_templates',
929
+ when_to_use: 'When retrieving a specific prompt template by name or ID.',
930
+ when_not_to_use: 'When listing templates (use prompt_template_list).',
931
+ alternatives: ['prompt_template_list'],
932
+ side_effects: [],
933
+ prerequisites: ['Need a valid template name or ID.'],
934
+ example_calls: [
935
+ { description: 'Get a template', params: { name: 'welcome_message' } },
936
+ ],
937
+ },
938
+ prompt_template_create: {
939
+ group: 'prompt_templates',
940
+ when_to_use: 'When creating a new prompt template for reuse.',
941
+ when_not_to_use: 'When storing a skill (use skill_store_put). When the template already exists (use prompt_template_update).',
942
+ alternatives: ['skill_store_put', 'prompt_template_update'],
943
+ side_effects: ['Creates a new prompt template.'],
944
+ prerequisites: [],
945
+ example_calls: [
946
+ { description: 'Create a template', params: { name: 'welcome_message', content: 'Hello {{name}}, welcome!' } },
947
+ ],
948
+ },
949
+ prompt_template_update: {
950
+ group: 'prompt_templates',
951
+ when_to_use: 'When updating an existing prompt template.',
952
+ when_not_to_use: 'When creating a new template (use prompt_template_create).',
953
+ alternatives: ['prompt_template_create'],
954
+ side_effects: ['Modifies the prompt template.'],
955
+ prerequisites: ['Need a valid template name or ID.'],
956
+ example_calls: [
957
+ { description: 'Update template content', params: { name: 'welcome_message', content: 'Hi {{name}}, welcome back!' } },
958
+ ],
959
+ },
960
+ prompt_template_delete: {
961
+ group: 'prompt_templates',
962
+ when_to_use: 'When deleting a prompt template.',
963
+ when_not_to_use: 'When updating a template (use prompt_template_update). Confirm with user.',
964
+ alternatives: [],
965
+ side_effects: ['Deletes the prompt template.'],
966
+ prerequisites: ['Need a valid template name or ID. Confirm with user.'],
967
+ example_calls: [
968
+ { description: 'Delete a template', params: { name: 'old_template' } },
969
+ ],
970
+ },
971
+ // ── Inbound routing tools ─────────────────────────────────────
972
+ inbound_destination_list: {
973
+ group: 'inbound_routing',
974
+ when_to_use: 'When listing configured inbound routing destinations (where inbound messages are delivered).',
975
+ when_not_to_use: 'When managing channel defaults (use channel_default_list).',
976
+ alternatives: ['channel_default_list'],
977
+ side_effects: [],
978
+ prerequisites: [],
979
+ example_calls: [
980
+ { description: 'List destinations', params: {} },
981
+ ],
982
+ },
983
+ inbound_destination_get: {
984
+ group: 'inbound_routing',
985
+ when_to_use: 'When retrieving details for a specific inbound routing destination.',
986
+ when_not_to_use: 'When listing destinations (use inbound_destination_list).',
987
+ alternatives: ['inbound_destination_list'],
988
+ side_effects: [],
989
+ prerequisites: ['Need a valid destination ID.'],
990
+ example_calls: [
991
+ { description: 'Get destination', params: { destination_id: '550e8400-e29b-41d4-a716-446655440000' } },
992
+ ],
993
+ },
994
+ inbound_destination_update: {
995
+ group: 'inbound_routing',
996
+ when_to_use: 'When updating an inbound routing destination configuration.',
997
+ when_not_to_use: 'When managing channel defaults (use channel_default_set).',
998
+ alternatives: ['channel_default_set'],
999
+ side_effects: ['Modifies the inbound routing configuration.'],
1000
+ prerequisites: ['Need a valid destination ID.'],
1001
+ example_calls: [
1002
+ { description: 'Update destination', params: { destination_id: '550e8400-e29b-41d4-a716-446655440000', enabled: true } },
1003
+ ],
1004
+ },
1005
+ // ── Channel default tools ─────────────────────────────────────
1006
+ channel_default_list: {
1007
+ group: 'channel_defaults',
1008
+ when_to_use: 'When listing default routing configurations per channel type.',
1009
+ when_not_to_use: 'When managing inbound destinations (use inbound_destination_list).',
1010
+ alternatives: ['inbound_destination_list'],
1011
+ side_effects: [],
1012
+ prerequisites: [],
1013
+ example_calls: [
1014
+ { description: 'List channel defaults', params: {} },
1015
+ ],
1016
+ },
1017
+ channel_default_get: {
1018
+ group: 'channel_defaults',
1019
+ when_to_use: 'When retrieving the default routing config for a specific channel type.',
1020
+ when_not_to_use: 'When listing all channel defaults (use channel_default_list).',
1021
+ alternatives: ['channel_default_list'],
1022
+ side_effects: [],
1023
+ prerequisites: ['Need a valid channel type.'],
1024
+ example_calls: [
1025
+ { description: 'Get SMS channel default', params: { channel: 'sms' } },
1026
+ ],
1027
+ },
1028
+ channel_default_set: {
1029
+ group: 'channel_defaults',
1030
+ when_to_use: 'When setting or updating the default routing config for a channel type.',
1031
+ when_not_to_use: 'When managing individual destinations (use inbound_destination_update).',
1032
+ alternatives: ['inbound_destination_update'],
1033
+ side_effects: ['Updates the channel default routing configuration.'],
1034
+ prerequisites: ['Requires agentadmin access.'],
1035
+ example_calls: [
1036
+ { description: 'Set SMS default', params: { channel: 'sms', destination_id: '550e8400-e29b-41d4-a716-446655440000' } },
1037
+ ],
1038
+ },
1039
+ // ── Namespace tools ───────────────────────────────────────────
1040
+ namespace_list: {
1041
+ group: 'namespaces',
1042
+ when_to_use: 'When listing all namespaces accessible to the current user or agent.',
1043
+ when_not_to_use: 'When creating a namespace (use namespace_create).',
1044
+ alternatives: ['namespace_create'],
1045
+ side_effects: [],
1046
+ prerequisites: [],
1047
+ example_calls: [
1048
+ { description: 'List namespaces', params: {} },
1049
+ ],
1050
+ },
1051
+ namespace_create: {
1052
+ group: 'namespaces',
1053
+ when_to_use: 'When creating a new namespace for data isolation or sharing.',
1054
+ when_not_to_use: 'When the namespace already exists (use namespace_list to check first).',
1055
+ alternatives: [],
1056
+ side_effects: ['Creates a new namespace. The creating user becomes the owner.'],
1057
+ prerequisites: [],
1058
+ example_calls: [
1059
+ { description: 'Create a namespace', params: { name: 'team-projects', display_name: 'Team Projects' } },
1060
+ ],
1061
+ },
1062
+ namespace_grant: {
1063
+ group: 'namespaces',
1064
+ when_to_use: 'When granting a user access to a namespace with a specific role.',
1065
+ when_not_to_use: 'When revoking access (use namespace_revoke).',
1066
+ alternatives: ['namespace_revoke'],
1067
+ side_effects: ['Grants namespace access to a user.'],
1068
+ prerequisites: ['Need namespace name and target user ID. Must be owner or admin of the namespace.'],
1069
+ example_calls: [
1070
+ { description: 'Grant read access', params: { namespace: 'team-projects', user_id: '550e8400-e29b-41d4-a716-446655440000', role: 'reader' } },
1071
+ ],
1072
+ },
1073
+ namespace_members: {
1074
+ group: 'namespaces',
1075
+ when_to_use: 'When listing members of a namespace with their roles.',
1076
+ when_not_to_use: 'When listing namespaces themselves (use namespace_list).',
1077
+ alternatives: ['namespace_list'],
1078
+ side_effects: [],
1079
+ prerequisites: ['Need a valid namespace name.'],
1080
+ example_calls: [
1081
+ { description: 'List namespace members', params: { namespace: 'team-projects' } },
1082
+ ],
1083
+ },
1084
+ namespace_revoke: {
1085
+ group: 'namespaces',
1086
+ when_to_use: 'When revoking a user\'s access to a namespace.',
1087
+ when_not_to_use: 'When granting access (use namespace_grant). Confirm with user before revoking.',
1088
+ alternatives: ['namespace_grant'],
1089
+ side_effects: ['Removes the user\'s namespace access.'],
1090
+ prerequisites: ['Need a valid grant ID. Must be owner or admin of the namespace.'],
1091
+ example_calls: [
1092
+ { description: 'Revoke access', params: { grant_id: '550e8400-e29b-41d4-a716-446655440000' } },
1093
+ ],
1094
+ },
1095
+ // ── Meta tools ────────────────────────────────────────────────
1096
+ tool_guide: {
1097
+ group: 'meta',
1098
+ when_to_use: 'When you need guidance on which tool to use, how to use a specific tool, or want an overview of available tool groups.',
1099
+ when_not_to_use: 'When you already know which tool to use and how to call it.',
1100
+ alternatives: [],
1101
+ side_effects: [],
1102
+ prerequisites: [],
1103
+ example_calls: [
1104
+ { description: 'Get guidance for a specific tool', params: { tool: 'memory_recall' } },
1105
+ { description: 'Get overview of a tool group', params: { group: 'memory' } },
1106
+ { description: 'Find tools for a task', params: { task: 'send a text message' } },
1107
+ { description: 'List all tool groups', params: {} },
1108
+ ],
1109
+ },
1110
+ };
1111
+ /**
1112
+ * Group-level guidance catalog.
1113
+ * Keys are group names that match the `group` field in TOOL_CATALOG entries.
1114
+ */
1115
+ export const GROUP_CATALOG = {
1116
+ memory: {
1117
+ description: 'Long-term memory storage and retrieval using semantic search (pgvector). Store preferences, facts, decisions, and context for future sessions.',
1118
+ tools: ['memory_recall', 'memory_store', 'memory_forget'],
1119
+ workflow_tips: 'Use memory_store proactively when users share preferences or important facts. Use memory_recall at the start of conversations to bootstrap context. Use memory_forget only when explicitly requested.',
1120
+ related_skills: ['context_search'],
1121
+ },
1122
+ projects: {
1123
+ description: 'Project and initiative management. Create and track bodies of work with hierarchical organization.',
1124
+ tools: ['project_list', 'project_get', 'project_create', 'project_search'],
1125
+ workflow_tips: 'Create projects for ongoing initiatives, then create todos within them. Use project_search for keyword lookup, project_list for browsing.',
1126
+ related_skills: ['todo_create', 'context_search'],
1127
+ },
1128
+ todos: {
1129
+ description: 'Task and to-do management. Create, list, search, and complete individual actionable items.',
1130
+ tools: ['todo_list', 'todo_create', 'todo_complete', 'todo_search'],
1131
+ workflow_tips: 'Create todos for actionable items. Associate with projects when relevant. Use not_before for reminders, not_after for deadlines. Mark complete when done.',
1132
+ related_skills: ['project_create', 'context_search'],
1133
+ },
1134
+ contacts: {
1135
+ description: 'Contact and people management. Create, search, update, merge contacts and manage their endpoints and tags.',
1136
+ tools: ['contact_search', 'contact_get', 'contact_create', 'contact_update', 'contact_merge', 'contact_tag_add', 'contact_tag_remove', 'contact_resolve'],
1137
+ workflow_tips: 'Always search before creating to avoid duplicates. Use contact_resolve to find contacts by email/phone. Use tags for categorization. Merge duplicates carefully.',
1138
+ related_skills: ['relationship_set', 'sms_send', 'email_send'],
1139
+ },
1140
+ search: {
1141
+ description: 'Cross-entity unified search across memories, todos, projects, and messages.',
1142
+ tools: ['context_search'],
1143
+ workflow_tips: 'Use context_search when unsure which entity type contains the information. For targeted searches, prefer entity-specific search tools (memory_recall, todo_search, etc.).',
1144
+ related_skills: ['memory_recall', 'todo_search', 'project_search', 'message_search'],
1145
+ },
1146
+ communication: {
1147
+ description: 'Send and search messages across SMS and email channels.',
1148
+ tools: ['sms_send', 'email_send', 'message_search'],
1149
+ workflow_tips: 'Always confirm the recipient and content before sending. Use message_search to find past conversations. Check contact preferences for preferred channel.',
1150
+ related_skills: ['contact_search', 'thread_list'],
1151
+ },
1152
+ threads: {
1153
+ description: 'Conversation thread management for SMS and email message threads.',
1154
+ tools: ['thread_list', 'thread_get'],
1155
+ workflow_tips: 'Use thread_list to browse recent conversations. Use thread_get with a specific thread ID to see full message history.',
1156
+ related_skills: ['message_search', 'contact_get'],
1157
+ },
1158
+ notes: {
1159
+ description: 'Freeform note creation, editing, searching, and deletion.',
1160
+ tools: ['note_create', 'note_get', 'note_update', 'note_delete', 'note_search'],
1161
+ workflow_tips: 'Use notes for longer-form content (meeting notes, documentation). Organize notes into notebooks for better structure. Use note_search for keyword/semantic lookup.',
1162
+ related_skills: ['notebook_create', 'memory_store'],
1163
+ },
1164
+ notebooks: {
1165
+ description: 'Notebook management for organizing related notes.',
1166
+ tools: ['notebook_list', 'notebook_create', 'notebook_get'],
1167
+ workflow_tips: 'Create notebooks to group related notes. List notebooks to see available collections before creating notes.',
1168
+ related_skills: ['note_create', 'note_search'],
1169
+ },
1170
+ relationships: {
1171
+ description: 'Contact relationship management. Define connections between people (family, coworker, friend, etc.).',
1172
+ tools: ['relationship_set', 'relationship_query'],
1173
+ workflow_tips: 'Set relationships between contacts to enable relationship-aware memory recall. Query relationships to understand social connections.',
1174
+ related_skills: ['contact_search', 'memory_recall', 'links_set'],
1175
+ },
1176
+ entity_links: {
1177
+ description: 'Entity linking across work items, contacts, and memories. Create typed connections between any entities.',
1178
+ tools: ['links_set', 'links_query', 'links_remove'],
1179
+ workflow_tips: 'Use entity links to connect related items (e.g., link a todo to a contact). Query links to discover connections. Different from relationships which are specifically between contacts.',
1180
+ related_skills: ['relationship_set', 'contact_get'],
1181
+ },
1182
+ skill_store: {
1183
+ description: 'Reusable skill and workflow storage. Store, search, and manage prompt templates and workflows.',
1184
+ tools: ['skill_store_put', 'skill_store_get', 'skill_store_list', 'skill_store_delete', 'skill_store_search', 'skill_store_collections', 'skill_store_aggregate'],
1185
+ workflow_tips: 'Organize skills into collections. Use semantic search to find relevant skills. Skills differ from memories — they are reusable templates/workflows, not facts.',
1186
+ related_skills: ['prompt_template_create', 'memory_store'],
1187
+ },
1188
+ file_share: {
1189
+ description: 'File sharing via time-limited download links.',
1190
+ tools: ['file_share'],
1191
+ workflow_tips: 'Generate share links when users need to share files. Links expire after the configured time (default 1 hour).',
1192
+ related_skills: [],
1193
+ },
1194
+ terminal_connections: {
1195
+ description: 'SSH/terminal connection and credential management. Save, test, and manage remote server configurations.',
1196
+ tools: ['terminal_connection_list', 'terminal_connection_create', 'terminal_connection_update', 'terminal_connection_delete', 'terminal_connection_test', 'terminal_credential_create', 'terminal_credential_list', 'terminal_credential_delete'],
1197
+ workflow_tips: 'Create connections first, then start sessions on them. Store credentials securely. Test connections before starting sessions.',
1198
+ related_skills: ['terminal_session_start'],
1199
+ },
1200
+ terminal_sessions: {
1201
+ description: 'Interactive terminal session management. Start, manage, and execute commands in remote SSH sessions.',
1202
+ tools: ['terminal_session_start', 'terminal_session_list', 'terminal_session_terminate', 'terminal_session_info', 'terminal_send_command', 'terminal_send_keys', 'terminal_capture_pane'],
1203
+ workflow_tips: 'Start sessions on saved connections. Use send_command for simple commands, send_keys for interactive programs. Capture pane to see current screen state.',
1204
+ related_skills: ['terminal_connection_list', 'terminal_tunnel_create'],
1205
+ },
1206
+ terminal_tunnels: {
1207
+ description: 'SSH port-forwarding tunnel management. Create, list, and close tunnels through active sessions.',
1208
+ tools: ['terminal_tunnel_create', 'terminal_tunnel_list', 'terminal_tunnel_close'],
1209
+ workflow_tips: 'Create tunnels on active sessions to forward ports. List tunnels to see active forwards. Close tunnels when no longer needed.',
1210
+ related_skills: ['terminal_session_start'],
1211
+ },
1212
+ terminal_search: {
1213
+ description: 'Terminal history search and annotation. Search through command history and annotate entries.',
1214
+ tools: ['terminal_search', 'terminal_annotate'],
1215
+ workflow_tips: 'Search through terminal history to find past commands and output. Annotate important entries for future reference.',
1216
+ related_skills: ['terminal_capture_pane'],
1217
+ },
1218
+ dev_sessions: {
1219
+ description: 'Development session tracking. Create, update, and complete coding sessions with associated metadata.',
1220
+ tools: ['dev_session_create', 'dev_session_list', 'dev_session_get', 'dev_session_update', 'dev_session_complete'],
1221
+ workflow_tips: 'Create a dev session when starting work on an issue. Update with progress as you work. Complete when done with a summary.',
1222
+ related_skills: ['todo_create', 'terminal_session_start'],
1223
+ },
1224
+ api_management: {
1225
+ description: 'External API onboarding and management. Parse OpenAPI specs, store credentials, and search API capabilities.',
1226
+ tools: ['api_onboard', 'api_recall', 'api_get', 'api_list', 'api_update', 'api_credential_manage', 'api_refresh', 'api_remove', 'api_restore'],
1227
+ workflow_tips: 'Onboard APIs by providing OpenAPI specs. Use api_recall to search for endpoints and operations. Manage credentials separately from specs.',
1228
+ related_skills: ['memory_recall'],
1229
+ },
1230
+ prompt_templates: {
1231
+ description: 'Prompt template management. Create, retrieve, update, and delete reusable prompt templates.',
1232
+ tools: ['prompt_template_list', 'prompt_template_get', 'prompt_template_create', 'prompt_template_update', 'prompt_template_delete'],
1233
+ workflow_tips: 'Create templates for frequently used prompts. Templates support variable substitution. Use skill_store for more complex reusable workflows.',
1234
+ related_skills: ['skill_store_put'],
1235
+ },
1236
+ inbound_routing: {
1237
+ description: 'Inbound message routing configuration. Manage where inbound SMS and email messages are delivered.',
1238
+ tools: ['inbound_destination_list', 'inbound_destination_get', 'inbound_destination_update'],
1239
+ workflow_tips: 'Configure destinations for inbound messages. Use alongside channel defaults for complete routing setup.',
1240
+ related_skills: ['channel_default_set'],
1241
+ },
1242
+ channel_defaults: {
1243
+ description: 'Default channel routing configuration. Set default routing behavior per communication channel type.',
1244
+ tools: ['channel_default_list', 'channel_default_get', 'channel_default_set'],
1245
+ workflow_tips: 'Set defaults per channel type (SMS, email). These apply when no specific destination rule matches. Requires agentadmin access.',
1246
+ related_skills: ['inbound_destination_update'],
1247
+ },
1248
+ namespaces: {
1249
+ description: 'Namespace management for data isolation and sharing. Create namespaces, grant access, and manage members.',
1250
+ tools: ['namespace_list', 'namespace_create', 'namespace_grant', 'namespace_members', 'namespace_revoke'],
1251
+ workflow_tips: 'Use namespaces to isolate data between users or teams. Grant access with appropriate roles. Most tools accept optional namespace parameters.',
1252
+ related_skills: [],
1253
+ },
1254
+ meta: {
1255
+ description: 'Meta tools for discovering and understanding available tools and their usage.',
1256
+ tools: ['tool_guide'],
1257
+ workflow_tips: 'Use tool_guide when unsure which tool to use. Call with no params for an overview, with a group name for group details, with a tool name for specific guidance, or with a task description for recommendations.',
1258
+ related_skills: [],
1259
+ },
1260
+ };
1261
+ //# sourceMappingURL=catalog.js.map