@fickydev/pigent 0.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 (40) hide show
  1. package/.env.example +22 -0
  2. package/AGENTS.md +242 -0
  3. package/CHANGELOG.md +35 -0
  4. package/LICENSE +21 -0
  5. package/PLAN.md +369 -0
  6. package/README.md +369 -0
  7. package/TODO.md +183 -0
  8. package/agents/coder/SYSTEM.md +3 -0
  9. package/agents/coder/agent.yaml +20 -0
  10. package/drizzle/migrations/0000_great_daredevil.sql +78 -0
  11. package/drizzle/migrations/meta/0000_snapshot.json +505 -0
  12. package/drizzle/migrations/meta/_journal.json +13 -0
  13. package/drizzle.config.ts +13 -0
  14. package/package.json +66 -0
  15. package/pigent.yaml +12 -0
  16. package/profiles/software-engineer.yaml +11 -0
  17. package/src/agents/AgentRunner.ts +112 -0
  18. package/src/agents/BotCommandHandler.ts +65 -0
  19. package/src/agents/MessageRouter.ts +106 -0
  20. package/src/channels/telegram/TelegramApi.ts +67 -0
  21. package/src/channels/telegram/TelegramPollingAdapter.ts +123 -0
  22. package/src/channels/telegram/types.ts +50 -0
  23. package/src/channels/types.ts +29 -0
  24. package/src/cli/run.ts +77 -0
  25. package/src/cli/setup.ts +261 -0
  26. package/src/config/loadConfig.ts +115 -0
  27. package/src/config/schemas.ts +92 -0
  28. package/src/daemon/AgentDaemon.ts +161 -0
  29. package/src/db/client.ts +23 -0
  30. package/src/db/repositories/AgentRepository.ts +45 -0
  31. package/src/db/repositories/MessageRepository.ts +45 -0
  32. package/src/db/repositories/RuntimeKvRepository.ts +27 -0
  33. package/src/db/repositories/SessionRepository.ts +65 -0
  34. package/src/db/repositories/TelegramRepository.ts +98 -0
  35. package/src/db/repositories/index.ts +18 -0
  36. package/src/db/schema.ts +106 -0
  37. package/src/logging/logger.ts +45 -0
  38. package/src/main.ts +37 -0
  39. package/src/pi/PiAgentRunner.ts +73 -0
  40. package/tsconfig.json +17 -0
@@ -0,0 +1,505 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "e22a939b-7de8-4f8f-97d8-f01f58bd0f25",
5
+ "prevId": "00000000-0000-0000-0000-000000000000",
6
+ "tables": {
7
+ "agent_sessions": {
8
+ "name": "agent_sessions",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "text",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "agent_id": {
18
+ "name": "agent_id",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "channel": {
25
+ "name": "channel",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "chat_id": {
32
+ "name": "chat_id",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ },
38
+ "thread_id": {
39
+ "name": "thread_id",
40
+ "type": "text",
41
+ "primaryKey": false,
42
+ "notNull": false,
43
+ "autoincrement": false
44
+ },
45
+ "user_id": {
46
+ "name": "user_id",
47
+ "type": "text",
48
+ "primaryKey": false,
49
+ "notNull": false,
50
+ "autoincrement": false
51
+ },
52
+ "pi_session_id": {
53
+ "name": "pi_session_id",
54
+ "type": "text",
55
+ "primaryKey": false,
56
+ "notNull": false,
57
+ "autoincrement": false
58
+ },
59
+ "instructions_hash": {
60
+ "name": "instructions_hash",
61
+ "type": "text",
62
+ "primaryKey": false,
63
+ "notNull": false,
64
+ "autoincrement": false
65
+ },
66
+ "created_at": {
67
+ "name": "created_at",
68
+ "type": "integer",
69
+ "primaryKey": false,
70
+ "notNull": true,
71
+ "autoincrement": false
72
+ },
73
+ "updated_at": {
74
+ "name": "updated_at",
75
+ "type": "integer",
76
+ "primaryKey": false,
77
+ "notNull": true,
78
+ "autoincrement": false
79
+ }
80
+ },
81
+ "indexes": {
82
+ "agent_sessions_key_unique": {
83
+ "name": "agent_sessions_key_unique",
84
+ "columns": [
85
+ "agent_id",
86
+ "channel",
87
+ "chat_id",
88
+ "thread_id"
89
+ ],
90
+ "isUnique": true
91
+ }
92
+ },
93
+ "foreignKeys": {},
94
+ "compositePrimaryKeys": {},
95
+ "uniqueConstraints": {},
96
+ "checkConstraints": {}
97
+ },
98
+ "agents": {
99
+ "name": "agents",
100
+ "columns": {
101
+ "id": {
102
+ "name": "id",
103
+ "type": "text",
104
+ "primaryKey": true,
105
+ "notNull": true,
106
+ "autoincrement": false
107
+ },
108
+ "name": {
109
+ "name": "name",
110
+ "type": "text",
111
+ "primaryKey": false,
112
+ "notNull": true,
113
+ "autoincrement": false
114
+ },
115
+ "profile": {
116
+ "name": "profile",
117
+ "type": "text",
118
+ "primaryKey": false,
119
+ "notNull": true,
120
+ "autoincrement": false
121
+ },
122
+ "workspace": {
123
+ "name": "workspace",
124
+ "type": "text",
125
+ "primaryKey": false,
126
+ "notNull": true,
127
+ "autoincrement": false
128
+ },
129
+ "config_json": {
130
+ "name": "config_json",
131
+ "type": "text",
132
+ "primaryKey": false,
133
+ "notNull": true,
134
+ "autoincrement": false
135
+ },
136
+ "system_prompt": {
137
+ "name": "system_prompt",
138
+ "type": "text",
139
+ "primaryKey": false,
140
+ "notNull": true,
141
+ "autoincrement": false,
142
+ "default": "''"
143
+ },
144
+ "created_at": {
145
+ "name": "created_at",
146
+ "type": "integer",
147
+ "primaryKey": false,
148
+ "notNull": true,
149
+ "autoincrement": false
150
+ },
151
+ "updated_at": {
152
+ "name": "updated_at",
153
+ "type": "integer",
154
+ "primaryKey": false,
155
+ "notNull": true,
156
+ "autoincrement": false
157
+ }
158
+ },
159
+ "indexes": {},
160
+ "foreignKeys": {},
161
+ "compositePrimaryKeys": {},
162
+ "uniqueConstraints": {},
163
+ "checkConstraints": {}
164
+ },
165
+ "heartbeats": {
166
+ "name": "heartbeats",
167
+ "columns": {
168
+ "id": {
169
+ "name": "id",
170
+ "type": "text",
171
+ "primaryKey": true,
172
+ "notNull": true,
173
+ "autoincrement": false
174
+ },
175
+ "agent_id": {
176
+ "name": "agent_id",
177
+ "type": "text",
178
+ "primaryKey": false,
179
+ "notNull": true,
180
+ "autoincrement": false
181
+ },
182
+ "session_id": {
183
+ "name": "session_id",
184
+ "type": "text",
185
+ "primaryKey": false,
186
+ "notNull": false,
187
+ "autoincrement": false
188
+ },
189
+ "status": {
190
+ "name": "status",
191
+ "type": "text",
192
+ "primaryKey": false,
193
+ "notNull": true,
194
+ "autoincrement": false
195
+ },
196
+ "prompt": {
197
+ "name": "prompt",
198
+ "type": "text",
199
+ "primaryKey": false,
200
+ "notNull": true,
201
+ "autoincrement": false
202
+ },
203
+ "result": {
204
+ "name": "result",
205
+ "type": "text",
206
+ "primaryKey": false,
207
+ "notNull": false,
208
+ "autoincrement": false
209
+ },
210
+ "error": {
211
+ "name": "error",
212
+ "type": "text",
213
+ "primaryKey": false,
214
+ "notNull": false,
215
+ "autoincrement": false
216
+ },
217
+ "started_at": {
218
+ "name": "started_at",
219
+ "type": "integer",
220
+ "primaryKey": false,
221
+ "notNull": false,
222
+ "autoincrement": false
223
+ },
224
+ "finished_at": {
225
+ "name": "finished_at",
226
+ "type": "integer",
227
+ "primaryKey": false,
228
+ "notNull": false,
229
+ "autoincrement": false
230
+ },
231
+ "created_at": {
232
+ "name": "created_at",
233
+ "type": "integer",
234
+ "primaryKey": false,
235
+ "notNull": true,
236
+ "autoincrement": false
237
+ }
238
+ },
239
+ "indexes": {},
240
+ "foreignKeys": {},
241
+ "compositePrimaryKeys": {},
242
+ "uniqueConstraints": {},
243
+ "checkConstraints": {}
244
+ },
245
+ "messages": {
246
+ "name": "messages",
247
+ "columns": {
248
+ "id": {
249
+ "name": "id",
250
+ "type": "text",
251
+ "primaryKey": true,
252
+ "notNull": true,
253
+ "autoincrement": false
254
+ },
255
+ "agent_id": {
256
+ "name": "agent_id",
257
+ "type": "text",
258
+ "primaryKey": false,
259
+ "notNull": true,
260
+ "autoincrement": false
261
+ },
262
+ "session_id": {
263
+ "name": "session_id",
264
+ "type": "text",
265
+ "primaryKey": false,
266
+ "notNull": false,
267
+ "autoincrement": false
268
+ },
269
+ "channel": {
270
+ "name": "channel",
271
+ "type": "text",
272
+ "primaryKey": false,
273
+ "notNull": true,
274
+ "autoincrement": false
275
+ },
276
+ "direction": {
277
+ "name": "direction",
278
+ "type": "text",
279
+ "primaryKey": false,
280
+ "notNull": true,
281
+ "autoincrement": false
282
+ },
283
+ "sender_id": {
284
+ "name": "sender_id",
285
+ "type": "text",
286
+ "primaryKey": false,
287
+ "notNull": false,
288
+ "autoincrement": false
289
+ },
290
+ "chat_id": {
291
+ "name": "chat_id",
292
+ "type": "text",
293
+ "primaryKey": false,
294
+ "notNull": false,
295
+ "autoincrement": false
296
+ },
297
+ "thread_id": {
298
+ "name": "thread_id",
299
+ "type": "text",
300
+ "primaryKey": false,
301
+ "notNull": false,
302
+ "autoincrement": false
303
+ },
304
+ "content": {
305
+ "name": "content",
306
+ "type": "text",
307
+ "primaryKey": false,
308
+ "notNull": true,
309
+ "autoincrement": false
310
+ },
311
+ "raw_json": {
312
+ "name": "raw_json",
313
+ "type": "text",
314
+ "primaryKey": false,
315
+ "notNull": false,
316
+ "autoincrement": false
317
+ },
318
+ "created_at": {
319
+ "name": "created_at",
320
+ "type": "integer",
321
+ "primaryKey": false,
322
+ "notNull": true,
323
+ "autoincrement": false
324
+ }
325
+ },
326
+ "indexes": {},
327
+ "foreignKeys": {},
328
+ "compositePrimaryKeys": {},
329
+ "uniqueConstraints": {},
330
+ "checkConstraints": {}
331
+ },
332
+ "runtime_kv": {
333
+ "name": "runtime_kv",
334
+ "columns": {
335
+ "key": {
336
+ "name": "key",
337
+ "type": "text",
338
+ "primaryKey": true,
339
+ "notNull": true,
340
+ "autoincrement": false
341
+ },
342
+ "value": {
343
+ "name": "value",
344
+ "type": "text",
345
+ "primaryKey": false,
346
+ "notNull": true,
347
+ "autoincrement": false
348
+ },
349
+ "updated_at": {
350
+ "name": "updated_at",
351
+ "type": "integer",
352
+ "primaryKey": false,
353
+ "notNull": true,
354
+ "autoincrement": false
355
+ }
356
+ },
357
+ "indexes": {},
358
+ "foreignKeys": {},
359
+ "compositePrimaryKeys": {},
360
+ "uniqueConstraints": {},
361
+ "checkConstraints": {}
362
+ },
363
+ "telegram_chat_agents": {
364
+ "name": "telegram_chat_agents",
365
+ "columns": {
366
+ "id": {
367
+ "name": "id",
368
+ "type": "text",
369
+ "primaryKey": true,
370
+ "notNull": true,
371
+ "autoincrement": false
372
+ },
373
+ "chat_id": {
374
+ "name": "chat_id",
375
+ "type": "text",
376
+ "primaryKey": false,
377
+ "notNull": true,
378
+ "autoincrement": false
379
+ },
380
+ "agent_id": {
381
+ "name": "agent_id",
382
+ "type": "text",
383
+ "primaryKey": false,
384
+ "notNull": true,
385
+ "autoincrement": false
386
+ },
387
+ "enabled": {
388
+ "name": "enabled",
389
+ "type": "integer",
390
+ "primaryKey": false,
391
+ "notNull": true,
392
+ "autoincrement": false,
393
+ "default": true
394
+ },
395
+ "custom_instructions": {
396
+ "name": "custom_instructions",
397
+ "type": "text",
398
+ "primaryKey": false,
399
+ "notNull": true,
400
+ "autoincrement": false,
401
+ "default": "''"
402
+ },
403
+ "created_at": {
404
+ "name": "created_at",
405
+ "type": "integer",
406
+ "primaryKey": false,
407
+ "notNull": true,
408
+ "autoincrement": false
409
+ },
410
+ "updated_at": {
411
+ "name": "updated_at",
412
+ "type": "integer",
413
+ "primaryKey": false,
414
+ "notNull": true,
415
+ "autoincrement": false
416
+ }
417
+ },
418
+ "indexes": {
419
+ "telegram_chat_agents_chat_agent_unique": {
420
+ "name": "telegram_chat_agents_chat_agent_unique",
421
+ "columns": [
422
+ "chat_id",
423
+ "agent_id"
424
+ ],
425
+ "isUnique": true
426
+ }
427
+ },
428
+ "foreignKeys": {},
429
+ "compositePrimaryKeys": {},
430
+ "uniqueConstraints": {},
431
+ "checkConstraints": {}
432
+ },
433
+ "telegram_chats": {
434
+ "name": "telegram_chats",
435
+ "columns": {
436
+ "chat_id": {
437
+ "name": "chat_id",
438
+ "type": "text",
439
+ "primaryKey": true,
440
+ "notNull": true,
441
+ "autoincrement": false
442
+ },
443
+ "title": {
444
+ "name": "title",
445
+ "type": "text",
446
+ "primaryKey": false,
447
+ "notNull": false,
448
+ "autoincrement": false
449
+ },
450
+ "default_agent_id": {
451
+ "name": "default_agent_id",
452
+ "type": "text",
453
+ "primaryKey": false,
454
+ "notNull": false,
455
+ "autoincrement": false
456
+ },
457
+ "instructions": {
458
+ "name": "instructions",
459
+ "type": "text",
460
+ "primaryKey": false,
461
+ "notNull": true,
462
+ "autoincrement": false,
463
+ "default": "''"
464
+ },
465
+ "enabled": {
466
+ "name": "enabled",
467
+ "type": "integer",
468
+ "primaryKey": false,
469
+ "notNull": true,
470
+ "autoincrement": false,
471
+ "default": true
472
+ },
473
+ "created_at": {
474
+ "name": "created_at",
475
+ "type": "integer",
476
+ "primaryKey": false,
477
+ "notNull": true,
478
+ "autoincrement": false
479
+ },
480
+ "updated_at": {
481
+ "name": "updated_at",
482
+ "type": "integer",
483
+ "primaryKey": false,
484
+ "notNull": true,
485
+ "autoincrement": false
486
+ }
487
+ },
488
+ "indexes": {},
489
+ "foreignKeys": {},
490
+ "compositePrimaryKeys": {},
491
+ "uniqueConstraints": {},
492
+ "checkConstraints": {}
493
+ }
494
+ },
495
+ "views": {},
496
+ "enums": {},
497
+ "_meta": {
498
+ "schemas": {},
499
+ "tables": {},
500
+ "columns": {}
501
+ },
502
+ "internal": {
503
+ "indexes": {}
504
+ }
505
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1779047084019,
9
+ "tag": "0000_great_daredevil",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,13 @@
1
+ import { defineConfig } from "drizzle-kit";
2
+
3
+ const rawDatabaseUrl = process.env.DATABASE_URL ?? "file:./pigent.db";
4
+ const dbPath = rawDatabaseUrl.startsWith("file:") ? rawDatabaseUrl.slice("file:".length) : rawDatabaseUrl;
5
+
6
+ export default defineConfig({
7
+ schema: "./src/db/schema.ts",
8
+ out: "./drizzle/migrations",
9
+ dialect: "sqlite",
10
+ dbCredentials: {
11
+ url: dbPath,
12
+ },
13
+ });
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@fickydev/pigent",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Autonomous multi-agent daemon using Pi as core execution engine.",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Ficky-Dev/pigent.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Ficky-Dev/pigent/issues"
14
+ },
15
+ "homepage": "https://github.com/Ficky-Dev/pigent#readme",
16
+ "keywords": [
17
+ "ai",
18
+ "agent",
19
+ "telegram",
20
+ "pi",
21
+ "daemon"
22
+ ],
23
+ "files": [
24
+ "src",
25
+ "agents",
26
+ "profiles",
27
+ "drizzle",
28
+ "drizzle.config.ts",
29
+ "pigent.yaml",
30
+ ".env.example",
31
+ "README.md",
32
+ "PLAN.md",
33
+ "TODO.md",
34
+ "CHANGELOG.md",
35
+ "AGENTS.md",
36
+ "LICENSE",
37
+ "tsconfig.json"
38
+ ],
39
+ "bin": {
40
+ "pigent": "src/cli/run.ts"
41
+ },
42
+ "scripts": {
43
+ "setup": "bun run src/cli/setup.ts",
44
+ "run": "bun run src/cli/run.ts",
45
+ "dev": "bun run --watch src/main.ts",
46
+ "start": "bun run src/main.ts",
47
+ "typecheck": "tsc --noEmit",
48
+ "check": "bun run typecheck && bun test",
49
+ "db:generate": "drizzle-kit generate",
50
+ "db:migrate": "drizzle-kit migrate"
51
+ },
52
+ "dependencies": {
53
+ "@earendil-works/pi-coding-agent": "latest",
54
+ "drizzle-orm": "latest",
55
+ "nanoid": "latest",
56
+ "yaml": "latest",
57
+ "zod": "latest"
58
+ },
59
+ "devDependencies": {
60
+ "@types/better-sqlite3": "^7.6.13",
61
+ "@types/bun": "latest",
62
+ "better-sqlite3": "^12.10.0",
63
+ "drizzle-kit": "latest",
64
+ "typescript": "latest"
65
+ }
66
+ }
package/pigent.yaml ADDED
@@ -0,0 +1,12 @@
1
+ telegramChats: []
2
+
3
+ # Replace chatId with a real Telegram chat id to enable routing.
4
+ #
5
+ # telegramChats:
6
+ # - chatId: "123456"
7
+ # title: Example Private Chat
8
+ # defaultAgent: coder
9
+ # allowedAgents:
10
+ # - coder
11
+ # instructions: |
12
+ # Be concise.
@@ -0,0 +1,11 @@
1
+ id: software-engineer
2
+ name: Software Engineer
3
+ model: null
4
+ instructions: |
5
+ You are a pragmatic software engineering agent.
6
+ Prefer small safe diffs, clear tests, and stable behavior.
7
+ defaultSkills: []
8
+ defaultExtensions: []
9
+ permissions:
10
+ canRunShell: false
11
+ canEditFiles: false