@stackbilt/aegis-core 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 (148) hide show
  1. package/package.json +96 -0
  2. package/schema.sql +586 -0
  3. package/src/adapters/voice/cloudflare-agent.ts +34 -0
  4. package/src/auth.ts +124 -0
  5. package/src/bluesky.ts +464 -0
  6. package/src/claude-tools/content.ts +188 -0
  7. package/src/claude-tools/email.ts +69 -0
  8. package/src/claude-tools/github.ts +440 -0
  9. package/src/claude-tools/goals.ts +116 -0
  10. package/src/claude-tools/index.ts +353 -0
  11. package/src/claude-tools/web.ts +59 -0
  12. package/src/claude.ts +406 -0
  13. package/src/codebeast.ts +200 -0
  14. package/src/composite.ts +715 -0
  15. package/src/content/column.ts +80 -0
  16. package/src/content/hero-image.ts +47 -0
  17. package/src/content/index.ts +27 -0
  18. package/src/content/journal.ts +91 -0
  19. package/src/content/roundtable.ts +163 -0
  20. package/src/core.ts +309 -0
  21. package/src/dashboard.ts +620 -0
  22. package/src/decision-docs.ts +284 -0
  23. package/src/dispatch.ts +13 -0
  24. package/src/edge-env.ts +58 -0
  25. package/src/email.ts +850 -0
  26. package/src/exports.ts +156 -0
  27. package/src/github-projects.ts +312 -0
  28. package/src/github.ts +670 -0
  29. package/src/groq.ts +247 -0
  30. package/src/health-page.ts +578 -0
  31. package/src/index.ts +89 -0
  32. package/src/kernel/argus-actions.ts +397 -0
  33. package/src/kernel/argus-correlation.ts +639 -0
  34. package/src/kernel/board.ts +91 -0
  35. package/src/kernel/briefing.ts +177 -0
  36. package/src/kernel/classify-memory-topic.ts +166 -0
  37. package/src/kernel/cognition.ts +377 -0
  38. package/src/kernel/court-cards.ts +163 -0
  39. package/src/kernel/dispatch.ts +587 -0
  40. package/src/kernel/domain.ts +50 -0
  41. package/src/kernel/dynamic-tools.ts +322 -0
  42. package/src/kernel/executor-port.ts +45 -0
  43. package/src/kernel/executors/claude.ts +73 -0
  44. package/src/kernel/executors/direct.ts +237 -0
  45. package/src/kernel/executors/groq.ts +18 -0
  46. package/src/kernel/executors/index.ts +87 -0
  47. package/src/kernel/executors/tarotscript.ts +104 -0
  48. package/src/kernel/executors/workers-ai.ts +54 -0
  49. package/src/kernel/insight-cache.ts +76 -0
  50. package/src/kernel/memory/agenda.ts +200 -0
  51. package/src/kernel/memory/blocks.ts +188 -0
  52. package/src/kernel/memory/consolidation.ts +194 -0
  53. package/src/kernel/memory/episodic.ts +241 -0
  54. package/src/kernel/memory/goals.ts +156 -0
  55. package/src/kernel/memory/graph.ts +290 -0
  56. package/src/kernel/memory/index.ts +11 -0
  57. package/src/kernel/memory/insights.ts +316 -0
  58. package/src/kernel/memory/procedural.ts +467 -0
  59. package/src/kernel/memory/pruning.ts +67 -0
  60. package/src/kernel/memory/recall.ts +367 -0
  61. package/src/kernel/memory/semantic.ts +315 -0
  62. package/src/kernel/memory/synthesis.ts +161 -0
  63. package/src/kernel/memory-adapter.ts +369 -0
  64. package/src/kernel/memory-guardrails.ts +76 -0
  65. package/src/kernel/port.ts +23 -0
  66. package/src/kernel/resilience.ts +322 -0
  67. package/src/kernel/router.ts +471 -0
  68. package/src/kernel/scheduled/agent-dispatch.ts +252 -0
  69. package/src/kernel/scheduled/argus-analytics.ts +247 -0
  70. package/src/kernel/scheduled/argus-heartbeat.ts +320 -0
  71. package/src/kernel/scheduled/argus-notify.ts +348 -0
  72. package/src/kernel/scheduled/board-sync.ts +110 -0
  73. package/src/kernel/scheduled/ci-watcher.ts +125 -0
  74. package/src/kernel/scheduled/cognitive-metrics.ts +377 -0
  75. package/src/kernel/scheduled/consolidation.ts +229 -0
  76. package/src/kernel/scheduled/content-drip.ts +47 -0
  77. package/src/kernel/scheduled/content.ts +6 -0
  78. package/src/kernel/scheduled/conversation-facts.ts +204 -0
  79. package/src/kernel/scheduled/cost-report.ts +84 -0
  80. package/src/kernel/scheduled/curiosity.ts +219 -0
  81. package/src/kernel/scheduled/dev-activity.ts +44 -0
  82. package/src/kernel/scheduled/digest.ts +317 -0
  83. package/src/kernel/scheduled/dreaming/agenda-triage.ts +115 -0
  84. package/src/kernel/scheduled/dreaming/facts.ts +239 -0
  85. package/src/kernel/scheduled/dreaming/index.ts +8 -0
  86. package/src/kernel/scheduled/dreaming/llm.ts +33 -0
  87. package/src/kernel/scheduled/dreaming/pattern-synthesis.ts +124 -0
  88. package/src/kernel/scheduled/dreaming/persona.ts +75 -0
  89. package/src/kernel/scheduled/dreaming/symbolic.ts +31 -0
  90. package/src/kernel/scheduled/dreaming/task-proposals.ts +80 -0
  91. package/src/kernel/scheduled/dreaming.ts +66 -0
  92. package/src/kernel/scheduled/entropy.ts +149 -0
  93. package/src/kernel/scheduled/escalation.ts +192 -0
  94. package/src/kernel/scheduled/feed-watcher.ts +206 -0
  95. package/src/kernel/scheduled/goals.ts +214 -0
  96. package/src/kernel/scheduled/governance.ts +41 -0
  97. package/src/kernel/scheduled/heartbeat.ts +220 -0
  98. package/src/kernel/scheduled/inbox-processor.ts +174 -0
  99. package/src/kernel/scheduled/index.ts +245 -0
  100. package/src/kernel/scheduled/issue-proposer.ts +478 -0
  101. package/src/kernel/scheduled/issue-watcher.ts +128 -0
  102. package/src/kernel/scheduled/pr-automerge.ts +213 -0
  103. package/src/kernel/scheduled/product-health.ts +107 -0
  104. package/src/kernel/scheduled/reflection.ts +373 -0
  105. package/src/kernel/scheduled/self-improvement.ts +114 -0
  106. package/src/kernel/scheduled/social-engage.ts +175 -0
  107. package/src/kernel/scheduled/task-audit.ts +60 -0
  108. package/src/kernel/symbolic.ts +156 -0
  109. package/src/kernel/types.ts +145 -0
  110. package/src/landing.ts +1190 -0
  111. package/src/lib/audit-chain/chain.ts +28 -0
  112. package/src/lib/audit-chain/types.ts +12 -0
  113. package/src/lib/observability/errors.ts +55 -0
  114. package/src/markdown.ts +164 -0
  115. package/src/mcp/handlers.ts +647 -0
  116. package/src/mcp/server.ts +184 -0
  117. package/src/mcp/tools.ts +316 -0
  118. package/src/mcp-client.ts +275 -0
  119. package/src/mcp-server.ts +2 -0
  120. package/src/operator/config.example.ts +60 -0
  121. package/src/operator/config.ts +60 -0
  122. package/src/operator/index.ts +46 -0
  123. package/src/operator/persona.example.ts +34 -0
  124. package/src/operator/persona.ts +34 -0
  125. package/src/operator/prompt-builder.ts +190 -0
  126. package/src/operator/types.ts +43 -0
  127. package/src/pulse.ts +1179 -0
  128. package/src/routes/bluesky.ts +116 -0
  129. package/src/routes/cc-tasks.ts +328 -0
  130. package/src/routes/codebeast.ts +1 -0
  131. package/src/routes/content.ts +194 -0
  132. package/src/routes/conversations.ts +25 -0
  133. package/src/routes/dynamic-tools.ts +111 -0
  134. package/src/routes/feedback.ts +192 -0
  135. package/src/routes/health.ts +147 -0
  136. package/src/routes/messages.ts +228 -0
  137. package/src/routes/observability.ts +82 -0
  138. package/src/routes/operator-logs.ts +42 -0
  139. package/src/routes/pages.ts +96 -0
  140. package/src/routes/sessions.ts +54 -0
  141. package/src/sanitize.ts +73 -0
  142. package/src/schema-enums.ts +155 -0
  143. package/src/search.ts +112 -0
  144. package/src/task-intelligence.ts +497 -0
  145. package/src/types.ts +194 -0
  146. package/src/ui.ts +5 -0
  147. package/src/version.ts +3 -0
  148. package/src/workers-ai-chat.ts +333 -0
@@ -0,0 +1,245 @@
1
+ import { type EdgeEnv } from '../dispatch.js';
2
+ import { type ImgForgeConfig } from '../../content/index.js';
3
+ import { operatorConfig } from '../../operator/index.js';
4
+ import { runHeartbeat } from './heartbeat.js';
5
+ import { runMemoryConsolidation } from './consolidation.js';
6
+ import { runSelfImprovementAnalysis, runSelfImprovementHousekeeping, runInfraComplianceCheck } from './self-improvement.js';
7
+ import { runGoalLoop } from './goals.js';
8
+ import { runRoundtableContentGeneration, runDispatchContentGeneration, runColumnContentGeneration } from './content.js';
9
+ import { runAgendaEscalation } from './escalation.js';
10
+ import { runMemoryReflectionCycle, runOperatorLogCycle } from './reflection.js';
11
+ import { runCuriosityCycle } from './curiosity.js';
12
+ import { runDreamingCycle } from './dreaming.js';
13
+ import { runProductHealthSweep } from './product-health.js';
14
+ import { runIssueWatcher } from './issue-watcher.js';
15
+ import { runCiWatcher } from './ci-watcher.js';
16
+ import { runDailyDigest } from './digest.js';
17
+ import { runArgusNotifications } from './argus-notify.js';
18
+ import { runArgusHeartbeat } from './argus-heartbeat.js';
19
+ import { runCognitiveMetrics } from './cognitive-metrics.js';
20
+ import { runArgusAnalytics } from './argus-analytics.js';
21
+ import { runPrAutomerge } from './pr-automerge.js';
22
+ import { runFeedWatcher } from './feed-watcher.js';
23
+ import { runCostReport } from './cost-report.js';
24
+ import { runBoardSync } from './board-sync.js';
25
+ import { runContentDrip } from './content-drip.js';
26
+ import { runInboxProcessor } from './inbox-processor.js';
27
+ import { runAgentDispatch } from './agent-dispatch.js';
28
+ import { runConversationFactExtraction } from './conversation-facts.js';
29
+ import { runEntropyDetection } from './entropy.js';
30
+ import { runSocialEngagement } from './social-engage.js';
31
+ import { runDevActivity } from './dev-activity.js';
32
+ import { runIssueProposer } from './issue-proposer.js';
33
+ import { InMemoryErrorTracker } from '../../lib/observability/errors.js';
34
+ import { getChainHead, writeTaskAuditRecord } from './task-audit.js';
35
+
36
+ export function buildImgForgeConfig(env: EdgeEnv): ImgForgeConfig | undefined {
37
+ if (!env.imgForgeFetcher || !env.imgForgeSbSecret || !operatorConfig.integrations.imgForge.enabled) {
38
+ return undefined;
39
+ }
40
+ return {
41
+ fetcher: env.imgForgeFetcher,
42
+ sbSecret: env.imgForgeSbSecret,
43
+ baseUrl: operatorConfig.integrations.imgForge.baseUrl,
44
+ };
45
+ }
46
+
47
+ // --- Task Runner Infrastructure ---
48
+
49
+ type TaskKind = 'heartbeat' | 'cron';
50
+
51
+ // Per-cron-run error tracker -- aggregates/deduplicates errors within each cycle
52
+ let errorTracker: InMemoryErrorTracker | null = null;
53
+ // Chain head -- loaded once per cron run, updated after each task
54
+ let chainHead: string | null = null;
55
+
56
+ async function recordTaskRun(
57
+ db: D1Database,
58
+ taskName: string,
59
+ status: 'ok' | 'error' | 'skipped',
60
+ durationMs: number,
61
+ errorMessage?: string,
62
+ ): Promise<void> {
63
+ try {
64
+ await db.prepare(
65
+ 'INSERT INTO task_runs (task_name, status, duration_ms, error_message) VALUES (?, ?, ?, ?)'
66
+ ).bind(taskName, status, durationMs, errorMessage ?? null).run();
67
+ } catch {
68
+ // Don't let observability failures break the scheduler
69
+ }
70
+ }
71
+
72
+ async function runTask(
73
+ env: EdgeEnv,
74
+ name: string,
75
+ kind: TaskKind,
76
+ fn: (env: EdgeEnv) => Promise<void>,
77
+ ): Promise<void> {
78
+ const start = Date.now();
79
+ try {
80
+ await fn(env);
81
+ const duration = Date.now() - start;
82
+ await recordTaskRun(env.db, name, 'ok', duration);
83
+
84
+ // Audit chain: record successful execution
85
+ try {
86
+ if (chainHead !== null) {
87
+ chainHead = await writeTaskAuditRecord(env.db, {
88
+ taskName: name, status: 'ok', durationMs: duration, chainHead,
89
+ });
90
+ }
91
+ } catch { /* audit is best-effort */ }
92
+ } catch (err) {
93
+ const duration = Date.now() - start;
94
+ const msg = err instanceof Error ? err.message : String(err);
95
+ console.error(`[${kind}] ${name} failed:`, msg);
96
+ await recordTaskRun(env.db, name, 'error', duration, msg);
97
+
98
+ // Error tracker: aggregate for end-of-cycle summary
99
+ errorTracker?.track(err instanceof Error ? err : new Error(msg));
100
+
101
+ // Audit chain: record failure
102
+ try {
103
+ if (chainHead !== null) {
104
+ chainHead = await writeTaskAuditRecord(env.db, {
105
+ taskName: name, status: 'error', durationMs: duration,
106
+ errorMessage: msg, chainHead,
107
+ });
108
+ }
109
+ } catch { /* audit is best-effort */ }
110
+ }
111
+ }
112
+
113
+ // --- Heartbeat Phase ---
114
+ // Runs every hour, never skipped. Cheap operations that share
115
+ // context and maintain system awareness. These are the pulse.
116
+
117
+ async function runHeartbeatPhase(env: EdgeEnv): Promise<void> {
118
+ // Escalation runs first: bumps stale priorities, returns stale items for heartbeat
119
+ let staleHighItems: import('./escalation.js').StaleHighItem[] = [];
120
+ {
121
+ const start = Date.now();
122
+ try {
123
+ staleHighItems = await runAgendaEscalation(env);
124
+ await recordTaskRun(env.db, 'escalation', 'ok', Date.now() - start);
125
+ } catch (err) {
126
+ const msg = err instanceof Error ? err.message : String(err);
127
+ console.error('[heartbeat] escalation failed:', msg);
128
+ await recordTaskRun(env.db, 'escalation', 'error', Date.now() - start, msg);
129
+ }
130
+ }
131
+
132
+ // Awareness -- lightweight monitors, always run
133
+ await runTask(env, 'ci-watcher', 'heartbeat', runCiWatcher);
134
+ await runTask(env, 'argus-notify', 'heartbeat', runArgusNotifications);
135
+ await runTask(env, 'argus-heartbeat', 'heartbeat', runArgusHeartbeat);
136
+ await runTask(env, 'cognitive-metrics', 'heartbeat', runCognitiveMetrics);
137
+ await runTask(env, 'pr-automerge', 'heartbeat', runPrAutomerge);
138
+
139
+ // Agent inbox -- process unread messages from peer agents
140
+ await runTask(env, 'inbox', 'heartbeat', runInboxProcessor);
141
+
142
+ // Agent dispatch -- proactively route work to CodeBeast, MARA, Sera
143
+ await runTask(env, 'agent-dispatch', 'heartbeat', runAgentDispatch);
144
+
145
+ // Memory maintenance
146
+ await runTask(env, 'consolidation', 'heartbeat', runMemoryConsolidation);
147
+ await runTask(env, 'heartbeat', 'heartbeat', (e) => runHeartbeat(e, staleHighItems));
148
+ await runTask(env, 'product-health', 'heartbeat', runProductHealthSweep);
149
+
150
+ // Housekeeping -- outcomes, task patterns, CRIX
151
+ await runTask(env, 'self-improvement-housekeeping', 'heartbeat', runSelfImprovementHousekeeping);
152
+
153
+ // Entropy -- ghost tasks, stale agenda, dormant goals (6-hourly, self-gated)
154
+ await runTask(env, 'entropy', 'heartbeat', runEntropyDetection);
155
+
156
+ // Social engagement -- like replies, follow back, reply to comments (6-hourly, self-gated)
157
+ await runTask(env, 'social-engage', 'heartbeat', runSocialEngagement);
158
+ }
159
+
160
+ // --- Cron Phase ---
161
+ // Time-gated, isolated tasks. Each has its own frequency and
162
+ // internal time gate. These are the scheduled work.
163
+
164
+ async function runCronPhase(env: EdgeEnv): Promise<void> {
165
+ const hour = new Date().getUTCHours();
166
+
167
+ // 2-hourly: issue watcher + board sync
168
+ if (hour % 2 === 0) {
169
+ await runTask(env, 'issue-watcher', 'cron', runIssueWatcher);
170
+ await runTask(env, 'board-sync', 'cron', runBoardSync);
171
+ }
172
+
173
+ // Analytics + feeds + cost (internally time-gated)
174
+ await runTask(env, 'argus-analytics', 'cron', runArgusAnalytics);
175
+ await runTask(env, 'dev-activity', 'cron', runDevActivity);
176
+ await runTask(env, 'feed-watcher', 'cron', runFeedWatcher);
177
+ await runTask(env, 'cost-report', 'cron', runCostReport);
178
+
179
+ // Issue proposer — auto-file GitHub issues from detection systems (6-hourly, self-gated)
180
+ await runTask(env, 'issue-proposer', 'cron', runIssueProposer);
181
+
182
+ // Heavy tasks -- mutually exclusive to stay under 50 subrequest limit
183
+ const isSelfImprovementHour = hour % 6 === 0;
184
+
185
+ if (isSelfImprovementHour) {
186
+ await runTask(env, 'self-improvement', 'cron', runSelfImprovementAnalysis);
187
+ } else {
188
+ await runTask(env, 'goals', 'cron', runGoalLoop);
189
+ }
190
+
191
+ // Daily infra compliance + docs drift (runs at 05 UTC)
192
+ await runTask(env, 'infra-compliance', 'cron', runInfraComplianceCheck);
193
+
194
+ // Content drip -- publish scheduled social posts
195
+ await runTask(env, 'content-drip', 'cron', runContentDrip);
196
+
197
+ // Content generation -- time-guarded, won't fire most hours
198
+ await runTask(env, 'roundtable', 'cron', runRoundtableContentGeneration);
199
+ await runTask(env, 'dispatch', 'cron', runDispatchContentGeneration);
200
+ await runTask(env, 'column', 'cron', runColumnContentGeneration);
201
+
202
+ // Introspection
203
+ await runTask(env, 'reflection', 'cron', runMemoryReflectionCycle);
204
+ await runTask(env, 'operator-log', 'cron', runOperatorLogCycle);
205
+ await runTask(env, 'daily-digest', 'cron', runDailyDigest);
206
+
207
+ // Curiosity -- daily, non-self-improvement hours only
208
+ if (!isSelfImprovementHour) {
209
+ await runTask(env, 'curiosity', 'cron', runCuriosityCycle);
210
+ }
211
+
212
+ // Conversation fact extraction -- 2-hourly, complements daily dreaming
213
+ await runTask(env, 'conversation-facts', 'cron', runConversationFactExtraction);
214
+
215
+ // Dreaming -- daily async reflection (self-gated via watermark)
216
+ await runTask(env, 'dreaming', 'cron', runDreamingCycle);
217
+ }
218
+
219
+ // --- Main Entry Point ---
220
+
221
+ export async function runScheduledTasks(env: EdgeEnv): Promise<void> {
222
+ // Initialize per-run observability
223
+ errorTracker = new InMemoryErrorTracker();
224
+ try {
225
+ chainHead = await getChainHead(env.db);
226
+ } catch {
227
+ chainHead = null; // audit chain is best-effort
228
+ }
229
+
230
+ // Heartbeat first -- cheap, always runs, maintains awareness
231
+ await runHeartbeatPhase(env);
232
+
233
+ // Cron second -- time-gated, isolated, may be heavy
234
+ await runCronPhase(env);
235
+
236
+ // End-of-cycle error summary
237
+ const stats = errorTracker.getErrorStats();
238
+ if (stats.total > 0) {
239
+ console.log(`[scheduler] Cycle errors: ${stats.total} (${Object.keys(stats.byType).length} types)`);
240
+ }
241
+
242
+ // Reset for next cycle
243
+ errorTracker = null;
244
+ chainHead = null;
245
+ }