0xkobold 0.0.6 → 0.2.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 (120) hide show
  1. package/HEARTBEAT.md +66 -32
  2. package/README.md +220 -1
  3. package/dist/package.json +3 -2
  4. package/dist/src/agent/bootstrap-loader.js +138 -0
  5. package/dist/src/agent/bootstrap-loader.js.map +1 -0
  6. package/dist/src/agent/context-pruning.js +279 -0
  7. package/dist/src/agent/context-pruning.js.map +1 -0
  8. package/dist/src/agent/dynamic-personality.js +211 -0
  9. package/dist/src/agent/dynamic-personality.js.map +1 -0
  10. package/dist/src/agent/embedded-runner.js +79 -0
  11. package/dist/src/agent/embedded-runner.js.map +1 -0
  12. package/dist/src/agent/index.js +16 -0
  13. package/dist/src/agent/index.js.map +1 -0
  14. package/dist/src/agent/system-prompt.js +84 -0
  15. package/dist/src/agent/system-prompt.js.map +1 -0
  16. package/dist/src/agent/task-router.js +194 -0
  17. package/dist/src/agent/task-router.js.map +1 -0
  18. package/dist/src/agent/tools/index.js +2 -0
  19. package/dist/src/agent/tools/index.js.map +1 -0
  20. package/dist/src/agent/tools/spawn-agent.js +200 -0
  21. package/dist/src/agent/tools/spawn-agent.js.map +1 -0
  22. package/dist/src/agent/types/definitions.js +317 -0
  23. package/dist/src/agent/types/definitions.js.map +1 -0
  24. package/dist/src/agent/types/index.js +2 -0
  25. package/dist/src/agent/types/index.js.map +1 -0
  26. package/dist/src/agent/user-profile.js +300 -0
  27. package/dist/src/agent/user-profile.js.map +1 -0
  28. package/dist/src/agents/task-router.js +194 -0
  29. package/dist/src/agents/task-router.js.map +1 -0
  30. package/dist/src/agents/tools/index.js +2 -0
  31. package/dist/src/agents/tools/index.js.map +1 -0
  32. package/dist/src/agents/tools/spawn-agent.js +200 -0
  33. package/dist/src/agents/tools/spawn-agent.js.map +1 -0
  34. package/dist/src/agents/types/definitions.js +317 -0
  35. package/dist/src/agents/types/definitions.js.map +1 -0
  36. package/dist/src/agents/types/index.js +2 -0
  37. package/dist/src/agents/types/index.js.map +1 -0
  38. package/dist/src/cli/commands/embedded.js +36 -0
  39. package/dist/src/cli/commands/embedded.js.map +1 -0
  40. package/dist/src/cli/commands/gateway.js +127 -166
  41. package/dist/src/cli/commands/gateway.js.map +1 -1
  42. package/dist/src/cli/program-fixed.js +1 -0
  43. package/dist/src/cli/program-fixed.js.map +1 -0
  44. package/dist/src/cli/program.js +10 -29
  45. package/dist/src/cli/program.js.map +1 -1
  46. package/dist/src/extensions/core/agent-lifecycle-extension.js +323 -0
  47. package/dist/src/extensions/core/agent-lifecycle-extension.js.map +1 -0
  48. package/dist/src/extensions/core/agent-orchestrator-extension.js +642 -0
  49. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -0
  50. package/dist/src/extensions/core/agent-workspace-extension.js +174 -0
  51. package/dist/src/extensions/core/agent-workspace-extension.js.map +1 -0
  52. package/dist/src/extensions/core/autonomous-executor-extension.js +145 -0
  53. package/dist/src/extensions/core/autonomous-executor-extension.js.map +1 -0
  54. package/dist/src/extensions/core/autonomous-subagent-extension.js +333 -0
  55. package/dist/src/extensions/core/autonomous-subagent-extension.js.map +1 -0
  56. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js +323 -0
  57. package/dist/src/extensions/core/deprecated/agent-lifecycle-extension.js.map +1 -0
  58. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js +333 -0
  59. package/dist/src/extensions/core/deprecated/autonomous-subagent-extension.js.map +1 -0
  60. package/dist/src/extensions/core/deprecated/subagent-extension.js +647 -0
  61. package/dist/src/extensions/core/deprecated/subagent-extension.js.map +1 -0
  62. package/dist/src/extensions/core/mode-manager-extension.js +11 -0
  63. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
  64. package/dist/src/extensions/core/perennial-memory-extension.js +10 -2
  65. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  66. package/dist/src/extensions/core/persona-loader-extension.js +61 -129
  67. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  68. package/dist/src/extensions/core/websearch-enhanced-extension.js +705 -0
  69. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -0
  70. package/dist/src/extensions/core/websearch-v2-extension.js +303 -0
  71. package/dist/src/extensions/core/websearch-v2-extension.js.map +1 -0
  72. package/dist/src/gateway/discord-bot.js +185 -0
  73. package/dist/src/gateway/discord-bot.js.map +1 -0
  74. package/dist/src/gateway/index.js +10 -350
  75. package/dist/src/gateway/index.js.map +1 -1
  76. package/dist/src/gateway/server.js +325 -0
  77. package/dist/src/gateway/server.js.map +1 -0
  78. package/dist/src/gateway/websocket-server.js +142 -0
  79. package/dist/src/gateway/websocket-server.js.map +1 -0
  80. package/dist/src/heartbeat/checkin.js +185 -0
  81. package/dist/src/heartbeat/checkin.js.map +1 -0
  82. package/dist/src/heartbeat/index.js +5 -0
  83. package/dist/src/heartbeat/index.js.map +1 -0
  84. package/dist/src/heartbeat/notifications.js +216 -0
  85. package/dist/src/heartbeat/notifications.js.map +1 -0
  86. package/dist/src/heartbeat/scheduler.js +284 -0
  87. package/dist/src/heartbeat/scheduler.js.map +1 -0
  88. package/dist/src/index.js +21 -3
  89. package/dist/src/index.js.map +1 -1
  90. package/dist/src/mode/auto-detector.js +211 -0
  91. package/dist/src/mode/auto-detector.js.map +1 -0
  92. package/dist/src/mode/index.js +3 -0
  93. package/dist/src/mode/index.js.map +1 -0
  94. package/dist/src/mode/natural-switcher.js +123 -0
  95. package/dist/src/mode/natural-switcher.js.map +1 -0
  96. package/dist/src/skills/builtin/api-worker.js +88 -0
  97. package/dist/src/skills/builtin/api-worker.js.map +1 -0
  98. package/dist/src/skills/builtin/nextjs-worker.js +55 -0
  99. package/dist/src/skills/builtin/nextjs-worker.js.map +1 -0
  100. package/dist/src/skills/builtin/real-workers.js +166 -0
  101. package/dist/src/skills/builtin/real-workers.js.map +1 -0
  102. package/dist/src/skills/builtin/sql-worker.js +61 -0
  103. package/dist/src/skills/builtin/sql-worker.js.map +1 -0
  104. package/dist/src/skills/builtin/test-worker.js +79 -0
  105. package/dist/src/skills/builtin/test-worker.js.map +1 -0
  106. package/dist/src/skills/builtin/web-research.js +77 -0
  107. package/dist/src/skills/builtin/web-research.js.map +1 -0
  108. package/dist/src/skills/framework.js +250 -0
  109. package/dist/src/skills/framework.js.map +1 -0
  110. package/dist/src/skills/index.js +10 -10
  111. package/dist/src/skills/index.js.map +1 -1
  112. package/dist/src/streaming/block-streamer.js +172 -0
  113. package/dist/src/streaming/block-streamer.js.map +1 -0
  114. package/dist/src/streaming/index.js +2 -0
  115. package/dist/src/streaming/index.js.map +1 -0
  116. package/dist/src/workspace/index.js +2 -0
  117. package/dist/src/workspace/index.js.map +1 -0
  118. package/dist/src/workspace/manager.js +181 -0
  119. package/dist/src/workspace/manager.js.map +1 -0
  120. package/package.json +3 -2
@@ -0,0 +1,325 @@
1
+ /**
2
+ * REAL Gateway Server - v0.2.0
3
+ *
4
+ * Production-ready WebSocket + HTTP server using Bun native APIs.
5
+ * Better than OpenClaw: Lower latency, simpler architecture, Bun-native.
6
+ */
7
+ import { EventEmitter } from "events";
8
+ const DEFAULT_CONFIG = {
9
+ port: 7777,
10
+ host: "localhost",
11
+ cors: true,
12
+ heartbeatInterval: 30000,
13
+ };
14
+ class RealGatewayServer extends EventEmitter {
15
+ config;
16
+ server = null;
17
+ connections = new Map();
18
+ running = false;
19
+ heartbeatTimer = null;
20
+ constructor(config = {}) {
21
+ super();
22
+ this.config = { ...DEFAULT_CONFIG, ...config };
23
+ }
24
+ async start() {
25
+ if (this.running)
26
+ return;
27
+ const self = this;
28
+ this.server = Bun.serve({
29
+ port: this.config.port,
30
+ hostname: this.config.host,
31
+ async fetch(req, server) {
32
+ const url = new URL(req.url);
33
+ if (self.config.cors && req.method === "OPTIONS") {
34
+ return new Response(null, {
35
+ status: 204,
36
+ headers: self.getCORSHeaders(),
37
+ });
38
+ }
39
+ if (url.pathname === "/ws") {
40
+ const upgraded = server.upgrade(req, {
41
+ data: { type: url.searchParams.get("type") || "web" },
42
+ });
43
+ if (upgraded) {
44
+ return undefined;
45
+ }
46
+ }
47
+ return self.handleHTTPRequest(req);
48
+ },
49
+ websocket: {
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ open(ws) {
52
+ const id = `ws-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
53
+ const conn = {
54
+ id,
55
+ socket: ws,
56
+ type: ws.data.type,
57
+ connectedAt: new Date(),
58
+ lastPing: new Date(),
59
+ };
60
+ self.connections.set(id, conn);
61
+ self.emit("connected", conn);
62
+ self.sendToConnection(id, {
63
+ type: "status",
64
+ id: `welcome-${Date.now()}`,
65
+ payload: { connected: true, id },
66
+ timestamp: Date.now(),
67
+ });
68
+ console.log(`[Gateway] WebSocket connected: ${id} (${conn.type})`);
69
+ },
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ message(ws, message) {
72
+ const conn = self.findConnectionByWs(ws);
73
+ if (!conn)
74
+ return;
75
+ try {
76
+ const data = JSON.parse(message.toString());
77
+ conn.lastPing = new Date();
78
+ if (data.type === "ping") {
79
+ self.sendToConnection(conn.id, {
80
+ type: "pong",
81
+ id: data.id,
82
+ payload: { time: Date.now() },
83
+ timestamp: Date.now(),
84
+ });
85
+ return;
86
+ }
87
+ self.emit("message", { connection: conn, data });
88
+ }
89
+ catch (err) {
90
+ console.error("[Gateway] Invalid message format:", err);
91
+ }
92
+ },
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ close(ws, code, reason) {
95
+ const conn = self.findConnectionByWs(ws);
96
+ if (conn) {
97
+ self.connections.delete(conn.id);
98
+ self.emit("disconnected", { id: conn.id, code, reason });
99
+ console.log(`[Gateway] WebSocket disconnected: ${conn.id}`);
100
+ }
101
+ },
102
+ },
103
+ });
104
+ this.running = true;
105
+ this.startHeartbeat();
106
+ console.log(`🌐 Gateway server running at: http://${this.config.host}:${this.config.port}`);
107
+ console.log(` WebSocket endpoint: ws://${this.config.host}:${this.config.port}/ws`);
108
+ this.emit("started", { port: this.config.port, host: this.config.host });
109
+ }
110
+ stop() {
111
+ if (!this.running)
112
+ return;
113
+ if (this.heartbeatTimer) {
114
+ clearInterval(this.heartbeatTimer);
115
+ this.heartbeatTimer = null;
116
+ }
117
+ for (const [id, conn] of this.connections) {
118
+ try {
119
+ conn.socket.close();
120
+ }
121
+ catch { }
122
+ this.connections.delete(id);
123
+ }
124
+ this.server?.stop(true);
125
+ this.server = null;
126
+ this.running = false;
127
+ console.log("[Gateway] Server stopped");
128
+ this.emit("stopped");
129
+ }
130
+ async handleHTTPRequest(req) {
131
+ const url = new URL(req.url);
132
+ const headers = this.getCORSHeaders();
133
+ if (url.pathname === "/health") {
134
+ return new Response(JSON.stringify({
135
+ status: "healthy",
136
+ connections: this.connections.size,
137
+ uptime: Date.now(),
138
+ }), {
139
+ status: 200,
140
+ headers: { ...headers, "Content-Type": "application/json" }
141
+ });
142
+ }
143
+ if (url.pathname === "/status") {
144
+ return new Response(JSON.stringify({
145
+ running: this.running,
146
+ port: this.config.port,
147
+ connections: Array.from(this.connections.values()).map(c => ({
148
+ id: c.id,
149
+ type: c.type,
150
+ connectedAt: c.connectedAt,
151
+ })),
152
+ }), {
153
+ status: 200,
154
+ headers: { ...headers, "Content-Type": "application/json" }
155
+ });
156
+ }
157
+ if (url.pathname === "/send" && req.method === "POST") {
158
+ try {
159
+ const body = await req.json();
160
+ if (body.channel) {
161
+ const sent = this.broadcastToChannel(body.channel, body.message, body.type);
162
+ return new Response(JSON.stringify({ sent }), {
163
+ status: 200,
164
+ headers: { ...headers, "Content-Type": "application/json" }
165
+ });
166
+ }
167
+ else {
168
+ this.broadcast(body.message);
169
+ return new Response(JSON.stringify({ sent: this.connections.size }), {
170
+ status: 200,
171
+ headers: { ...headers, "Content-Type": "application/json" }
172
+ });
173
+ }
174
+ }
175
+ catch {
176
+ return new Response(JSON.stringify({ error: "Invalid JSON" }), {
177
+ status: 400,
178
+ headers: { ...headers, "Content-Type": "application/json" }
179
+ });
180
+ }
181
+ }
182
+ return new Response(JSON.stringify({ error: "Not found" }), {
183
+ status: 404,
184
+ headers: { ...headers, "Content-Type": "application/json" }
185
+ });
186
+ }
187
+ getCORSHeaders() {
188
+ return {
189
+ "Access-Control-Allow-Origin": "*",
190
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
191
+ "Access-Control-Allow-Headers": "Content-Type",
192
+ };
193
+ }
194
+ findConnectionByWs(ws) {
195
+ for (const conn of this.connections.values()) {
196
+ if (conn.socket === ws) {
197
+ return conn;
198
+ }
199
+ }
200
+ return undefined;
201
+ }
202
+ /**
203
+ * Register a new connection (public API for external integrations like Discord)
204
+ */
205
+ registerConnection(connData) {
206
+ const id = `conn-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
207
+ const now = new Date();
208
+ const connection = {
209
+ ...connData,
210
+ id,
211
+ connectedAt: now,
212
+ lastPing: now,
213
+ };
214
+ this.connections.set(id, connection);
215
+ this.emit("connected", connection);
216
+ console.log(`[Gateway] Connection registered: ${id} (${connection.type})`);
217
+ return id;
218
+ }
219
+ /**
220
+ * Remove a connection (public API)
221
+ */
222
+ removeConnection(id) {
223
+ const conn = this.connections.get(id);
224
+ if (conn) {
225
+ this.connections.delete(id);
226
+ this.emit("disconnected", { id, code: 0, reason: "manual removal" });
227
+ console.log(`[Gateway] Connection removed: ${id}`);
228
+ return true;
229
+ }
230
+ return false;
231
+ }
232
+ broadcast(message, filter) {
233
+ const msg = typeof message === "string" ? message : JSON.stringify(message);
234
+ for (const conn of this.connections.values()) {
235
+ if (filter && !filter(conn))
236
+ continue;
237
+ try {
238
+ conn.socket.send(msg);
239
+ }
240
+ catch (err) {
241
+ console.error(`[Gateway] Failed to send to ${conn.id}:`, err);
242
+ }
243
+ }
244
+ }
245
+ broadcastToChannel(channel, message, type = "chat") {
246
+ let sent = 0;
247
+ const data = {
248
+ type: type,
249
+ id: `msg-${Date.now()}`,
250
+ payload: message,
251
+ timestamp: Date.now(),
252
+ channel,
253
+ };
254
+ for (const conn of this.connections.values()) {
255
+ if (conn.channel === channel || conn.channel === undefined) {
256
+ try {
257
+ conn.socket.send(JSON.stringify(data));
258
+ sent++;
259
+ }
260
+ catch (err) {
261
+ console.error(`[Gateway] Failed to send to ${conn.id}:`, err);
262
+ }
263
+ }
264
+ }
265
+ return sent;
266
+ }
267
+ sendToConnection(connectionId, message) {
268
+ const conn = this.connections.get(connectionId);
269
+ if (!conn)
270
+ return false;
271
+ try {
272
+ conn.socket.send(JSON.stringify(message));
273
+ return true;
274
+ }
275
+ catch (err) {
276
+ console.error(`[Gateway] Failed to send to ${connectionId}:`, err);
277
+ return false;
278
+ }
279
+ }
280
+ startHeartbeat() {
281
+ this.heartbeatTimer = setInterval(() => {
282
+ const now = Date.now();
283
+ for (const [id, conn] of this.connections) {
284
+ const lastPing = conn.lastPing.getTime();
285
+ if (now - lastPing > this.config.heartbeatInterval * 2) {
286
+ console.log(`[Gateway] Connection stale, closing: ${id}`);
287
+ try {
288
+ conn.socket.close();
289
+ }
290
+ catch { }
291
+ this.connections.delete(id);
292
+ continue;
293
+ }
294
+ this.sendToConnection(id, {
295
+ type: "ping",
296
+ id: `ping-${Date.now()}`,
297
+ payload: { time: now },
298
+ timestamp: now,
299
+ });
300
+ }
301
+ }, this.config.heartbeatInterval);
302
+ }
303
+ getConnections() {
304
+ return Array.from(this.connections.values());
305
+ }
306
+ getConnectionCount() {
307
+ return this.connections.size;
308
+ }
309
+ isRunning() {
310
+ return this.running;
311
+ }
312
+ }
313
+ let instance = null;
314
+ export function getRealGateway() {
315
+ if (!instance) {
316
+ instance = new RealGatewayServer();
317
+ }
318
+ return instance;
319
+ }
320
+ export function resetRealGateway() {
321
+ instance?.stop();
322
+ instance = null;
323
+ }
324
+ export default RealGatewayServer;
325
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * WebSocket Gateway Server - v0.2.0
3
+ *
4
+ * WebSocket server for external connections.
5
+ * Part of Phase 5.3: Gateway Architecture
6
+ */
7
+ import { EventEmitter } from "events";
8
+ class GatewayServer extends EventEmitter {
9
+ connections = new Map();
10
+ running = false;
11
+ /**
12
+ * Start gateway server
13
+ */
14
+ start() {
15
+ if (this.running)
16
+ return;
17
+ this.running = true;
18
+ console.log("[Gateway] Server started on port 7777");
19
+ this.emit("started");
20
+ // Simulate accepting connections
21
+ setTimeout(() => {
22
+ this.emit("ready");
23
+ }, 100);
24
+ }
25
+ /**
26
+ * Stop gateway server
27
+ */
28
+ stop() {
29
+ this.running = false;
30
+ this.connections.clear();
31
+ console.log("[Gateway] Server stopped");
32
+ this.emit("stopped");
33
+ }
34
+ /**
35
+ * Register a connection
36
+ */
37
+ registerConnection(conn) {
38
+ const id = `conn-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
39
+ const connection = { ...conn, id };
40
+ this.connections.set(id, connection);
41
+ this.emit("connected", connection);
42
+ return id;
43
+ }
44
+ /**
45
+ * Remove connection
46
+ */
47
+ removeConnection(id) {
48
+ const conn = this.connections.get(id);
49
+ if (conn) {
50
+ this.connections.delete(id);
51
+ this.emit("disconnected", conn);
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ /**
57
+ * Broadcast message to all connections
58
+ */
59
+ broadcast(message, filter) {
60
+ for (const [id, conn] of this.connections) {
61
+ if (filter && !filter(conn))
62
+ continue;
63
+ this.emit("message", { id, message, type: conn.type });
64
+ }
65
+ }
66
+ /**
67
+ * Send to specific connection
68
+ */
69
+ sendTo(connectionId, message) {
70
+ const conn = this.connections.get(connectionId);
71
+ if (!conn)
72
+ return false;
73
+ this.emit("message", { id: connectionId, message, type: conn.type });
74
+ return true;
75
+ }
76
+ /**
77
+ * Send to channel
78
+ */
79
+ sendToChannel(channel, message) {
80
+ let sent = 0;
81
+ for (const [id, conn] of this.connections) {
82
+ if (conn.channel === channel) {
83
+ this.emit("message", { id, message, type: conn.type });
84
+ sent++;
85
+ }
86
+ }
87
+ return sent;
88
+ }
89
+ /**
90
+ * Get connection count
91
+ */
92
+ getConnectionCount() {
93
+ return this.connections.size;
94
+ }
95
+ /**
96
+ * Get connections by type
97
+ */
98
+ getConnectionsByType(type) {
99
+ return Array.from(this.connections.values()).filter((c) => c.type === type);
100
+ }
101
+ /**
102
+ * Get all connections
103
+ */
104
+ getConnections() {
105
+ return Array.from(this.connections.values());
106
+ }
107
+ }
108
+ // Singleton
109
+ let server = null;
110
+ export function getGatewayServer() {
111
+ if (!server) {
112
+ server = new GatewayServer();
113
+ }
114
+ return server;
115
+ }
116
+ export function resetGatewayServer() {
117
+ server = null;
118
+ }
119
+ /**
120
+ * Register Discord bot channel
121
+ */
122
+ export function registerDiscordChannel(channelId) {
123
+ const gateway = getGatewayServer();
124
+ return gateway.registerConnection({
125
+ type: "discord",
126
+ channel: channelId,
127
+ connected: true,
128
+ });
129
+ }
130
+ /**
131
+ * Register Telegram channel
132
+ */
133
+ export function registerTelegramChannel(channelId) {
134
+ const gateway = getGatewayServer();
135
+ return gateway.registerConnection({
136
+ type: "telegram",
137
+ channel: channelId,
138
+ connected: true,
139
+ });
140
+ }
141
+ export default getGatewayServer;
142
+ //# sourceMappingURL=websocket-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-server.js","sourceRoot":"","sources":["../../../src/gateway/websocket-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Heartbeat Check-in - v0.2.0
3
+ *
4
+ * Check-in prompts and idle detection.
5
+ */
6
+ export const CHECKIN_PROMPTS = {
7
+ morning: [
8
+ {
9
+ type: 'morning',
10
+ message: "Good morning! Ready to tackle today's challenges?",
11
+ emoji: '🌅',
12
+ actions: ['plan', 'review', 'ask'],
13
+ },
14
+ {
15
+ type: 'morning',
16
+ message: 'Morning! What are we working on today?',
17
+ emoji: '☕',
18
+ actions: ['list', 'prioritize', 'start'],
19
+ },
20
+ ],
21
+ evening: [
22
+ {
23
+ type: 'evening',
24
+ message: "Evening check-in! How did today's work go?",
25
+ emoji: '🌆',
26
+ actions: ['review', 'summarize', 'prepare'],
27
+ },
28
+ {
29
+ type: 'evening',
30
+ message: 'Time to wrap up! Want to review what we accomplished?',
31
+ emoji: '📝',
32
+ actions: ['summarize', 'commit', 'reflect'],
33
+ },
34
+ ],
35
+ periodic: [
36
+ {
37
+ type: 'periodic',
38
+ message: 'Quick check-in! How are things going?',
39
+ emoji: '⏰',
40
+ actions: ['continue', 'pause', 'review'],
41
+ },
42
+ ],
43
+ idle: [
44
+ {
45
+ type: 'idle',
46
+ message: "You've been idle for a while. Need anything?",
47
+ emoji: '💤',
48
+ actions: ['resume', 'new_task', 'status'],
49
+ },
50
+ {
51
+ type: 'idle',
52
+ message: 'Welcome back! where were we?',
53
+ emoji: '👋',
54
+ actions: ['context', 'continue', 'review'],
55
+ },
56
+ ],
57
+ nurture: [
58
+ {
59
+ type: 'nurture',
60
+ message: "How's your day going? Need any help?",
61
+ emoji: '🤗',
62
+ actions: ['help', 'chat', 'dismiss'],
63
+ },
64
+ {
65
+ type: 'nurture',
66
+ message: 'Just checking in! Anything on your mind?',
67
+ emoji: '💭',
68
+ actions: ['brainstorm', 'vent', 'dismiss'],
69
+ },
70
+ {
71
+ type: 'nurture',
72
+ message: "Want to review today's progress?",
73
+ emoji: '📊',
74
+ actions: ['review', 'ignore', 'schedule'],
75
+ },
76
+ ],
77
+ };
78
+ /**
79
+ * Get a random check-in prompt for the type
80
+ */
81
+ export function getCheckInPrompt(type) {
82
+ const prompts = CHECKIN_PROMPTS[type];
83
+ return prompts[Math.floor(Math.random() * prompts.length)];
84
+ }
85
+ /**
86
+ * Format check-in message with emoji
87
+ */
88
+ export function formatCheckInMessage(prompt) {
89
+ return `${prompt.emoji} ${prompt.message}`;
90
+ }
91
+ const ACTION_DEFINITIONS = {
92
+ plan: { id: 'plan', label: 'Plan', description: 'Create a plan for today' },
93
+ review: { id: 'review', label: 'Review', description: 'Review recent work' },
94
+ ask: { id: 'ask', label: 'Ask', description: 'Ask a question' },
95
+ list: { id: 'list', label: 'List Tasks', description: 'Show task list' },
96
+ prioritize: { id: 'prioritize', label: 'Prioritize', description: 'Prioritize tasks' },
97
+ start: { id: 'start', label: 'Start', description: 'Start working' },
98
+ summarize: { id: 'summarize', label: 'Summarize', description: 'Summarize work' },
99
+ commit: { id: 'commit', label: 'Commit', description: 'Commit changes' },
100
+ reflect: { id: 'reflect', label: 'Reflect', description: 'Reflect on the day' },
101
+ continue: { id: 'continue', label: 'Continue', description: 'Continue current work' },
102
+ pause: { id: 'pause', label: 'Pause', description: 'Take a break' },
103
+ resume: { id: 'resume', label: 'Resume', description: 'Resume work' },
104
+ new_task: { id: 'new_task', label: 'New Task', description: 'Start new task' },
105
+ status: { id: 'status', label: 'Status', description: 'Show current status' },
106
+ context: { id: 'context', label: 'Context', description: 'Review context' },
107
+ help: { id: 'help', label: 'Help', description: 'Get help' },
108
+ chat: { id: 'chat', label: 'Chat', description: 'Just chat' },
109
+ dismiss: { id: 'dismiss', label: 'Dismiss', description: 'Dismiss check-in' },
110
+ brainstorm: { id: 'brainstorm', label: 'Brainstorm', description: 'Brainstorm ideas' },
111
+ vent: { id: 'vent', label: 'Vent', description: 'Discuss concerns' },
112
+ ignore: { id: 'ignore', label: 'Ignore', description: 'Ignore for now' },
113
+ schedule: { id: 'schedule', label: 'Schedule', description: 'Schedule for later' },
114
+ };
115
+ /**
116
+ * Build check-in response with actions
117
+ */
118
+ export function buildCheckInResponse(type, customMessage, payload) {
119
+ const prompt = getCheckInPrompt(type);
120
+ const message = customMessage || formatCheckInMessage(prompt);
121
+ // Add idle time to message if provided
122
+ if (payload?.idleMinutes) {
123
+ message.concat(` (idle for ${payload.idleMinutes} minutes)`);
124
+ }
125
+ const actions = prompt.actions
126
+ .map((id) => ACTION_DEFINITIONS[id])
127
+ .filter((action) => action !== undefined);
128
+ return {
129
+ type,
130
+ message,
131
+ actions,
132
+ };
133
+ }
134
+ /**
135
+ * Handle check-in action
136
+ */
137
+ export function handleCheckInAction(actionId, _type) {
138
+ switch (actionId) {
139
+ case 'dismiss':
140
+ return { message: 'Check-in dismissed. See you later!' };
141
+ case 'plan':
142
+ return {
143
+ message: "Let's plan! What would you like to work on?",
144
+ suggestedAction: 'switch_to_plan_mode',
145
+ };
146
+ case 'review':
147
+ return {
148
+ message: 'Reviewing recent work...',
149
+ suggestedAction: 'show_recent_changes',
150
+ };
151
+ case 'continue':
152
+ return { message: 'Continuing from where we left off...' };
153
+ case 'help':
154
+ return { message: "I'm here to help! What do you need?" };
155
+ case 'brainstorm':
156
+ return { message: "Let's brainstorm! What's on your mind?", suggestedAction: 'brainstorm' };
157
+ case 'vent':
158
+ return { message: "I'm all ears. What's bothering you?", suggestedAction: 'just_listen' };
159
+ default:
160
+ return { message: `Executing ${actionId}...` };
161
+ }
162
+ }
163
+ /**
164
+ * Detect if user is idle based on last interaction
165
+ */
166
+ export function detectIdle(lastInteraction, thresholdMinutes) {
167
+ const idleMs = Date.now() - lastInteraction.getTime();
168
+ const idleMinutes = Math.floor(idleMs / 60000);
169
+ return {
170
+ isIdle: idleMinutes >= thresholdMinutes,
171
+ idleMinutes,
172
+ };
173
+ }
174
+ /**
175
+ * Get time-appropriate greeting
176
+ */
177
+ export function getGreeting() {
178
+ const hour = new Date().getHours();
179
+ if (hour < 12)
180
+ return 'Good morning';
181
+ if (hour < 18)
182
+ return 'Good afternoon';
183
+ return 'Good evening';
184
+ }
185
+ //# sourceMappingURL=checkin.js.map