daemora 1.0.3 → 1.0.5

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 (121) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +69 -19
  3. package/SOUL.md +25 -24
  4. package/daemora-ui/README.md +11 -0
  5. package/package.json +12 -2
  6. package/skills/api-development.md +35 -0
  7. package/skills/artifacts-builder/SKILL.md +74 -0
  8. package/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  9. package/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
  10. package/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  11. package/skills/brand-guidelines.md +73 -0
  12. package/skills/browser.md +77 -0
  13. package/skills/changelog-generator.md +104 -0
  14. package/skills/coding.md +26 -10
  15. package/skills/content-research-writer.md +538 -0
  16. package/skills/data-analysis.md +27 -0
  17. package/skills/debugging.md +33 -0
  18. package/skills/devops.md +37 -0
  19. package/skills/document-docx.md +197 -0
  20. package/skills/document-pdf.md +294 -0
  21. package/skills/document-pptx.md +484 -0
  22. package/skills/document-xlsx.md +289 -0
  23. package/skills/domain-name-brainstormer.md +212 -0
  24. package/skills/file-organizer.md +433 -0
  25. package/skills/frontend-design.md +42 -0
  26. package/skills/image-enhancer.md +99 -0
  27. package/skills/invoice-organizer.md +446 -0
  28. package/skills/lead-research-assistant.md +199 -0
  29. package/skills/mcp-builder/SKILL.md +328 -0
  30. package/skills/mcp-builder/reference/evaluation.md +602 -0
  31. package/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  32. package/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  33. package/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  34. package/skills/mcp-builder/scripts/connections.py +151 -0
  35. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  36. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  37. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  38. package/skills/meeting-insights-analyzer.md +327 -0
  39. package/skills/orchestration.md +93 -0
  40. package/skills/raffle-winner-picker.md +159 -0
  41. package/skills/slack-gif-creator/SKILL.md +646 -0
  42. package/skills/slack-gif-creator/core/color_palettes.py +302 -0
  43. package/skills/slack-gif-creator/core/easing.py +230 -0
  44. package/skills/slack-gif-creator/core/frame_composer.py +469 -0
  45. package/skills/slack-gif-creator/core/gif_builder.py +246 -0
  46. package/skills/slack-gif-creator/core/typography.py +357 -0
  47. package/skills/slack-gif-creator/core/validators.py +264 -0
  48. package/skills/slack-gif-creator/core/visual_effects.py +494 -0
  49. package/skills/slack-gif-creator/requirements.txt +4 -0
  50. package/skills/slack-gif-creator/templates/bounce.py +106 -0
  51. package/skills/slack-gif-creator/templates/explode.py +331 -0
  52. package/skills/slack-gif-creator/templates/fade.py +329 -0
  53. package/skills/slack-gif-creator/templates/flip.py +291 -0
  54. package/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
  55. package/skills/slack-gif-creator/templates/morph.py +329 -0
  56. package/skills/slack-gif-creator/templates/move.py +293 -0
  57. package/skills/slack-gif-creator/templates/pulse.py +268 -0
  58. package/skills/slack-gif-creator/templates/shake.py +127 -0
  59. package/skills/slack-gif-creator/templates/slide.py +291 -0
  60. package/skills/slack-gif-creator/templates/spin.py +269 -0
  61. package/skills/slack-gif-creator/templates/wiggle.py +300 -0
  62. package/skills/slack-gif-creator/templates/zoom.py +312 -0
  63. package/skills/system-admin.md +44 -0
  64. package/skills/tailored-resume-generator.md +345 -0
  65. package/skills/theme-factory/SKILL.md +59 -0
  66. package/skills/theme-factory/theme-showcase.pdf +0 -0
  67. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  68. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  69. package/skills/theme-factory/themes/desert-rose.md +19 -0
  70. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  71. package/skills/theme-factory/themes/golden-hour.md +19 -0
  72. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  73. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  74. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  75. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  76. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  77. package/skills/video-downloader.md +99 -0
  78. package/skills/web-development.md +32 -0
  79. package/skills/webapp-testing/SKILL.md +96 -0
  80. package/skills/webapp-testing/examples/console_logging.py +35 -0
  81. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  82. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  83. package/skills/webapp-testing/scripts/with_server.py +106 -0
  84. package/src/agents/SubAgentManager.js +57 -12
  85. package/src/api/openai-compat.js +212 -0
  86. package/src/channels/TelegramChannel.js +5 -2
  87. package/src/channels/index.js +7 -10
  88. package/src/cli.js +129 -50
  89. package/src/config/agentProfiles.js +1 -0
  90. package/src/config/default.js +10 -0
  91. package/src/config/models.js +317 -71
  92. package/src/config/permissions.js +12 -0
  93. package/src/core/AgentLoop.js +70 -50
  94. package/src/core/Compaction.js +84 -2
  95. package/src/core/MessageQueue.js +90 -0
  96. package/src/core/Task.js +13 -0
  97. package/src/core/TaskQueue.js +1 -1
  98. package/src/core/TaskRunner.js +80 -5
  99. package/src/index.js +328 -48
  100. package/src/mcp/MCPAgentRunner.js +48 -11
  101. package/src/mcp/MCPManager.js +40 -2
  102. package/src/models/ModelRouter.js +67 -1
  103. package/src/safety/DockerSandbox.js +212 -0
  104. package/src/safety/ExecApproval.js +118 -0
  105. package/src/scheduler/Heartbeat.js +56 -21
  106. package/src/services/cleanup.js +106 -0
  107. package/src/services/sessions.js +39 -1
  108. package/src/setup/wizard.js +75 -4
  109. package/src/skills/SkillLoader.js +104 -17
  110. package/src/storage/TaskStore.js +19 -1
  111. package/src/systemPrompt.js +171 -328
  112. package/src/tools/browserAutomation.js +615 -104
  113. package/src/tools/executeCommand.js +19 -1
  114. package/src/tools/index.js +6 -0
  115. package/src/tools/manageAgents.js +55 -4
  116. package/src/tools/replyWithFile.js +62 -0
  117. package/src/tools/screenCapture.js +12 -1
  118. package/src/tools/taskManager.js +164 -0
  119. package/src/tools/useMCP.js +3 -1
  120. package/src/utils/Embeddings.js +157 -10
  121. package/src/webhooks/WebhookHandler.js +107 -0
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Webhook Handler — trigger agent runs via HTTP.
3
+ *
4
+ * POST /hooks/agent — full agent run (queued, returns taskId)
5
+ * POST /hooks/wake — lightweight heartbeat-style trigger
6
+ *
7
+ * Auth: Bearer token from WEBHOOK_TOKEN env var. Rejects if not set.
8
+ * Rate limit: 30 requests/minute per token.
9
+ */
10
+
11
+ import { Router } from "express";
12
+ import taskQueue from "../core/TaskQueue.js";
13
+
14
+ const router = Router();
15
+
16
+ // Rate limiting state
17
+ const _rateLimits = new Map(); // token → { count, resetAt }
18
+ const RATE_LIMIT = 30;
19
+ const RATE_WINDOW = 60_000; // 1 minute
20
+
21
+ function checkAuth(req, res) {
22
+ const token = process.env.WEBHOOK_TOKEN;
23
+ if (!token) {
24
+ res.status(503).json({ error: "Webhooks not configured. Set WEBHOOK_TOKEN env var." });
25
+ return false;
26
+ }
27
+
28
+ const authHeader = req.headers.authorization;
29
+ if (!authHeader || !authHeader.startsWith("Bearer ") || authHeader.slice(7) !== token) {
30
+ res.status(401).json({ error: "Invalid or missing Bearer token." });
31
+ return false;
32
+ }
33
+
34
+ // Rate limit check
35
+ const now = Date.now();
36
+ let bucket = _rateLimits.get(token);
37
+ if (!bucket || now > bucket.resetAt) {
38
+ bucket = { count: 0, resetAt: now + RATE_WINDOW };
39
+ _rateLimits.set(token, bucket);
40
+ }
41
+ bucket.count++;
42
+ if (bucket.count > RATE_LIMIT) {
43
+ res.status(429).json({ error: `Rate limit exceeded (${RATE_LIMIT}/min). Try again later.` });
44
+ return false;
45
+ }
46
+
47
+ return true;
48
+ }
49
+
50
+ /**
51
+ * POST /hooks/agent — trigger a full agent run.
52
+ * Body: { message: string, sessionId?: string, model?: string, timeoutSeconds?: number }
53
+ * Returns: { taskId, status: "queued" }
54
+ */
55
+ router.post("/agent", (req, res) => {
56
+ if (!checkAuth(req, res)) return;
57
+
58
+ const { message, sessionId, model, timeoutSeconds } = req.body || {};
59
+ if (!message) {
60
+ return res.status(400).json({ error: "message is required" });
61
+ }
62
+
63
+ const task = taskQueue.enqueue({
64
+ input: message,
65
+ channel: "webhook",
66
+ sessionId: sessionId || `webhook-${Date.now()}`,
67
+ model: model || null,
68
+ priority: 5,
69
+ type: "task",
70
+ timeout: timeoutSeconds ? timeoutSeconds * 1000 : undefined,
71
+ });
72
+
73
+ res.status(202).json({
74
+ taskId: task.id,
75
+ status: "queued",
76
+ sessionId: task.sessionId,
77
+ });
78
+ });
79
+
80
+ /**
81
+ * POST /hooks/wake — lightweight trigger (heartbeat-style).
82
+ * Body: { text: string }
83
+ * Returns: { taskId, status: "queued" }
84
+ */
85
+ router.post("/wake", (req, res) => {
86
+ if (!checkAuth(req, res)) return;
87
+
88
+ const { text } = req.body || {};
89
+ if (!text) {
90
+ return res.status(400).json({ error: "text is required" });
91
+ }
92
+
93
+ const task = taskQueue.enqueue({
94
+ input: `[Webhook wake event]: ${text}`,
95
+ channel: "webhook",
96
+ sessionId: `webhook-wake-${Date.now()}`,
97
+ priority: 3,
98
+ type: "task",
99
+ });
100
+
101
+ res.status(202).json({
102
+ taskId: task.id,
103
+ status: "queued",
104
+ });
105
+ });
106
+
107
+ export default router;