@johpaz/hive 1.1.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 (156) hide show
  1. package/CONTRIBUTING.md +44 -0
  2. package/README.md +310 -0
  3. package/package.json +96 -0
  4. package/packages/cli/package.json +28 -0
  5. package/packages/cli/src/commands/agent-run.ts +168 -0
  6. package/packages/cli/src/commands/agents.ts +398 -0
  7. package/packages/cli/src/commands/chat.ts +142 -0
  8. package/packages/cli/src/commands/config.ts +50 -0
  9. package/packages/cli/src/commands/cron.ts +161 -0
  10. package/packages/cli/src/commands/dev.ts +95 -0
  11. package/packages/cli/src/commands/doctor.ts +133 -0
  12. package/packages/cli/src/commands/gateway.ts +443 -0
  13. package/packages/cli/src/commands/logs.ts +57 -0
  14. package/packages/cli/src/commands/mcp.ts +175 -0
  15. package/packages/cli/src/commands/message.ts +77 -0
  16. package/packages/cli/src/commands/onboard.ts +1868 -0
  17. package/packages/cli/src/commands/security.ts +144 -0
  18. package/packages/cli/src/commands/service.ts +50 -0
  19. package/packages/cli/src/commands/sessions.ts +116 -0
  20. package/packages/cli/src/commands/skills.ts +187 -0
  21. package/packages/cli/src/commands/update.ts +25 -0
  22. package/packages/cli/src/index.ts +185 -0
  23. package/packages/cli/src/utils/token.ts +6 -0
  24. package/packages/code-bridge/README.md +78 -0
  25. package/packages/code-bridge/package.json +18 -0
  26. package/packages/code-bridge/src/index.ts +95 -0
  27. package/packages/code-bridge/src/process-manager.ts +212 -0
  28. package/packages/code-bridge/src/schemas.ts +133 -0
  29. package/packages/core/package.json +46 -0
  30. package/packages/core/src/agent/agent-loop.ts +369 -0
  31. package/packages/core/src/agent/compaction.ts +140 -0
  32. package/packages/core/src/agent/context-compiler.ts +378 -0
  33. package/packages/core/src/agent/context-guard.ts +91 -0
  34. package/packages/core/src/agent/context.ts +138 -0
  35. package/packages/core/src/agent/conversation-store.ts +198 -0
  36. package/packages/core/src/agent/curator.ts +158 -0
  37. package/packages/core/src/agent/hooks.ts +166 -0
  38. package/packages/core/src/agent/index.ts +116 -0
  39. package/packages/core/src/agent/llm-client.ts +503 -0
  40. package/packages/core/src/agent/native-tools.ts +505 -0
  41. package/packages/core/src/agent/prompt-builder.ts +532 -0
  42. package/packages/core/src/agent/providers/index.ts +167 -0
  43. package/packages/core/src/agent/providers.ts +1 -0
  44. package/packages/core/src/agent/reflector.ts +170 -0
  45. package/packages/core/src/agent/service.ts +64 -0
  46. package/packages/core/src/agent/stuck-loop.ts +133 -0
  47. package/packages/core/src/agent/supervisor.ts +39 -0
  48. package/packages/core/src/agent/tracer.ts +102 -0
  49. package/packages/core/src/agent/workspace.ts +110 -0
  50. package/packages/core/src/canvas/canvas-manager.test.ts +161 -0
  51. package/packages/core/src/canvas/canvas-manager.ts +319 -0
  52. package/packages/core/src/canvas/canvas-tools.ts +420 -0
  53. package/packages/core/src/canvas/emitter.ts +115 -0
  54. package/packages/core/src/canvas/index.ts +2 -0
  55. package/packages/core/src/channels/base.ts +138 -0
  56. package/packages/core/src/channels/discord.ts +260 -0
  57. package/packages/core/src/channels/index.ts +7 -0
  58. package/packages/core/src/channels/manager.ts +383 -0
  59. package/packages/core/src/channels/slack.ts +287 -0
  60. package/packages/core/src/channels/telegram.ts +502 -0
  61. package/packages/core/src/channels/webchat.ts +128 -0
  62. package/packages/core/src/channels/whatsapp.ts +375 -0
  63. package/packages/core/src/config/index.ts +12 -0
  64. package/packages/core/src/config/loader.ts +529 -0
  65. package/packages/core/src/events/event-bus.ts +169 -0
  66. package/packages/core/src/gateway/index.ts +5 -0
  67. package/packages/core/src/gateway/initializer.ts +290 -0
  68. package/packages/core/src/gateway/lane-queue.ts +169 -0
  69. package/packages/core/src/gateway/resolver.ts +108 -0
  70. package/packages/core/src/gateway/router.ts +124 -0
  71. package/packages/core/src/gateway/server.ts +3317 -0
  72. package/packages/core/src/gateway/session.ts +95 -0
  73. package/packages/core/src/gateway/slash-commands.ts +192 -0
  74. package/packages/core/src/heartbeat/index.ts +157 -0
  75. package/packages/core/src/index.ts +19 -0
  76. package/packages/core/src/integrations/catalog.ts +286 -0
  77. package/packages/core/src/integrations/env.ts +64 -0
  78. package/packages/core/src/integrations/index.ts +2 -0
  79. package/packages/core/src/memory/index.ts +1 -0
  80. package/packages/core/src/memory/notes.ts +68 -0
  81. package/packages/core/src/plugins/api.ts +128 -0
  82. package/packages/core/src/plugins/index.ts +2 -0
  83. package/packages/core/src/plugins/loader.ts +365 -0
  84. package/packages/core/src/resilience/circuit-breaker.ts +225 -0
  85. package/packages/core/src/security/google-chat.ts +269 -0
  86. package/packages/core/src/security/index.ts +192 -0
  87. package/packages/core/src/security/pairing.ts +250 -0
  88. package/packages/core/src/security/rate-limit.ts +270 -0
  89. package/packages/core/src/security/signal.ts +321 -0
  90. package/packages/core/src/state/store.ts +312 -0
  91. package/packages/core/src/storage/bun-sqlite-store.ts +188 -0
  92. package/packages/core/src/storage/crypto.ts +101 -0
  93. package/packages/core/src/storage/db-context.ts +333 -0
  94. package/packages/core/src/storage/onboarding.ts +1087 -0
  95. package/packages/core/src/storage/schema.ts +541 -0
  96. package/packages/core/src/storage/seed.ts +571 -0
  97. package/packages/core/src/storage/sqlite.ts +387 -0
  98. package/packages/core/src/storage/usage.ts +212 -0
  99. package/packages/core/src/tools/bridge-events.ts +74 -0
  100. package/packages/core/src/tools/browser.ts +275 -0
  101. package/packages/core/src/tools/codebridge.ts +421 -0
  102. package/packages/core/src/tools/coordinator-tools.ts +179 -0
  103. package/packages/core/src/tools/cron.ts +611 -0
  104. package/packages/core/src/tools/exec.ts +140 -0
  105. package/packages/core/src/tools/fs.ts +364 -0
  106. package/packages/core/src/tools/index.ts +12 -0
  107. package/packages/core/src/tools/memory.ts +176 -0
  108. package/packages/core/src/tools/notify.ts +113 -0
  109. package/packages/core/src/tools/project-management.ts +376 -0
  110. package/packages/core/src/tools/project.ts +375 -0
  111. package/packages/core/src/tools/read.ts +158 -0
  112. package/packages/core/src/tools/web.ts +436 -0
  113. package/packages/core/src/tools/workspace.ts +171 -0
  114. package/packages/core/src/utils/benchmark.ts +80 -0
  115. package/packages/core/src/utils/crypto.ts +73 -0
  116. package/packages/core/src/utils/date.ts +42 -0
  117. package/packages/core/src/utils/index.ts +4 -0
  118. package/packages/core/src/utils/logger.ts +388 -0
  119. package/packages/core/src/utils/retry.ts +70 -0
  120. package/packages/core/src/voice/index.ts +583 -0
  121. package/packages/core/tsconfig.json +9 -0
  122. package/packages/mcp/package.json +26 -0
  123. package/packages/mcp/src/config.ts +13 -0
  124. package/packages/mcp/src/index.ts +1 -0
  125. package/packages/mcp/src/logger.ts +42 -0
  126. package/packages/mcp/src/manager.ts +434 -0
  127. package/packages/mcp/src/transports/index.ts +67 -0
  128. package/packages/mcp/src/transports/sse.ts +241 -0
  129. package/packages/mcp/src/transports/websocket.ts +159 -0
  130. package/packages/skills/package.json +21 -0
  131. package/packages/skills/src/bundled/agent_management/SKILL.md +24 -0
  132. package/packages/skills/src/bundled/browser_automation/SKILL.md +30 -0
  133. package/packages/skills/src/bundled/context_compact/SKILL.md +35 -0
  134. package/packages/skills/src/bundled/cron_manager/SKILL.md +52 -0
  135. package/packages/skills/src/bundled/file_manager/SKILL.md +76 -0
  136. package/packages/skills/src/bundled/http_client/SKILL.md +24 -0
  137. package/packages/skills/src/bundled/memory/SKILL.md +42 -0
  138. package/packages/skills/src/bundled/project_management/SKILL.md +26 -0
  139. package/packages/skills/src/bundled/shell/SKILL.md +43 -0
  140. package/packages/skills/src/bundled/system_notify/SKILL.md +52 -0
  141. package/packages/skills/src/bundled/voice/SKILL.md +25 -0
  142. package/packages/skills/src/bundled/web_search/SKILL.md +29 -0
  143. package/packages/skills/src/index.ts +1 -0
  144. package/packages/skills/src/loader.ts +282 -0
  145. package/packages/tools/package.json +43 -0
  146. package/packages/tools/src/browser/browser.test.ts +111 -0
  147. package/packages/tools/src/browser/index.ts +272 -0
  148. package/packages/tools/src/canvas/index.ts +220 -0
  149. package/packages/tools/src/cron/cron.test.ts +164 -0
  150. package/packages/tools/src/cron/index.ts +304 -0
  151. package/packages/tools/src/filesystem/filesystem.test.ts +240 -0
  152. package/packages/tools/src/filesystem/index.ts +379 -0
  153. package/packages/tools/src/git/index.ts +239 -0
  154. package/packages/tools/src/index.ts +4 -0
  155. package/packages/tools/src/shell/detect-env.ts +70 -0
  156. package/packages/tools/tsconfig.json +9 -0
@@ -0,0 +1,95 @@
1
+ import type { ServerWebSocket } from "bun";
2
+
3
+ export interface SessionId {
4
+ userId: string;
5
+ }
6
+
7
+ export function parseSessionId(sessionId: string): SessionId | null {
8
+ if (!sessionId || sessionId.trim() === "") {
9
+ return null;
10
+ }
11
+ return { userId: sessionId };
12
+ }
13
+
14
+ export function formatSessionId(session: SessionId): string {
15
+ return session.userId;
16
+ }
17
+
18
+ export interface Session {
19
+ id: string;
20
+ parsed: SessionId;
21
+ createdAt: Date;
22
+ lastActivityAt: Date;
23
+ messageCount: number;
24
+ ws?: ServerWebSocket<unknown>;
25
+ }
26
+
27
+ export class SessionManager {
28
+ private sessions: Map<string, Session> = new Map();
29
+
30
+ create(sessionId: string, ws?: ServerWebSocket<unknown>): Session {
31
+ const parsed = parseSessionId(sessionId);
32
+ if (!parsed) {
33
+ throw new Error(`Invalid session ID: ${sessionId}`);
34
+ }
35
+
36
+ const existing = this.sessions.get(sessionId);
37
+ if (existing) {
38
+ existing.lastActivityAt = new Date();
39
+ if (ws) {
40
+ existing.ws = ws;
41
+ }
42
+ return existing;
43
+ }
44
+
45
+ const session: Session = {
46
+ id: sessionId,
47
+ parsed,
48
+ createdAt: new Date(),
49
+ lastActivityAt: new Date(),
50
+ messageCount: 0,
51
+ };
52
+ if (ws !== undefined) {
53
+ session.ws = ws;
54
+ }
55
+
56
+ this.sessions.set(sessionId, session);
57
+ return session;
58
+ }
59
+
60
+ get(sessionId: string): Session | undefined {
61
+ return this.sessions.get(sessionId);
62
+ }
63
+
64
+ touch(sessionId: string): void {
65
+ const session = this.sessions.get(sessionId);
66
+ if (session) {
67
+ session.lastActivityAt = new Date();
68
+ session.messageCount++;
69
+ }
70
+ }
71
+
72
+ delete(sessionId: string): boolean {
73
+ return this.sessions.delete(sessionId);
74
+ }
75
+
76
+ list(): Session[] {
77
+ return Array.from(this.sessions.values());
78
+ }
79
+
80
+ prune(maxAgeMs: number): number {
81
+ const now = Date.now();
82
+ let pruned = 0;
83
+
84
+ for (const [id, session] of this.sessions) {
85
+ if (now - session.lastActivityAt.getTime() > maxAgeMs) {
86
+ this.sessions.delete(id);
87
+ pruned++;
88
+ }
89
+ }
90
+
91
+ return pruned;
92
+ }
93
+ }
94
+
95
+ export const sessionManager = new SessionManager();
@@ -0,0 +1,192 @@
1
+ import type { ServerWebSocket } from "bun";
2
+ import { sessionManager } from "./session.ts";
3
+ import { laneQueue } from "./lane-queue.ts";
4
+ import { logger } from "../utils/logger.ts";
5
+
6
+ export interface InboundMessage {
7
+ type: "message" | "command" | "ping" | "join" | "canvas_subscribe" | "canvas_unsubscribe" | "logs_subscribe" | "logs_unsubscribe" | "audio";
8
+ sessionId: string;
9
+ content?: string;
10
+ audio?: string;
11
+ command?: string;
12
+ args?: string[];
13
+ metadata?: Record<string, unknown>;
14
+ }
15
+
16
+ export interface OutboundMessage {
17
+ type: "message" | "stream" | "status" | "error" | "pong" | "command_result" | "joined" | "typing" | "audio" | "welcome";
18
+ sessionId: string;
19
+ content?: string;
20
+ chunk?: string;
21
+ audio?: string;
22
+ isLast?: boolean;
23
+ isTyping?: boolean;
24
+ isStep?: boolean;
25
+ stepType?: "plan" | "tool_call" | "tool_result" | "text";
26
+ status?: {
27
+ state: string;
28
+ model?: string;
29
+ tokens?: number;
30
+ };
31
+ error?: string;
32
+ result?: unknown;
33
+ // Welcome message fields
34
+ user?: {
35
+ id: string;
36
+ name: string;
37
+ language: string;
38
+ } | null;
39
+ agent?: {
40
+ id: string;
41
+ name: string;
42
+ provider: string;
43
+ model: string;
44
+ } | null;
45
+ channels?: string[];
46
+ voice?: {
47
+ enabled: boolean;
48
+ sttProvider: string | null;
49
+ ttsProvider: string | null;
50
+ };
51
+ codeBridge?: string[];
52
+ }
53
+
54
+ export interface SlashCommand {
55
+ name: string;
56
+ description: string;
57
+ handler: (sessionId: string, args: string[], ws: ServerWebSocket<unknown>) => Promise<unknown>;
58
+ }
59
+
60
+ const slashCommands = new Map<string, SlashCommand>();
61
+
62
+ export function registerSlashCommand(command: SlashCommand): void {
63
+ slashCommands.set(command.name, command);
64
+ }
65
+
66
+ export function isSlashCommand(content: string): boolean {
67
+ return content.startsWith("/") && content.length > 1;
68
+ }
69
+
70
+ export function parseSlashCommand(content: string): { name: string; args: string[] } | null {
71
+ if (!isSlashCommand(content)) return null;
72
+
73
+ const parts = content.slice(1).split(/\s+/);
74
+ const name = parts[0]?.toLowerCase();
75
+ if (!name) return null;
76
+
77
+ return {
78
+ name,
79
+ args: parts.slice(1),
80
+ };
81
+ }
82
+
83
+ export async function executeSlashCommand(
84
+ sessionId: string,
85
+ content: string,
86
+ ws: ServerWebSocket<unknown>
87
+ ): Promise<OutboundMessage | null> {
88
+ const parsed = parseSlashCommand(content);
89
+ if (!parsed) {
90
+ return null;
91
+ }
92
+
93
+ const command = slashCommands.get(parsed.name);
94
+ if (!command) {
95
+ return null;
96
+ }
97
+
98
+ logger.info(`Executing slash command: /${parsed.name}`, { sessionId, args: parsed.args });
99
+
100
+ try {
101
+ const result = await command.handler(sessionId, parsed.args, ws);
102
+ return {
103
+ type: "command_result",
104
+ sessionId,
105
+ result,
106
+ };
107
+ } catch (error) {
108
+ logger.error(`Slash command failed: /${parsed.name}`, { error: (error as Error).message });
109
+ return {
110
+ type: "error",
111
+ sessionId,
112
+ error: (error as Error).message,
113
+ };
114
+ }
115
+ }
116
+
117
+ registerSlashCommand({
118
+ name: "stop",
119
+ description: "Stop the current task",
120
+ handler: async (sessionId) => {
121
+ const cancelled = laneQueue.cancel(sessionId);
122
+ return {
123
+ success: cancelled,
124
+ message: cancelled ? "Task stopped" : "No task running",
125
+ };
126
+ },
127
+ });
128
+
129
+ registerSlashCommand({
130
+ name: "status",
131
+ description: "Show session status",
132
+ handler: async (sessionId) => {
133
+ const session = sessionManager.get(sessionId);
134
+ const queueStatus = laneQueue.getStatus(sessionId);
135
+
136
+ return {
137
+ sessionId,
138
+ createdAt: session?.createdAt,
139
+ messageCount: session?.messageCount,
140
+ queueLength: queueStatus.queueLength,
141
+ isProcessing: queueStatus.running !== undefined,
142
+ };
143
+ },
144
+ });
145
+
146
+ registerSlashCommand({
147
+ name: "new",
148
+ description: "Start a new session",
149
+ handler: async (sessionId) => {
150
+ sessionManager.delete(sessionId);
151
+ return { success: true, message: "Session reset" };
152
+ },
153
+ });
154
+
155
+ registerSlashCommand({
156
+ name: "compact",
157
+ description: "Force context compaction",
158
+ handler: async (sessionId) => {
159
+ logger.info(`Compaction requested for session: ${sessionId}`);
160
+ return { success: true, message: "Compaction triggered" };
161
+ },
162
+ });
163
+
164
+ registerSlashCommand({
165
+ name: "reset",
166
+ description: "Reset the current context",
167
+ handler: async (sessionId) => {
168
+ logger.info(`Context reset requested for session: ${sessionId}`);
169
+ return { success: true, message: "Context reset" };
170
+ },
171
+ });
172
+
173
+ registerSlashCommand({
174
+ name: "model",
175
+ description: "Switch model for this session",
176
+ handler: async (_sessionId, args) => {
177
+ const modelName = args[0];
178
+ if (!modelName) {
179
+ return { success: false, message: "Usage: /model <model-name>" };
180
+ }
181
+ return { success: true, message: `Model switched to: ${modelName}` };
182
+ },
183
+ });
184
+
185
+ registerSlashCommand({
186
+ name: "help",
187
+ description: "Show available commands",
188
+ handler: async () => {
189
+ const commands = Array.from(slashCommands.values()).map((c) => `/${c.name} - ${c.description}`);
190
+ return { commands };
191
+ },
192
+ });
@@ -0,0 +1,157 @@
1
+ import type { Config } from "../config/loader.ts";
2
+ import { logger } from "../utils/logger.ts";
3
+
4
+ export interface HealthStatus {
5
+ status: "healthy" | "degraded" | "unhealthy";
6
+ checks: Record<string, {
7
+ status: "ok" | "warning" | "error";
8
+ message?: string;
9
+ latency?: number;
10
+ }>;
11
+ uptime: number;
12
+ lastCheck: Date;
13
+ }
14
+
15
+ export interface HeartbeatOptions {
16
+ intervalMs?: number;
17
+ onHealthChange?: (status: HealthStatus) => void;
18
+ }
19
+
20
+ type HealthCheck = () => Promise<{
21
+ status: "ok" | "warning" | "error";
22
+ message?: string;
23
+ latency?: number;
24
+ }>;
25
+
26
+ export class Heartbeat {
27
+ private intervalMs: number;
28
+ private checks: Map<string, HealthCheck> = new Map();
29
+ private intervalId: Timer | null = null;
30
+ private startTime: Date;
31
+ private lastStatus: HealthStatus | null = null;
32
+ private onHealthChange?: (status: HealthStatus) => void;
33
+ private log = logger.child("heartbeat");
34
+
35
+ constructor(_config: Config, options: HeartbeatOptions = {}) {
36
+ this.intervalMs = options.intervalMs ?? 30000;
37
+ this.onHealthChange = options.onHealthChange;
38
+ this.startTime = new Date();
39
+ }
40
+
41
+ registerCheck(name: string, check: HealthCheck): void {
42
+ this.checks.set(name, check);
43
+ this.log.debug(`Registered health check: ${name}`);
44
+ }
45
+
46
+ removeCheck(name: string): boolean {
47
+ return this.checks.delete(name);
48
+ }
49
+
50
+ async runChecks(): Promise<HealthStatus> {
51
+ const checks: HealthStatus["checks"] = {};
52
+ let overallStatus: "healthy" | "degraded" | "unhealthy" = "healthy";
53
+
54
+ for (const [name, check] of this.checks) {
55
+ try {
56
+ const start = Date.now();
57
+ const result = await check();
58
+ const latency = Date.now() - start;
59
+
60
+ checks[name] = {
61
+ status: result.status,
62
+ message: result.message,
63
+ latency: result.latency ?? latency,
64
+ };
65
+
66
+ if (result.status === "warning" && overallStatus === "healthy") {
67
+ overallStatus = "degraded";
68
+ } else if (result.status === "error") {
69
+ overallStatus = "unhealthy";
70
+ }
71
+ } catch (error) {
72
+ checks[name] = {
73
+ status: "error",
74
+ message: (error as Error).message,
75
+ };
76
+ overallStatus = "unhealthy";
77
+ }
78
+ }
79
+
80
+ const status: HealthStatus = {
81
+ status: overallStatus,
82
+ checks,
83
+ uptime: Date.now() - this.startTime.getTime(),
84
+ lastCheck: new Date(),
85
+ };
86
+
87
+ const prevStatus = this.lastStatus?.status;
88
+ if (prevStatus && prevStatus !== overallStatus) {
89
+ this.log.info(`Health status changed: ${prevStatus} -> ${overallStatus}`);
90
+ this.onHealthChange?.(status);
91
+ }
92
+
93
+ this.lastStatus = status;
94
+ return status;
95
+ }
96
+
97
+ start(): void {
98
+ if (this.intervalId) {
99
+ this.log.warn("Heartbeat already running");
100
+ return;
101
+ }
102
+
103
+ this.runChecks();
104
+
105
+ this.intervalId = setInterval(async () => {
106
+ await this.runChecks();
107
+ }, this.intervalMs);
108
+
109
+ this.log.info(`Heartbeat started (interval: ${this.intervalMs}ms)`);
110
+ }
111
+
112
+ stop(): void {
113
+ if (this.intervalId) {
114
+ clearInterval(this.intervalId);
115
+ this.intervalId = null;
116
+ this.log.info("Heartbeat stopped");
117
+ }
118
+ }
119
+
120
+ getStatus(): HealthStatus | null {
121
+ return this.lastStatus;
122
+ }
123
+
124
+ isRunning(): boolean {
125
+ return this.intervalId !== null;
126
+ }
127
+ }
128
+
129
+ export function createHeartbeat(config: Config, options?: HeartbeatOptions): Heartbeat {
130
+ const heartbeat = new Heartbeat(config, options);
131
+
132
+ heartbeat.registerCheck("memory", async () => {
133
+ const memUsage = process.memoryUsage();
134
+ const heapUsedMB = Math.round(memUsage.heapUsed / 1024 / 1024);
135
+ const heapTotalMB = Math.round(memUsage.heapTotal / 1024 / 1024);
136
+ const ratio = memUsage.heapUsed / memUsage.heapTotal;
137
+
138
+ if (ratio > 0.9) {
139
+ return {
140
+ status: "error",
141
+ message: `Memory critically high: ${heapUsedMB}/${heapTotalMB}MB`,
142
+ };
143
+ } else if (ratio > 0.75) {
144
+ return {
145
+ status: "warning",
146
+ message: `Memory usage high: ${heapUsedMB}/${heapTotalMB}MB`,
147
+ };
148
+ }
149
+
150
+ return {
151
+ status: "ok",
152
+ message: `${heapUsedMB}/${heapTotalMB}MB used`,
153
+ };
154
+ });
155
+
156
+ return heartbeat;
157
+ }
@@ -0,0 +1,19 @@
1
+ export * from "./gateway/index.ts";
2
+ export * from "./gateway/server.ts";
3
+ export * from "./agent/index.ts";
4
+ export * from "./agent/context.ts";
5
+ export * from "./channels/index.ts";
6
+ export * from "./channels/manager.ts";
7
+ export * from "./config/index.ts";
8
+ export * from "./utils/logger.ts";
9
+ export * from "./utils/crypto.ts";
10
+ export * from "./utils/retry.ts";
11
+ export * from "./security/index.ts";
12
+ export * from "./heartbeat/index.ts";
13
+ export * from "./memory/notes.ts";
14
+ export * from "./events/event-bus.ts";
15
+ export * from "./state/store.ts";
16
+ export * from "./resilience/circuit-breaker.ts";
17
+ export * from "./plugins/index.ts";
18
+ export * from "./canvas/index.ts";
19
+ export type { Tool, ToolResult } from "./agent/native-tools.ts";