@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.
- package/package.json +96 -0
- package/schema.sql +586 -0
- package/src/adapters/voice/cloudflare-agent.ts +34 -0
- package/src/auth.ts +124 -0
- package/src/bluesky.ts +464 -0
- package/src/claude-tools/content.ts +188 -0
- package/src/claude-tools/email.ts +69 -0
- package/src/claude-tools/github.ts +440 -0
- package/src/claude-tools/goals.ts +116 -0
- package/src/claude-tools/index.ts +353 -0
- package/src/claude-tools/web.ts +59 -0
- package/src/claude.ts +406 -0
- package/src/codebeast.ts +200 -0
- package/src/composite.ts +715 -0
- package/src/content/column.ts +80 -0
- package/src/content/hero-image.ts +47 -0
- package/src/content/index.ts +27 -0
- package/src/content/journal.ts +91 -0
- package/src/content/roundtable.ts +163 -0
- package/src/core.ts +309 -0
- package/src/dashboard.ts +620 -0
- package/src/decision-docs.ts +284 -0
- package/src/dispatch.ts +13 -0
- package/src/edge-env.ts +58 -0
- package/src/email.ts +850 -0
- package/src/exports.ts +156 -0
- package/src/github-projects.ts +312 -0
- package/src/github.ts +670 -0
- package/src/groq.ts +247 -0
- package/src/health-page.ts +578 -0
- package/src/index.ts +89 -0
- package/src/kernel/argus-actions.ts +397 -0
- package/src/kernel/argus-correlation.ts +639 -0
- package/src/kernel/board.ts +91 -0
- package/src/kernel/briefing.ts +177 -0
- package/src/kernel/classify-memory-topic.ts +166 -0
- package/src/kernel/cognition.ts +377 -0
- package/src/kernel/court-cards.ts +163 -0
- package/src/kernel/dispatch.ts +587 -0
- package/src/kernel/domain.ts +50 -0
- package/src/kernel/dynamic-tools.ts +322 -0
- package/src/kernel/executor-port.ts +45 -0
- package/src/kernel/executors/claude.ts +73 -0
- package/src/kernel/executors/direct.ts +237 -0
- package/src/kernel/executors/groq.ts +18 -0
- package/src/kernel/executors/index.ts +87 -0
- package/src/kernel/executors/tarotscript.ts +104 -0
- package/src/kernel/executors/workers-ai.ts +54 -0
- package/src/kernel/insight-cache.ts +76 -0
- package/src/kernel/memory/agenda.ts +200 -0
- package/src/kernel/memory/blocks.ts +188 -0
- package/src/kernel/memory/consolidation.ts +194 -0
- package/src/kernel/memory/episodic.ts +241 -0
- package/src/kernel/memory/goals.ts +156 -0
- package/src/kernel/memory/graph.ts +290 -0
- package/src/kernel/memory/index.ts +11 -0
- package/src/kernel/memory/insights.ts +316 -0
- package/src/kernel/memory/procedural.ts +467 -0
- package/src/kernel/memory/pruning.ts +67 -0
- package/src/kernel/memory/recall.ts +367 -0
- package/src/kernel/memory/semantic.ts +315 -0
- package/src/kernel/memory/synthesis.ts +161 -0
- package/src/kernel/memory-adapter.ts +369 -0
- package/src/kernel/memory-guardrails.ts +76 -0
- package/src/kernel/port.ts +23 -0
- package/src/kernel/resilience.ts +322 -0
- package/src/kernel/router.ts +471 -0
- package/src/kernel/scheduled/agent-dispatch.ts +252 -0
- package/src/kernel/scheduled/argus-analytics.ts +247 -0
- package/src/kernel/scheduled/argus-heartbeat.ts +320 -0
- package/src/kernel/scheduled/argus-notify.ts +348 -0
- package/src/kernel/scheduled/board-sync.ts +110 -0
- package/src/kernel/scheduled/ci-watcher.ts +125 -0
- package/src/kernel/scheduled/cognitive-metrics.ts +377 -0
- package/src/kernel/scheduled/consolidation.ts +229 -0
- package/src/kernel/scheduled/content-drip.ts +47 -0
- package/src/kernel/scheduled/content.ts +6 -0
- package/src/kernel/scheduled/conversation-facts.ts +204 -0
- package/src/kernel/scheduled/cost-report.ts +84 -0
- package/src/kernel/scheduled/curiosity.ts +219 -0
- package/src/kernel/scheduled/dev-activity.ts +44 -0
- package/src/kernel/scheduled/digest.ts +317 -0
- package/src/kernel/scheduled/dreaming/agenda-triage.ts +115 -0
- package/src/kernel/scheduled/dreaming/facts.ts +239 -0
- package/src/kernel/scheduled/dreaming/index.ts +8 -0
- package/src/kernel/scheduled/dreaming/llm.ts +33 -0
- package/src/kernel/scheduled/dreaming/pattern-synthesis.ts +124 -0
- package/src/kernel/scheduled/dreaming/persona.ts +75 -0
- package/src/kernel/scheduled/dreaming/symbolic.ts +31 -0
- package/src/kernel/scheduled/dreaming/task-proposals.ts +80 -0
- package/src/kernel/scheduled/dreaming.ts +66 -0
- package/src/kernel/scheduled/entropy.ts +149 -0
- package/src/kernel/scheduled/escalation.ts +192 -0
- package/src/kernel/scheduled/feed-watcher.ts +206 -0
- package/src/kernel/scheduled/goals.ts +214 -0
- package/src/kernel/scheduled/governance.ts +41 -0
- package/src/kernel/scheduled/heartbeat.ts +220 -0
- package/src/kernel/scheduled/inbox-processor.ts +174 -0
- package/src/kernel/scheduled/index.ts +245 -0
- package/src/kernel/scheduled/issue-proposer.ts +478 -0
- package/src/kernel/scheduled/issue-watcher.ts +128 -0
- package/src/kernel/scheduled/pr-automerge.ts +213 -0
- package/src/kernel/scheduled/product-health.ts +107 -0
- package/src/kernel/scheduled/reflection.ts +373 -0
- package/src/kernel/scheduled/self-improvement.ts +114 -0
- package/src/kernel/scheduled/social-engage.ts +175 -0
- package/src/kernel/scheduled/task-audit.ts +60 -0
- package/src/kernel/symbolic.ts +156 -0
- package/src/kernel/types.ts +145 -0
- package/src/landing.ts +1190 -0
- package/src/lib/audit-chain/chain.ts +28 -0
- package/src/lib/audit-chain/types.ts +12 -0
- package/src/lib/observability/errors.ts +55 -0
- package/src/markdown.ts +164 -0
- package/src/mcp/handlers.ts +647 -0
- package/src/mcp/server.ts +184 -0
- package/src/mcp/tools.ts +316 -0
- package/src/mcp-client.ts +275 -0
- package/src/mcp-server.ts +2 -0
- package/src/operator/config.example.ts +60 -0
- package/src/operator/config.ts +60 -0
- package/src/operator/index.ts +46 -0
- package/src/operator/persona.example.ts +34 -0
- package/src/operator/persona.ts +34 -0
- package/src/operator/prompt-builder.ts +190 -0
- package/src/operator/types.ts +43 -0
- package/src/pulse.ts +1179 -0
- package/src/routes/bluesky.ts +116 -0
- package/src/routes/cc-tasks.ts +328 -0
- package/src/routes/codebeast.ts +1 -0
- package/src/routes/content.ts +194 -0
- package/src/routes/conversations.ts +25 -0
- package/src/routes/dynamic-tools.ts +111 -0
- package/src/routes/feedback.ts +192 -0
- package/src/routes/health.ts +147 -0
- package/src/routes/messages.ts +228 -0
- package/src/routes/observability.ts +82 -0
- package/src/routes/operator-logs.ts +42 -0
- package/src/routes/pages.ts +96 -0
- package/src/routes/sessions.ts +54 -0
- package/src/sanitize.ts +73 -0
- package/src/schema-enums.ts +155 -0
- package/src/search.ts +112 -0
- package/src/task-intelligence.ts +497 -0
- package/src/types.ts +194 -0
- package/src/ui.ts +5 -0
- package/src/version.ts +3 -0
- 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
|
+
}
|