@hasna/conversations 0.1.20 → 0.1.21

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 (3) hide show
  1. package/bin/index.js +220 -231
  2. package/bin/mcp.js +220 -231
  3. package/package.json +1 -1
package/bin/mcp.js CHANGED
@@ -29777,7 +29777,7 @@ function renameAgent(oldName, newName) {
29777
29777
  // package.json
29778
29778
  var package_default = {
29779
29779
  name: "@hasna/conversations",
29780
- version: "0.1.20",
29780
+ version: "0.1.21",
29781
29781
  description: "Real-time CLI messaging for AI agents",
29782
29782
  type: "module",
29783
29783
  bin: {
@@ -29860,43 +29860,22 @@ var server = new McpServer({
29860
29860
  version: package_default.version
29861
29861
  });
29862
29862
  server.registerTool("send_message", {
29863
- title: "Send Message",
29864
- description: "Send a direct message to another agent.",
29863
+ description: "Send a DM to an agent.",
29865
29864
  inputSchema: {
29866
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
29867
- to: exports_external.string().describe("Recipient agent ID"),
29868
- content: exports_external.string().describe("Message content"),
29869
- session_id: exports_external.string().optional().describe("Session ID (auto-generated if omitted)"),
29870
- priority: exports_external.enum(["low", "normal", "high", "urgent"]).optional().describe("Message priority"),
29871
- working_dir: exports_external.string().optional().describe("Working directory context"),
29872
- repository: exports_external.string().optional().describe("Repository context"),
29873
- branch: exports_external.string().optional().describe("Branch context"),
29874
- metadata: exports_external.string().optional().describe("JSON metadata string"),
29875
- blocking: exports_external.boolean().optional().describe("Blocking message \u2014 recipients must acknowledge before continuing")
29876
- }
29877
- }, async ({ from: fromParam, to, content, session_id, priority, working_dir, repository, branch, metadata, blocking }) => {
29865
+ to: exports_external.string(),
29866
+ content: exports_external.string(),
29867
+ from: exports_external.string().optional(),
29868
+ priority: exports_external.string().optional(),
29869
+ blocking: exports_external.boolean().optional()
29870
+ }
29871
+ }, async (args) => {
29872
+ const { from: fromParam, to, content, priority, blocking } = args;
29878
29873
  const from = resolveIdentity(fromParam);
29879
- let parsedMetadata;
29880
- if (metadata) {
29881
- try {
29882
- parsedMetadata = JSON.parse(metadata);
29883
- } catch {
29884
- return {
29885
- content: [{ type: "text", text: "invalid JSON" }],
29886
- isError: true
29887
- };
29888
- }
29889
- }
29890
29874
  const msg = sendMessage({
29891
29875
  from,
29892
29876
  to,
29893
29877
  content,
29894
- session_id,
29895
29878
  priority,
29896
- working_dir,
29897
- repository,
29898
- branch,
29899
- metadata: parsedMetadata,
29900
29879
  blocking
29901
29880
  });
29902
29881
  return {
@@ -29904,45 +29883,43 @@ server.registerTool("send_message", {
29904
29883
  };
29905
29884
  });
29906
29885
  server.registerTool("read_messages", {
29907
- title: "Read Messages",
29908
- description: "Read messages with filters, newest first.",
29886
+ description: "Read DMs with optional filters.",
29909
29887
  inputSchema: {
29910
- session_id: exports_external.string().optional().describe("Filter by session ID"),
29911
- from: exports_external.string().optional().describe("Filter by sender"),
29912
- to: exports_external.string().optional().describe("Filter by recipient"),
29913
- space: exports_external.string().optional().describe("Filter by space name"),
29914
- since: exports_external.string().optional().describe("ISO timestamp lower bound"),
29915
- limit: exports_external.number().optional().describe("Max messages to return (default 20)"),
29916
- unread_only: exports_external.boolean().optional().describe("Only unread messages")
29917
- }
29918
- }, async (opts) => {
29919
- const messages = readMessages(opts);
29888
+ session_id: exports_external.string().optional(),
29889
+ from: exports_external.string().optional(),
29890
+ to: exports_external.string().optional(),
29891
+ space: exports_external.string().optional(),
29892
+ since: exports_external.string().optional(),
29893
+ limit: exports_external.number().optional(),
29894
+ unread_only: exports_external.boolean().optional()
29895
+ }
29896
+ }, async (args) => {
29897
+ const messages = readMessages(args);
29920
29898
  return {
29921
29899
  content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
29922
29900
  };
29923
29901
  });
29924
29902
  server.registerTool("list_sessions", {
29925
- title: "List Sessions",
29926
- description: "List sessions, optionally filtered by agent.",
29903
+ description: "List all sessions by agent.",
29927
29904
  inputSchema: {
29928
- agent: exports_external.string().optional().describe("Filter sessions involving this agent")
29905
+ agent: exports_external.string().optional()
29929
29906
  }
29930
- }, async ({ agent }) => {
29907
+ }, async (args) => {
29908
+ const { agent } = args;
29931
29909
  const sessions = listSessions(agent);
29932
29910
  return {
29933
29911
  content: [{ type: "text", text: JSON.stringify(sessions, null, 2) }]
29934
29912
  };
29935
29913
  });
29936
29914
  server.registerTool("reply", {
29937
- title: "Reply to Message",
29938
- description: "Reply to a message (same session, original sender).",
29915
+ description: "Reply to a message by ID.",
29939
29916
  inputSchema: {
29940
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
29941
- message_id: exports_external.number().describe("ID of the message to reply to"),
29942
- content: exports_external.string().describe("Reply content"),
29943
- priority: exports_external.enum(["low", "normal", "high", "urgent"]).optional().describe("Message priority")
29917
+ message_id: exports_external.number(),
29918
+ content: exports_external.string(),
29919
+ from: exports_external.string().optional()
29944
29920
  }
29945
- }, async ({ from: fromParam, message_id, content, priority }) => {
29921
+ }, async (args) => {
29922
+ const { from: fromParam, message_id, content } = args;
29946
29923
  const original = getMessageById(message_id);
29947
29924
  if (!original) {
29948
29925
  return {
@@ -29958,7 +29935,6 @@ server.registerTool("reply", {
29958
29935
  to,
29959
29936
  content,
29960
29937
  session_id: original.session_id,
29961
- priority,
29962
29938
  space
29963
29939
  });
29964
29940
  return {
@@ -29966,14 +29942,14 @@ server.registerTool("reply", {
29966
29942
  };
29967
29943
  });
29968
29944
  server.registerTool("mark_read", {
29969
- title: "Mark Read",
29970
- description: "Mark messages as read. Provide IDs or set 'all' to true.",
29945
+ description: "Mark messages read by IDs or all.",
29971
29946
  inputSchema: {
29972
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
29973
- ids: exports_external.array(exports_external.number()).optional().describe("Message IDs to mark as read"),
29974
- all: exports_external.boolean().optional().describe("Mark all unread messages as read")
29947
+ from: exports_external.string().optional(),
29948
+ ids: exports_external.array(exports_external.number()).optional(),
29949
+ all: exports_external.boolean().optional()
29975
29950
  }
29976
- }, async ({ from: fromParam, ids, all }) => {
29951
+ }, async (args) => {
29952
+ const { from: fromParam, ids, all } = args;
29977
29953
  const agent = resolveIdentity(fromParam);
29978
29954
  let count;
29979
29955
  if (all) {
@@ -29991,49 +29967,49 @@ server.registerTool("mark_read", {
29991
29967
  };
29992
29968
  });
29993
29969
  server.registerTool("search_messages", {
29994
- title: "Search Messages",
29995
- description: "Full-text search across message content, newest first.",
29970
+ description: "Full-text search across messages.",
29996
29971
  inputSchema: {
29997
- query: exports_external.string().describe("Search query"),
29998
- space: exports_external.string().optional().describe("Filter by space"),
29999
- from: exports_external.string().optional().describe("Filter by sender"),
30000
- to: exports_external.string().optional().describe("Filter by recipient"),
30001
- limit: exports_external.number().optional().describe("Max results (default 20)")
30002
- }
30003
- }, async ({ query, space, from, to, limit }) => {
29972
+ query: exports_external.string(),
29973
+ space: exports_external.string().optional(),
29974
+ from: exports_external.string().optional(),
29975
+ to: exports_external.string().optional(),
29976
+ limit: exports_external.number().optional()
29977
+ }
29978
+ }, async (args) => {
29979
+ const { query, space, from, to, limit } = args;
30004
29980
  const messages = searchMessages({ query, space, from, to, limit });
30005
29981
  return {
30006
29982
  content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
30007
29983
  };
30008
29984
  });
30009
29985
  server.registerTool("export_messages", {
30010
- title: "Export Messages",
30011
- description: "Export messages as JSON or CSV with optional filters.",
29986
+ description: "Export messages as JSON or CSV.",
30012
29987
  inputSchema: {
30013
- space: exports_external.string().optional().describe("Filter by space"),
30014
- session_id: exports_external.string().optional().describe("Filter by session ID"),
30015
- from: exports_external.string().optional().describe("Filter by sender"),
30016
- since: exports_external.string().optional().describe("ISO date lower bound"),
30017
- until: exports_external.string().optional().describe("ISO date upper bound"),
30018
- format: exports_external.enum(["json", "csv"]).optional().describe("Output format (default: json)")
30019
- }
30020
- }, async ({ space, session_id, from, since, until, format }) => {
29988
+ space: exports_external.string().optional(),
29989
+ session_id: exports_external.string().optional(),
29990
+ from: exports_external.string().optional(),
29991
+ since: exports_external.string().optional(),
29992
+ until: exports_external.string().optional(),
29993
+ format: exports_external.string().optional()
29994
+ }
29995
+ }, async (args) => {
29996
+ const { space, session_id, from, since, until, format } = args;
30021
29997
  const result = exportMessages({ space, session_id, from, since, until, format });
30022
29998
  return {
30023
29999
  content: [{ type: "text", text: result }]
30024
30000
  };
30025
30001
  });
30026
30002
  server.registerTool("create_space", {
30027
- title: "Create Space",
30028
- description: "Create a space. Auto-joined. Supports nesting and projects.",
30003
+ description: "Create a space and auto-join.",
30029
30004
  inputSchema: {
30030
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30031
- name: exports_external.string().describe("Space name"),
30032
- description: exports_external.string().optional().describe("Space description"),
30033
- parent_id: exports_external.string().optional().describe("Parent space name (max 3 levels deep)"),
30034
- project_id: exports_external.string().optional().describe("Project ID to associate with")
30035
- }
30036
- }, async ({ from: fromParam, name, description, parent_id, project_id }) => {
30005
+ name: exports_external.string(),
30006
+ from: exports_external.string().optional(),
30007
+ description: exports_external.string().optional(),
30008
+ parent_id: exports_external.string().optional(),
30009
+ project_id: exports_external.string().optional()
30010
+ }
30011
+ }, async (args) => {
30012
+ const { from: fromParam, name, description, parent_id, project_id } = args;
30037
30013
  const agent = resolveIdentity(fromParam);
30038
30014
  try {
30039
30015
  const sp = createSpace(name, agent, { description, parent_id, project_id });
@@ -30054,14 +30030,14 @@ server.registerTool("create_space", {
30054
30030
  }
30055
30031
  });
30056
30032
  server.registerTool("list_spaces", {
30057
- title: "List Spaces",
30058
- description: "List spaces with member/message counts.",
30033
+ description: "List spaces with counts.",
30059
30034
  inputSchema: {
30060
- project_id: exports_external.string().optional().describe("Filter by project ID"),
30061
- parent_id: exports_external.string().optional().describe("Filter by parent space. Use 'null' for top-level only."),
30062
- include_archived: exports_external.boolean().optional().describe("Include archived spaces")
30035
+ project_id: exports_external.string().optional(),
30036
+ parent_id: exports_external.string().optional(),
30037
+ include_archived: exports_external.boolean().optional()
30063
30038
  }
30064
- }, async ({ project_id, parent_id, include_archived }) => {
30039
+ }, async (args) => {
30040
+ const { project_id, parent_id, include_archived } = args;
30065
30041
  const opts = {};
30066
30042
  if (project_id)
30067
30043
  opts.project_id = project_id;
@@ -30078,16 +30054,16 @@ server.registerTool("list_spaces", {
30078
30054
  };
30079
30055
  });
30080
30056
  server.registerTool("send_to_space", {
30081
- title: "Send to Space",
30082
- description: "Send a message to a space. All members can see it.",
30057
+ description: "Post a message to a space.",
30083
30058
  inputSchema: {
30084
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30085
- space: exports_external.string().describe("Space name"),
30086
- content: exports_external.string().describe("Message content"),
30087
- priority: exports_external.enum(["low", "normal", "high", "urgent"]).optional().describe("Message priority"),
30088
- blocking: exports_external.boolean().optional().describe("Blocking message \u2014 all space members must acknowledge")
30089
- }
30090
- }, async ({ from: fromParam, space, content, priority, blocking }) => {
30059
+ space: exports_external.string(),
30060
+ content: exports_external.string(),
30061
+ from: exports_external.string().optional(),
30062
+ priority: exports_external.string().optional(),
30063
+ blocking: exports_external.boolean().optional()
30064
+ }
30065
+ }, async (args) => {
30066
+ const { from: fromParam, space, content, priority, blocking } = args;
30091
30067
  const from = resolveIdentity(fromParam);
30092
30068
  const sp = getSpace(space);
30093
30069
  if (!sp) {
@@ -30110,27 +30086,27 @@ server.registerTool("send_to_space", {
30110
30086
  };
30111
30087
  });
30112
30088
  server.registerTool("read_space", {
30113
- title: "Read Space",
30114
30089
  description: "Read messages from a space.",
30115
30090
  inputSchema: {
30116
- space: exports_external.string().describe("Space name"),
30117
- since: exports_external.string().optional().describe("ISO timestamp lower bound"),
30118
- limit: exports_external.number().optional().describe("Max messages to return")
30091
+ space: exports_external.string(),
30092
+ since: exports_external.string().optional(),
30093
+ limit: exports_external.number().optional()
30119
30094
  }
30120
- }, async ({ space, since, limit }) => {
30095
+ }, async (args) => {
30096
+ const { space, since, limit } = args;
30121
30097
  const messages = readMessages({ space, since, limit });
30122
30098
  return {
30123
30099
  content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
30124
30100
  };
30125
30101
  });
30126
30102
  server.registerTool("join_space", {
30127
- title: "Join Space",
30128
- description: "Join a space to receive messages.",
30103
+ description: "Join a space as a member.",
30129
30104
  inputSchema: {
30130
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30131
- space: exports_external.string().describe("Space name to join")
30105
+ space: exports_external.string(),
30106
+ from: exports_external.string().optional()
30132
30107
  }
30133
- }, async ({ from: fromParam, space }) => {
30108
+ }, async (args) => {
30109
+ const { from: fromParam, space } = args;
30134
30110
  const agent = resolveIdentity(fromParam);
30135
30111
  const ok = joinSpace(space, agent);
30136
30112
  if (!ok) {
@@ -30144,13 +30120,13 @@ server.registerTool("join_space", {
30144
30120
  };
30145
30121
  });
30146
30122
  server.registerTool("leave_space", {
30147
- title: "Leave Space",
30148
30123
  description: "Leave a space.",
30149
30124
  inputSchema: {
30150
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30151
- space: exports_external.string().describe("Space name to leave")
30125
+ space: exports_external.string(),
30126
+ from: exports_external.string().optional()
30152
30127
  }
30153
- }, async ({ from: fromParam, space }) => {
30128
+ }, async (args) => {
30129
+ const { from: fromParam, space } = args;
30154
30130
  const agent = resolveIdentity(fromParam);
30155
30131
  const left = leaveSpace(space, agent);
30156
30132
  return {
@@ -30158,15 +30134,15 @@ server.registerTool("leave_space", {
30158
30134
  };
30159
30135
  });
30160
30136
  server.registerTool("update_space", {
30161
- title: "Update Space",
30162
- description: "Update a space's description, parent, or project.",
30137
+ description: "Update space description or parent.",
30163
30138
  inputSchema: {
30164
- name: exports_external.string().describe("Space name"),
30165
- description: exports_external.string().optional().describe("New description"),
30166
- parent_id: exports_external.string().optional().describe("New parent space (use 'null' to remove)"),
30167
- project_id: exports_external.string().optional().describe("New project ID (use 'null' to remove)")
30139
+ name: exports_external.string(),
30140
+ description: exports_external.string().optional(),
30141
+ parent_id: exports_external.string().optional(),
30142
+ project_id: exports_external.string().optional()
30168
30143
  }
30169
- }, async ({ name, description, parent_id, project_id }) => {
30144
+ }, async (args) => {
30145
+ const { name, description, parent_id, project_id } = args;
30170
30146
  const updates = {};
30171
30147
  if (description !== undefined)
30172
30148
  updates.description = description;
@@ -30187,10 +30163,9 @@ server.registerTool("update_space", {
30187
30163
  }
30188
30164
  });
30189
30165
  server.registerTool("archive_space", {
30190
- title: "Archive Space",
30191
- description: "Archive a space. Hidden from list by default.",
30166
+ description: "Archive a space.",
30192
30167
  inputSchema: {
30193
- name: exports_external.string().describe("Space name to archive")
30168
+ name: exports_external.string()
30194
30169
  }
30195
30170
  }, async ({ name }) => {
30196
30171
  try {
@@ -30206,10 +30181,9 @@ server.registerTool("archive_space", {
30206
30181
  }
30207
30182
  });
30208
30183
  server.registerTool("unarchive_space", {
30209
- title: "Unarchive Space",
30210
- description: "Unarchive a previously archived space.",
30184
+ description: "Unarchive a space.",
30211
30185
  inputSchema: {
30212
- name: exports_external.string().describe("Space name to unarchive")
30186
+ name: exports_external.string()
30213
30187
  }
30214
30188
  }, async ({ name }) => {
30215
30189
  try {
@@ -30225,19 +30199,19 @@ server.registerTool("unarchive_space", {
30225
30199
  }
30226
30200
  });
30227
30201
  server.registerTool("create_project", {
30228
- title: "Create Project",
30229
- description: "Create a project for spaces and agent collaboration.",
30202
+ description: "Create a project for agent collaboration.",
30230
30203
  inputSchema: {
30231
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30232
- name: exports_external.string().describe("Project name (unique)"),
30233
- description: exports_external.string().optional().describe("Project description"),
30234
- path: exports_external.string().optional().describe("Absolute path on disk"),
30235
- repository: exports_external.string().optional().describe("Repository URL"),
30236
- tags: exports_external.string().optional().describe("JSON array of tags"),
30237
- metadata: exports_external.string().optional().describe("JSON metadata"),
30238
- settings: exports_external.string().optional().describe("JSON settings")
30239
- }
30240
- }, async ({ from: fromParam, name, description, path, repository, tags, metadata, settings }) => {
30204
+ name: exports_external.string(),
30205
+ from: exports_external.string().optional(),
30206
+ description: exports_external.string().optional(),
30207
+ path: exports_external.string().optional(),
30208
+ repository: exports_external.string().optional(),
30209
+ tags: exports_external.string().optional(),
30210
+ metadata: exports_external.string().optional(),
30211
+ settings: exports_external.string().optional()
30212
+ }
30213
+ }, async (args) => {
30214
+ const { from: fromParam, name, description, path, repository, tags, metadata, settings } = args;
30241
30215
  const agent = resolveIdentity(fromParam);
30242
30216
  let parsedTags;
30243
30217
  if (tags) {
@@ -30300,22 +30274,21 @@ server.registerTool("create_project", {
30300
30274
  }
30301
30275
  });
30302
30276
  server.registerTool("list_projects", {
30303
- title: "List Projects",
30304
- description: "List all registered projects.",
30277
+ description: "List all projects.",
30305
30278
  inputSchema: {
30306
- status: exports_external.enum(["active", "archived"]).optional().describe("Filter by status")
30279
+ status: exports_external.string().optional()
30307
30280
  }
30308
- }, async ({ status }) => {
30281
+ }, async (args) => {
30282
+ const { status } = args;
30309
30283
  const projects = listProjects(status ? { status } : undefined);
30310
30284
  return {
30311
30285
  content: [{ type: "text", text: JSON.stringify(projects, null, 2) }]
30312
30286
  };
30313
30287
  });
30314
30288
  server.registerTool("get_project", {
30315
- title: "Get Project",
30316
- description: "Get full details of a project by ID or name.",
30289
+ description: "Get a project by ID or name.",
30317
30290
  inputSchema: {
30318
- id: exports_external.string().describe("Project ID (UUID) or name")
30291
+ id: exports_external.string()
30319
30292
  }
30320
30293
  }, async ({ id }) => {
30321
30294
  let project = getProject(id);
@@ -30333,20 +30306,20 @@ server.registerTool("get_project", {
30333
30306
  };
30334
30307
  });
30335
30308
  server.registerTool("update_project", {
30336
- title: "Update Project",
30337
- description: "Update a project's fields.",
30309
+ description: "Update project fields by ID.",
30338
30310
  inputSchema: {
30339
- id: exports_external.string().describe("Project ID (UUID)"),
30340
- name: exports_external.string().optional().describe("New name"),
30341
- description: exports_external.string().optional().describe("New description"),
30342
- path: exports_external.string().optional().describe("New path"),
30343
- status: exports_external.enum(["active", "archived"]).optional().describe("New status"),
30344
- repository: exports_external.string().optional().describe("New repository URL"),
30345
- tags: exports_external.string().optional().describe("JSON array of tags"),
30346
- metadata: exports_external.string().optional().describe("JSON metadata"),
30347
- settings: exports_external.string().optional().describe("JSON settings")
30348
- }
30349
- }, async ({ id, name, description, path, status, repository, tags, metadata, settings }) => {
30311
+ id: exports_external.string(),
30312
+ name: exports_external.string().optional(),
30313
+ description: exports_external.string().optional(),
30314
+ path: exports_external.string().optional(),
30315
+ status: exports_external.string().optional(),
30316
+ repository: exports_external.string().optional(),
30317
+ tags: exports_external.string().optional(),
30318
+ metadata: exports_external.string().optional(),
30319
+ settings: exports_external.string().optional()
30320
+ }
30321
+ }, async (args) => {
30322
+ const { id, name, description, path, status, repository, tags, metadata, settings } = args;
30350
30323
  const updates = {};
30351
30324
  if (name !== undefined)
30352
30325
  updates.name = name;
@@ -30401,10 +30374,9 @@ server.registerTool("update_project", {
30401
30374
  }
30402
30375
  });
30403
30376
  server.registerTool("delete_project", {
30404
- title: "Delete Project",
30405
- description: "Delete a project permanently. Fails if spaces reference it.",
30377
+ description: "Delete a project permanently.",
30406
30378
  inputSchema: {
30407
- id: exports_external.string().describe("Project ID (UUID)")
30379
+ id: exports_external.string()
30408
30380
  }
30409
30381
  }, async ({ id }) => {
30410
30382
  try {
@@ -30426,13 +30398,13 @@ server.registerTool("delete_project", {
30426
30398
  }
30427
30399
  });
30428
30400
  server.registerTool("delete_message", {
30429
- title: "Delete Message",
30430
- description: "Delete a message. Sender only.",
30401
+ description: "Delete a message (sender only).",
30431
30402
  inputSchema: {
30432
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30433
- id: exports_external.number().describe("Message ID to delete")
30403
+ id: exports_external.number(),
30404
+ from: exports_external.string().optional()
30434
30405
  }
30435
- }, async ({ from: fromParam, id }) => {
30406
+ }, async (args) => {
30407
+ const { from: fromParam, id } = args;
30436
30408
  const agent = resolveIdentity(fromParam);
30437
30409
  const deleted = deleteMessage(id, agent);
30438
30410
  if (!deleted) {
@@ -30446,14 +30418,14 @@ server.registerTool("delete_message", {
30446
30418
  };
30447
30419
  });
30448
30420
  server.registerTool("edit_message", {
30449
- title: "Edit Message",
30450
- description: "Edit a message's content. Sender only.",
30421
+ description: "Edit message content (sender only).",
30451
30422
  inputSchema: {
30452
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30453
- id: exports_external.number().describe("Message ID to edit"),
30454
- content: exports_external.string().describe("New message content")
30423
+ id: exports_external.number(),
30424
+ content: exports_external.string(),
30425
+ from: exports_external.string().optional()
30455
30426
  }
30456
- }, async ({ from: fromParam, id, content }) => {
30427
+ }, async (args) => {
30428
+ const { from: fromParam, id, content } = args;
30457
30429
  const agent = resolveIdentity(fromParam);
30458
30430
  const msg = editMessage(id, agent, content);
30459
30431
  if (!msg) {
@@ -30467,10 +30439,9 @@ server.registerTool("edit_message", {
30467
30439
  };
30468
30440
  });
30469
30441
  server.registerTool("pin_message", {
30470
- title: "Pin Message",
30471
- description: "Pin a message in a space or session.",
30442
+ description: "Pin a message.",
30472
30443
  inputSchema: {
30473
- id: exports_external.number().describe("Message ID to pin")
30444
+ id: exports_external.number()
30474
30445
  }
30475
30446
  }, async ({ id }) => {
30476
30447
  const msg = pinMessage(id);
@@ -30485,10 +30456,9 @@ server.registerTool("pin_message", {
30485
30456
  };
30486
30457
  });
30487
30458
  server.registerTool("unpin_message", {
30488
- title: "Unpin Message",
30489
- description: "Unpin a previously pinned message.",
30459
+ description: "Unpin a message.",
30490
30460
  inputSchema: {
30491
- id: exports_external.number().describe("Message ID to unpin")
30461
+ id: exports_external.number()
30492
30462
  }
30493
30463
  }, async ({ id }) => {
30494
30464
  const msg = unpinMessage(id);
@@ -30503,27 +30473,27 @@ server.registerTool("unpin_message", {
30503
30473
  };
30504
30474
  });
30505
30475
  server.registerTool("get_pinned_messages", {
30506
- title: "Get Pinned Messages",
30507
- description: "Get pinned messages, filtered by space or session.",
30476
+ description: "Get pinned messages by space or session.",
30508
30477
  inputSchema: {
30509
- space: exports_external.string().optional().describe("Filter by space"),
30510
- session_id: exports_external.string().optional().describe("Filter by session ID"),
30511
- limit: exports_external.number().optional().describe("Max messages to return")
30478
+ space: exports_external.string().optional(),
30479
+ session_id: exports_external.string().optional(),
30480
+ limit: exports_external.number().optional()
30512
30481
  }
30513
- }, async ({ space, session_id, limit }) => {
30482
+ }, async (args) => {
30483
+ const { space, session_id, limit } = args;
30514
30484
  const messages = getPinnedMessages({ space, session_id, limit });
30515
30485
  return {
30516
30486
  content: [{ type: "text", text: JSON.stringify(messages, null, 2) }]
30517
30487
  };
30518
30488
  });
30519
30489
  server.registerTool("heartbeat", {
30520
- title: "Heartbeat",
30521
- description: "Send heartbeat. Optionally set agent status.",
30490
+ description: "Send presence heartbeat.",
30522
30491
  inputSchema: {
30523
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30524
- status: exports_external.string().optional().describe("Agent status (e.g. 'online', 'busy', 'idle'). Defaults to 'online'.")
30492
+ from: exports_external.string().optional(),
30493
+ status: exports_external.string().optional()
30525
30494
  }
30526
- }, async ({ from: fromParam, status }) => {
30495
+ }, async (args) => {
30496
+ const { from: fromParam, status } = args;
30527
30497
  const agent = resolveIdentity(fromParam);
30528
30498
  heartbeat(agent, status);
30529
30499
  return {
@@ -30531,24 +30501,24 @@ server.registerTool("heartbeat", {
30531
30501
  };
30532
30502
  });
30533
30503
  server.registerTool("list_agents", {
30534
- title: "List Agents",
30535
30504
  description: "List agents with presence status.",
30536
30505
  inputSchema: {
30537
- online_only: exports_external.boolean().optional().describe("Only return agents online within last 60s")
30506
+ online_only: exports_external.boolean().optional()
30538
30507
  }
30539
- }, async ({ online_only }) => {
30508
+ }, async (args) => {
30509
+ const { online_only } = args;
30540
30510
  const agents = listAgents({ online_only });
30541
30511
  return {
30542
30512
  content: [{ type: "text", text: JSON.stringify(agents, null, 2) }]
30543
30513
  };
30544
30514
  });
30545
30515
  server.registerTool("get_blockers", {
30546
- title: "Get Blockers",
30547
- description: "Check for unread blocking messages. Must acknowledge.",
30516
+ description: "Check for unread blocking messages.",
30548
30517
  inputSchema: {
30549
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var.")
30518
+ from: exports_external.string().optional()
30550
30519
  }
30551
- }, async ({ from: fromParam }) => {
30520
+ }, async (args) => {
30521
+ const { from: fromParam } = args;
30552
30522
  const agent = resolveIdentity(fromParam);
30553
30523
  const blockers = getUnreadBlockers(agent);
30554
30524
  return {
@@ -30556,13 +30526,13 @@ server.registerTool("get_blockers", {
30556
30526
  };
30557
30527
  });
30558
30528
  server.registerTool("remove_agent", {
30559
- title: "Remove Agent",
30560
- description: "Remove an agent from the presence list.",
30529
+ description: "Remove an agent from presence.",
30561
30530
  inputSchema: {
30562
- from: exports_external.string().optional().describe("Your agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30563
- agent: exports_external.string().optional().describe("Agent to remove (defaults to yourself)")
30531
+ from: exports_external.string().optional(),
30532
+ agent: exports_external.string().optional()
30564
30533
  }
30565
- }, async ({ from: fromParam, agent: targetAgent }) => {
30534
+ }, async (args) => {
30535
+ const { from: fromParam, agent: targetAgent } = args;
30566
30536
  const self = resolveIdentity(fromParam);
30567
30537
  const agent = targetAgent?.trim() || self;
30568
30538
  const removed = removePresence(agent);
@@ -30577,13 +30547,13 @@ server.registerTool("remove_agent", {
30577
30547
  };
30578
30548
  });
30579
30549
  server.registerTool("rename_agent", {
30580
- title: "Rename Agent",
30581
- description: "Rename an agent in the presence list.",
30550
+ description: "Rename your agent in presence.",
30582
30551
  inputSchema: {
30583
- from: exports_external.string().optional().describe("Your current agent ID. Falls back to CONVERSATIONS_AGENT_ID env var."),
30584
- new_name: exports_external.string().describe("The new name for the agent")
30552
+ new_name: exports_external.string(),
30553
+ from: exports_external.string().optional()
30585
30554
  }
30586
- }, async ({ from: fromParam, new_name }) => {
30555
+ }, async (args) => {
30556
+ const { from: fromParam, new_name } = args;
30587
30557
  const oldName = resolveIdentity(fromParam);
30588
30558
  const newName = new_name.trim();
30589
30559
  if (!newName) {
@@ -30611,12 +30581,12 @@ server.registerTool("rename_agent", {
30611
30581
  }
30612
30582
  });
30613
30583
  server.registerTool("search_tools", {
30614
- title: "Search Tools",
30615
- description: "List tool names, optionally filtered by keyword.",
30584
+ description: "List tool names by keyword.",
30616
30585
  inputSchema: {
30617
- query: exports_external.string().optional().describe("Keyword filter")
30586
+ query: exports_external.string().optional()
30618
30587
  }
30619
- }, async ({ query }) => {
30588
+ }, async (args) => {
30589
+ const { query } = args;
30620
30590
  const all = [
30621
30591
  "send_message",
30622
30592
  "read_messages",
@@ -30657,26 +30627,45 @@ server.registerTool("search_tools", {
30657
30627
  return { content: [{ type: "text", text: matches.join(", ") }] };
30658
30628
  });
30659
30629
  server.registerTool("describe_tools", {
30660
- title: "Describe Tools",
30661
- description: "Get descriptions for specific tools by name.",
30630
+ description: "Get descriptions for tools by name.",
30662
30631
  inputSchema: {
30663
- names: exports_external.array(exports_external.string()).describe("Tool names from search_tools")
30632
+ names: exports_external.array(exports_external.string())
30664
30633
  }
30665
30634
  }, async ({ names }) => {
30666
30635
  const descriptions = {
30667
- send_message: "Send DM to agent. Params: to, content, from?, priority?",
30668
- read_messages: "Read messages. Params: space?, from?, to?, unread_only?, limit?",
30669
- list_sessions: "List sessions. Params: agent?",
30670
- reply: "Reply to message. Params: id, content, from?",
30671
- send_to_space: "Send message to space. Params: space, content, from?",
30672
- read_space: "Read space messages. Params: space, limit?, since?",
30673
- join_space: "Join a space. Params: space, from?",
30674
- create_space: "Create space. Params: name, description?, parent_id?",
30675
- list_spaces: "List spaces with counts. No required params.",
30676
- heartbeat: "Send heartbeat. Params: from?, status?",
30677
- list_agents: "List agents with presence. No required params.",
30678
- get_blockers: "Check for blocking messages. Params: name?",
30679
- search_messages: "Search messages. Params: query, space?, limit?"
30636
+ send_message: "Send DM to agent. Required: to, content. Optional: from?, priority?(low|normal|high|urgent), blocking?",
30637
+ read_messages: "Read messages with filters. Optional: session_id?, from?, to?, space?, since?(ISO), limit?, unread_only?",
30638
+ list_sessions: "List all DM sessions. Optional: agent?(filter by participant)",
30639
+ reply: "Reply to a message in same session. Required: message_id, content. Optional: from?",
30640
+ mark_read: "Mark messages as read. Optional: from?, ids?(array), all?(bool \u2014 mark all unread)",
30641
+ search_messages: "Full-text search messages. Required: query. Optional: space?, from?, to?, limit?",
30642
+ export_messages: "Export messages as JSON or CSV. Optional: space?, session_id?, from?, since?, until?, format?(json|csv)",
30643
+ create_space: "Create space and auto-join. Required: name. Optional: from?, description?, parent_id?(max 3 levels), project_id?",
30644
+ list_spaces: "List spaces with member/message counts. Optional: project_id?, parent_id?(use 'null' for top-level), include_archived?",
30645
+ send_to_space: "Post message to space. Required: space, content. Optional: from?, priority?(low|normal|high|urgent), blocking?",
30646
+ read_space: "Read messages in a space. Required: space. Optional: since?(ISO), limit?",
30647
+ join_space: "Join a space. Required: space. Optional: from?",
30648
+ leave_space: "Leave a space. Required: space. Optional: from?",
30649
+ update_space: "Update space fields. Required: name. Optional: description?, parent_id?(use 'null' to remove), project_id?(use 'null' to remove)",
30650
+ archive_space: "Archive a space (hidden from default list). Required: name",
30651
+ unarchive_space: "Restore archived space. Required: name",
30652
+ create_project: "Create a project. Required: name. Optional: from?, description?, path?, repository?, tags?(JSON array), metadata?(JSON), settings?(JSON)",
30653
+ list_projects: "List projects. Optional: status?(active|archived)",
30654
+ get_project: "Get project by UUID or name. Required: id",
30655
+ update_project: "Update project fields. Required: id. Optional: name?, description?, path?, status?(active|archived), repository?, tags?(JSON), metadata?(JSON), settings?(JSON)",
30656
+ delete_project: "Delete project (fails if spaces reference it). Required: id",
30657
+ delete_message: "Delete a message (sender only). Required: id. Optional: from?",
30658
+ edit_message: "Edit message content (sender only). Required: id, content. Optional: from?",
30659
+ pin_message: "Pin a message. Required: id",
30660
+ unpin_message: "Unpin a message. Required: id",
30661
+ get_pinned_messages: "Get pinned messages. Optional: space?, session_id?, limit?",
30662
+ heartbeat: "Register/refresh agent presence. Optional: from?, status?(online|busy|idle, default: online)",
30663
+ list_agents: "List agents with presence timestamps. Optional: online_only?(only agents seen in last 60s)",
30664
+ get_blockers: "Get unread blocking messages for agent. Optional: from?",
30665
+ remove_agent: "Remove agent from presence list. Optional: from?, agent?(defaults to self)",
30666
+ rename_agent: "Rename agent in presence list. Required: new_name. Optional: from?",
30667
+ search_tools: "Search tool names by keyword. Optional: query?",
30668
+ describe_tools: "Get full descriptions for tools. Required: names(array of tool names)"
30680
30669
  };
30681
30670
  const result = names.map((n) => `${n}: ${descriptions[n] || "See tool schema"}`).join(`
30682
30671
  `);