kitty-hive 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +121 -126
  2. package/README.zh.md +153 -105
  3. package/channel.ts +194 -431
  4. package/dist/auth.d.ts +10 -6
  5. package/dist/auth.js +32 -17
  6. package/dist/auth.js.map +1 -1
  7. package/dist/db.d.ts +47 -17
  8. package/dist/db.js +268 -123
  9. package/dist/db.js.map +1 -1
  10. package/dist/federation-heartbeat.d.ts +7 -0
  11. package/dist/federation-heartbeat.js +45 -0
  12. package/dist/federation-heartbeat.js.map +1 -0
  13. package/dist/federation-http.d.ts +7 -0
  14. package/dist/federation-http.js +287 -0
  15. package/dist/federation-http.js.map +1 -0
  16. package/dist/index.js +336 -114
  17. package/dist/index.js.map +1 -1
  18. package/dist/log.d.ts +3 -0
  19. package/dist/log.js +10 -0
  20. package/dist/log.js.map +1 -0
  21. package/dist/mcp/agent-tools.d.ts +2 -0
  22. package/dist/mcp/agent-tools.js +66 -0
  23. package/dist/mcp/agent-tools.js.map +1 -0
  24. package/dist/mcp/dm-tools.d.ts +2 -0
  25. package/dist/mcp/dm-tools.js +54 -0
  26. package/dist/mcp/dm-tools.js.map +1 -0
  27. package/dist/mcp/federation-tools.d.ts +2 -0
  28. package/dist/mcp/federation-tools.js +44 -0
  29. package/dist/mcp/federation-tools.js.map +1 -0
  30. package/dist/mcp/server.d.ts +2 -0
  31. package/dist/mcp/server.js +62 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/mcp/task-tools.d.ts +2 -0
  34. package/dist/mcp/task-tools.js +128 -0
  35. package/dist/mcp/task-tools.js.map +1 -0
  36. package/dist/mcp/team-tools.d.ts +2 -0
  37. package/dist/mcp/team-tools.js +95 -0
  38. package/dist/mcp/team-tools.js.map +1 -0
  39. package/dist/models.d.ts +28 -10
  40. package/dist/models.js +1 -3
  41. package/dist/models.js.map +1 -1
  42. package/dist/server.d.ts +2 -3
  43. package/dist/server.js +56 -761
  44. package/dist/server.js.map +1 -1
  45. package/dist/sessions.d.ts +15 -0
  46. package/dist/sessions.js +107 -0
  47. package/dist/sessions.js.map +1 -0
  48. package/dist/tools/dm.d.ts +3 -2
  49. package/dist/tools/dm.js +35 -32
  50. package/dist/tools/dm.js.map +1 -1
  51. package/dist/tools/start.d.ts +3 -3
  52. package/dist/tools/start.js +18 -15
  53. package/dist/tools/start.js.map +1 -1
  54. package/dist/tools/task.d.ts +7 -2
  55. package/dist/tools/task.js +113 -15
  56. package/dist/tools/task.js.map +1 -1
  57. package/dist/tools/team.d.ts +62 -13
  58. package/dist/tools/team.js +102 -30
  59. package/dist/tools/team.js.map +1 -1
  60. package/package.json +4 -3
  61. package/dist/tools/room.d.ts +0 -39
  62. package/dist/tools/room.js +0 -35
  63. package/dist/tools/room.js.map +0 -1
package/dist/auth.d.ts CHANGED
@@ -1,7 +1,11 @@
1
+ import { z } from 'zod';
1
2
  import type { Agent } from './models.js';
2
- /**
3
- * Extract agent from Bearer token.
4
- * Returns the agent if valid, null otherwise.
5
- * Also updates last_seen timestamp.
6
- */
7
- export declare function authenticateToken(authHeader: string | undefined): Agent | null;
3
+ export declare const asParam: z.ZodOptional<z.ZodString>;
4
+ export declare function resolveAgent(extra: any, asValue?: string): Agent | null;
5
+ export declare function authError(): {
6
+ content: {
7
+ type: "text";
8
+ text: string;
9
+ }[];
10
+ isError: boolean;
11
+ };
package/dist/auth.js CHANGED
@@ -1,19 +1,34 @@
1
- import { getAgentByToken, touchAgent } from './db.js';
2
- /**
3
- * Extract agent from Bearer token.
4
- * Returns the agent if valid, null otherwise.
5
- * Also updates last_seen timestamp.
6
- */
7
- export function authenticateToken(authHeader) {
8
- if (!authHeader)
9
- return null;
10
- const match = authHeader.match(/^Bearer\s+(\S+)$/i);
11
- if (!match)
12
- return null;
13
- const agent = getAgentByToken(match[1]);
14
- if (!agent)
15
- return null;
16
- touchAgent(agent.id);
17
- return agent;
1
+ import { z } from 'zod';
2
+ import { getAgentById, touchAgent } from './db.js';
3
+ import { sessionAgents } from './sessions.js';
4
+ export const asParam = z.string().optional().describe('Your agent id (from hive.start). Optional — session binding takes precedence.');
5
+ export function resolveAgent(extra, asValue) {
6
+ // 1) Session binding (preferred)
7
+ const sessionId = extra?.sessionId;
8
+ if (sessionId) {
9
+ const agentId = sessionAgents.get(sessionId);
10
+ if (agentId) {
11
+ const agent = getAgentById(agentId);
12
+ if (agent) {
13
+ touchAgent(agent.id);
14
+ return agent;
15
+ }
16
+ }
17
+ }
18
+ // 2) `as` param fallback (id only — names not unique)
19
+ if (asValue) {
20
+ const agent = getAgentById(asValue);
21
+ if (agent) {
22
+ touchAgent(agent.id);
23
+ return agent;
24
+ }
25
+ }
26
+ return null;
27
+ }
28
+ export function authError() {
29
+ return {
30
+ content: [{ type: 'text', text: 'Error: Not authenticated. Call hive.start first.' }],
31
+ isError: true,
32
+ };
18
33
  }
19
34
  //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B;IAC9D,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC,CAAC;AAEvI,MAAM,UAAU,YAAY,CAAC,KAAU,EAAE,OAAgB;IACvD,iCAAiC;IACjC,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,CAAC;IACnC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,EAAE,CAAC;gBAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,sDAAsD;IACtD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kDAAkD,EAAE,CAAC;QAC9F,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
package/dist/db.d.ts CHANGED
@@ -1,26 +1,53 @@
1
1
  import Database from 'better-sqlite3';
2
- import type { Agent, Room, RoomEvent, RoomEventType, Task, TaskEvent, TaskEventType } from './models.js';
2
+ import type { Agent, Team, TeamMember, TeamEvent, TeamEventType, DMMessage, Task, TaskEvent, TaskEventType } from './models.js';
3
3
  export declare function initDB(dbPath?: string): Database.Database;
4
4
  export declare function getDB(): Database.Database;
5
- export declare function createAgent(displayName: string, tool: string, roles: string, expertise: string): Agent;
5
+ export declare function createAgent(displayName: string, tool: string, roles: string, expertise: string, originPeer?: string, remoteId?: string): Agent;
6
+ export declare function ensureRemoteAgentByRemoteId(remoteId: string, peerName: string, displayName: string): Agent;
6
7
  export declare function getAgentByToken(token: string): Agent | undefined;
7
8
  export declare function getAgentById(id: string): Agent | undefined;
8
- export declare function getAgentByName(name: string): Agent | undefined;
9
+ export declare function getAgentsByName(name: string): Agent[];
10
+ export declare function listAllAgents(activeOnly?: boolean): Agent[];
9
11
  export declare function findAgentByRole(role: string): Agent | undefined;
10
12
  export declare function touchAgent(id: string): void;
11
- export declare function createRoom(kind: string, hostAgentId: string | null, name?: string): Room;
12
- export declare function getRoomById(id: string): Room | undefined;
13
- export declare function getLobby(): Room | undefined;
14
- export declare function findDMRoom(agentA: string, agentB: string): Room | undefined;
15
- export declare function listTeams(): Room[];
16
- export declare function appendRoomEvent(roomId: string, type: RoomEventType, actorAgentId: string | null, payload?: object): RoomEvent;
17
- export declare function getRoomEvents(roomId: string, since?: number, limit?: number): RoomEvent[];
18
- export declare function getLastRoomEventTs(roomId: string): string | null;
19
- export declare function getLatestRoomEvents(roomId: string, limit?: number): RoomEvent[];
20
- export declare function getRoomMembers(roomId: string): string[];
21
- export declare function isMember(roomId: string, agentId: string): boolean;
22
- export declare function getAgentRooms(agentId: string, kind?: string, activeOnly?: boolean): Room[];
23
- export declare function createTask(title: string, creatorId: string, assigneeId?: string, sourceRoomId?: string, input?: object): Task;
13
+ export declare function renameAgent(id: string, newName: string): void;
14
+ export interface ResolvedAgent {
15
+ agent?: Agent;
16
+ source: 'id' | 'team-nickname' | 'display-name';
17
+ }
18
+ export declare function resolveAddressee(callerAgentId: string, target: string): ResolvedAgent | {
19
+ error: string;
20
+ };
21
+ export declare function createTeam(name: string, hostAgentId: string | null): Team;
22
+ export declare function getTeamById(id: string): Team | undefined;
23
+ export declare function getTeamByName(name: string): Team | undefined;
24
+ export declare function listTeams(activeOnly?: boolean): Team[];
25
+ export declare function getAgentTeams(agentId: string, activeOnly?: boolean): Team[];
26
+ export declare function addTeamMember(teamId: string, agentId: string, nickname?: string | null): TeamMember;
27
+ export declare function removeTeamMember(teamId: string, agentId: string): void;
28
+ export declare function isTeamMember(teamId: string, agentId: string): boolean;
29
+ export declare function getTeamMembers(teamId: string): TeamMember[];
30
+ export declare function getTeamMemberAgentIds(teamId: string): string[];
31
+ export declare function setTeamNickname(teamId: string, agentId: string, nickname: string | null): void;
32
+ export declare function getTeamMember(teamId: string, agentId: string): TeamMember | undefined;
33
+ export declare function getTeamDisplayName(teamId: string, agentId: string): string;
34
+ export declare function appendTeamEvent(teamId: string, type: TeamEventType, actorAgentId: string | null, payload?: object): TeamEvent;
35
+ export declare function getTeamEvents(teamId: string, since?: number, limit?: number): TeamEvent[];
36
+ export declare function getLatestTeamEvents(teamId: string, limit?: number): TeamEvent[];
37
+ export declare function appendDM(fromAgentId: string, toAgentId: string, content: string): DMMessage;
38
+ export declare function getMaxIncomingDMId(toAgentId: string, fromAgentId: string): number;
39
+ export declare function getDMConversation(agentA: string, agentB: string, since?: number, limit?: number): DMMessage[];
40
+ export interface CreateTaskOptions {
41
+ assigneeId?: string;
42
+ sourceTeamId?: string;
43
+ input?: object;
44
+ originatorPeer?: string;
45
+ originatorTaskId?: string;
46
+ delegatedPeer?: string;
47
+ delegatedTaskId?: string;
48
+ }
49
+ export declare function createTask(title: string, creatorId: string, opts?: CreateTaskOptions): Task;
50
+ export declare function setTaskDelegation(taskId: string, delegatedPeer: string, delegatedTaskId: string): void;
24
51
  export declare function getTaskById(id: string): Task | undefined;
25
52
  export declare function updateTaskStatus(id: string, status: string, extras?: Record<string, any>): void;
26
53
  export declare function getAgentTasks(agentId: string, status?: string): Task[];
@@ -29,7 +56,7 @@ export declare function getTaskEvents(taskId: string, since?: number, limit?: nu
29
56
  export declare function getReadCursor(agentId: string, targetType: string, targetId: string): number;
30
57
  export declare function setReadCursor(agentId: string, targetType: string, targetId: string, seq: number): void;
31
58
  export interface UnreadSummary {
32
- type: 'room' | 'task';
59
+ type: 'team' | 'task' | 'dm';
33
60
  id: string;
34
61
  name: string | null;
35
62
  kind: string;
@@ -51,6 +78,7 @@ export interface Peer {
51
78
  status: string;
52
79
  created_at: string;
53
80
  last_seen: string | null;
81
+ node_name: string;
54
82
  }
55
83
  export declare function addPeer(name: string, url: string, secret: string, exposed?: string): Peer;
56
84
  export declare function getPeerByName(name: string): Peer | undefined;
@@ -59,5 +87,7 @@ export declare function listPeers(): Peer[];
59
87
  export declare function removePeer(name: string): boolean;
60
88
  export declare function updatePeerExposed(name: string, exposed: string): void;
61
89
  export declare function touchPeer(name: string): void;
90
+ export declare function setPeerStatus(name: string, status: 'active' | 'inactive'): void;
91
+ export declare function setPeerNodeName(name: string, nodeName: string): void;
62
92
  export declare function isPeerExposed(peerName: string, agentName: string): boolean;
63
93
  export declare function cleanupStaleTasks(maxAgeDays?: number): number;