@guyghost/swarm-dao-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/dist/agents/index.d.ts +2 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +3 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/prompts.d.ts +38 -0
- package/dist/agents/prompts.d.ts.map +1 -0
- package/dist/agents/prompts.js +142 -0
- package/dist/agents/prompts.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +100 -0
- package/dist/config.js.map +1 -0
- package/dist/control/audit.d.ts +7 -0
- package/dist/control/audit.d.ts.map +1 -0
- package/dist/control/audit.js +25 -0
- package/dist/control/audit.js.map +1 -0
- package/dist/control/gates.d.ts +4 -0
- package/dist/control/gates.d.ts.map +1 -0
- package/dist/control/gates.js +252 -0
- package/dist/control/gates.js.map +1 -0
- package/dist/control/index.d.ts +3 -0
- package/dist/control/index.d.ts.map +1 -0
- package/dist/control/index.js +4 -0
- package/dist/control/index.js.map +1 -0
- package/dist/delivery/artefacts.d.ts +20 -0
- package/dist/delivery/artefacts.d.ts.map +1 -0
- package/dist/delivery/artefacts.js +222 -0
- package/dist/delivery/artefacts.js.map +1 -0
- package/dist/delivery/dry-run.d.ts +14 -0
- package/dist/delivery/dry-run.d.ts.map +1 -0
- package/dist/delivery/dry-run.js +100 -0
- package/dist/delivery/dry-run.js.map +1 -0
- package/dist/delivery/execution.d.ts +23 -0
- package/dist/delivery/execution.d.ts.map +1 -0
- package/dist/delivery/execution.js +99 -0
- package/dist/delivery/execution.js.map +1 -0
- package/dist/delivery/index.d.ts +5 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +6 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/plans.d.ts +7 -0
- package/dist/delivery/plans.d.ts.map +1 -0
- package/dist/delivery/plans.js +172 -0
- package/dist/delivery/plans.js.map +1 -0
- package/dist/governance/agents.d.ts +7 -0
- package/dist/governance/agents.d.ts.map +1 -0
- package/dist/governance/agents.js +310 -0
- package/dist/governance/agents.js.map +1 -0
- package/dist/governance/amendments.d.ts +20 -0
- package/dist/governance/amendments.d.ts.map +1 -0
- package/dist/governance/amendments.js +242 -0
- package/dist/governance/amendments.js.map +1 -0
- package/dist/governance/index.d.ts +6 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +7 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/lifecycle.d.ts +13 -0
- package/dist/governance/lifecycle.d.ts.map +1 -0
- package/dist/governance/lifecycle.js +86 -0
- package/dist/governance/lifecycle.js.map +1 -0
- package/dist/governance/scoring.d.ts +16 -0
- package/dist/governance/scoring.d.ts.map +1 -0
- package/dist/governance/scoring.js +118 -0
- package/dist/governance/scoring.js.map +1 -0
- package/dist/governance/voting.d.ts +6 -0
- package/dist/governance/voting.d.ts.map +1 -0
- package/dist/governance/voting.js +73 -0
- package/dist/governance/voting.js.map +1 -0
- package/dist/health-score.d.ts +25 -0
- package/dist/health-score.d.ts.map +1 -0
- package/dist/health-score.js +201 -0
- package/dist/health-score.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/bitbucket.d.ts +26 -0
- package/dist/integrations/bitbucket.d.ts.map +1 -0
- package/dist/integrations/bitbucket.js +76 -0
- package/dist/integrations/bitbucket.js.map +1 -0
- package/dist/integrations/github.d.ts +39 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +126 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/gitlab.d.ts +29 -0
- package/dist/integrations/gitlab.d.ts.map +1 -0
- package/dist/integrations/gitlab.js +86 -0
- package/dist/integrations/gitlab.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +5 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/utils.d.ts +2 -0
- package/dist/integrations/utils.d.ts.map +1 -0
- package/dist/integrations/utils.js +8 -0
- package/dist/integrations/utils.js.map +1 -0
- package/dist/intelligence/index.d.ts +3 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +4 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/roundtable.d.ts +16 -0
- package/dist/intelligence/roundtable.d.ts.map +1 -0
- package/dist/intelligence/roundtable.js +113 -0
- package/dist/intelligence/roundtable.js.map +1 -0
- package/dist/intelligence/swarm.d.ts +27 -0
- package/dist/intelligence/swarm.d.ts.map +1 -0
- package/dist/intelligence/swarm.js +113 -0
- package/dist/intelligence/swarm.js.map +1 -0
- package/dist/intelligence/synthesis.d.ts +4 -0
- package/dist/intelligence/synthesis.d.ts.map +1 -0
- package/dist/intelligence/synthesis.js +84 -0
- package/dist/intelligence/synthesis.js.map +1 -0
- package/dist/observability/alerts.d.ts +40 -0
- package/dist/observability/alerts.d.ts.map +1 -0
- package/dist/observability/alerts.js +162 -0
- package/dist/observability/alerts.js.map +1 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +64 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +224 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/tracing.d.ts +44 -0
- package/dist/observability/tracing.d.ts.map +1 -0
- package/dist/observability/tracing.js +129 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/persistence.d.ts +50 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +486 -0
- package/dist/persistence.js.map +1 -0
- package/dist/types/index.d.ts +652 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +131 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/host.d.ts +14 -0
- package/dist/utils/host.d.ts.map +1 -0
- package/dist/utils/host.js +42 -0
- package/dist/utils/host.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AgentOutput, DAOAgent, HostAdapter, Proposal } from "../types/index.js";
|
|
2
|
+
export interface SwarmProgressUpdate {
|
|
3
|
+
agentId: string;
|
|
4
|
+
agentName: string;
|
|
5
|
+
phase: "pending" | "started" | "completed" | "error";
|
|
6
|
+
output?: AgentOutput;
|
|
7
|
+
isRetry?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface DispatchInstruction {
|
|
10
|
+
agentId: string;
|
|
11
|
+
agentName: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
timeoutMs: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build dispatch instructions for each agent.
|
|
18
|
+
* Host adapters use these to spawn sub-agents.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildDispatchInstructions(proposal: Proposal, agents: DAOAgent[]): DispatchInstruction[];
|
|
21
|
+
export declare function formatDispatchPlan(proposal: Proposal, instructions: DispatchInstruction[]): string;
|
|
22
|
+
/**
|
|
23
|
+
* Dispatch swarm via a host adapter.
|
|
24
|
+
* This is the host-agnostic version — adapters implement the actual spawning.
|
|
25
|
+
*/
|
|
26
|
+
export declare function dispatchSwarm(proposal: Proposal, agents: DAOAgent[], adapter: HostAdapter, maxConcurrent: number, onUpdate?: (update: SwarmProgressUpdate) => void): Promise<AgentOutput[]>;
|
|
27
|
+
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/intelligence/swarm.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,mBAAmB,EAAE,CA0BvG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAuBlG;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,QAAQ,EAAE,EAClB,OAAO,EAAE,WAAW,EACpB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAC/C,OAAO,CAAC,WAAW,EAAE,CAAC,CA+DxB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Swarm DAO Core — Swarm Dispatch
|
|
3
|
+
// ============================================================
|
|
4
|
+
/**
|
|
5
|
+
* Build dispatch instructions for each agent.
|
|
6
|
+
* Host adapters use these to spawn sub-agents.
|
|
7
|
+
*/
|
|
8
|
+
export function buildDispatchInstructions(proposal, agents) {
|
|
9
|
+
const basePrompt = `You are participating in DAO governance deliberation for the following proposal.
|
|
10
|
+
|
|
11
|
+
## Proposal #${proposal.id}: ${proposal.title}
|
|
12
|
+
**Type:** ${proposal.type}
|
|
13
|
+
**Description:**
|
|
14
|
+
${proposal.description}
|
|
15
|
+
|
|
16
|
+
${proposal.problemStatement ? `**Problem Statement:**\n${proposal.problemStatement}\n\n` : ""}
|
|
17
|
+
${proposal.context ? `**Context:**\n${proposal.context}\n\n` : ""}
|
|
18
|
+
${Array.isArray(proposal.acceptanceCriteria) && proposal.acceptanceCriteria.length > 0
|
|
19
|
+
? `**Acceptance Criteria:**\n${proposal.acceptanceCriteria.map((ac, _i) => `- ${typeof ac === "string" ? ac : ac.id}: ${typeof ac === "string" ? ac : `${ac.given} / ${ac.when} / ${ac.then}`}`).join("\n")}\n\n`
|
|
20
|
+
: ""}
|
|
21
|
+
${proposal.successMetrics?.length ? `**Success Metrics:**\n${proposal.successMetrics.map((m) => `- ${m}`).join("\n")}\n\n` : ""}
|
|
22
|
+
|
|
23
|
+
Evaluate this proposal carefully. Provide your analysis, vote, and scoring.`;
|
|
24
|
+
return agents.map((agent) => ({
|
|
25
|
+
agentId: agent.id,
|
|
26
|
+
agentName: agent.name,
|
|
27
|
+
prompt: `${agent.systemPrompt}\n\n${basePrompt}`,
|
|
28
|
+
model: agent.model,
|
|
29
|
+
timeoutMs: 120_000,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
export function formatDispatchPlan(proposal, instructions) {
|
|
33
|
+
return `# 🐝 Swarm Dispatch Plan — Proposal #${proposal.id}
|
|
34
|
+
|
|
35
|
+
**Title:** ${proposal.title}
|
|
36
|
+
**Agents to spawn:** ${instructions.length}
|
|
37
|
+
|
|
38
|
+
## Instructions
|
|
39
|
+
${instructions
|
|
40
|
+
.map((inst) => `### @${inst.agentId} (${inst.agentName})
|
|
41
|
+
- Model: ${inst.model ?? "default"}
|
|
42
|
+
- Timeout: ${inst.timeoutMs}ms
|
|
43
|
+
|
|
44
|
+
Spawn this sub-agent with the following task:
|
|
45
|
+
\`\`\`
|
|
46
|
+
${inst.prompt.slice(0, 500)}${inst.prompt.length > 500 ? "..." : ""}
|
|
47
|
+
\`\`\`
|
|
48
|
+
`)
|
|
49
|
+
.join("\n")}
|
|
50
|
+
|
|
51
|
+
## Next Step
|
|
52
|
+
After collecting all outputs, call \`dao_record_outputs\` with the collected responses.`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Dispatch swarm via a host adapter.
|
|
56
|
+
* This is the host-agnostic version — adapters implement the actual spawning.
|
|
57
|
+
*/
|
|
58
|
+
export async function dispatchSwarm(proposal, agents, adapter, maxConcurrent, onUpdate) {
|
|
59
|
+
const instructions = buildDispatchInstructions(proposal, agents);
|
|
60
|
+
const outputs = [];
|
|
61
|
+
// Process in batches based on maxConcurrent
|
|
62
|
+
for (let i = 0; i < instructions.length; i += maxConcurrent) {
|
|
63
|
+
const batch = instructions.slice(i, i + maxConcurrent);
|
|
64
|
+
const batchPromises = batch.map(async (inst) => {
|
|
65
|
+
const agent = agents.find((a) => a.id === inst.agentId);
|
|
66
|
+
if (!agent)
|
|
67
|
+
throw new Error(`Agent ${inst.agentId} not found`);
|
|
68
|
+
onUpdate?.({
|
|
69
|
+
agentId: inst.agentId,
|
|
70
|
+
agentName: inst.agentName,
|
|
71
|
+
phase: "started",
|
|
72
|
+
});
|
|
73
|
+
try {
|
|
74
|
+
const output = await adapter.spawnAgent({
|
|
75
|
+
agent,
|
|
76
|
+
proposal,
|
|
77
|
+
systemPrompt: inst.prompt,
|
|
78
|
+
timeoutMs: inst.timeoutMs,
|
|
79
|
+
});
|
|
80
|
+
outputs.push(output);
|
|
81
|
+
onUpdate?.({
|
|
82
|
+
agentId: inst.agentId,
|
|
83
|
+
agentName: inst.agentName,
|
|
84
|
+
phase: output.error ? "error" : "completed",
|
|
85
|
+
output,
|
|
86
|
+
});
|
|
87
|
+
return output;
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const message = err instanceof Error ? err.message : "Unknown error";
|
|
91
|
+
const errorOutput = {
|
|
92
|
+
agentId: inst.agentId,
|
|
93
|
+
agentName: inst.agentName,
|
|
94
|
+
role: agent.role,
|
|
95
|
+
content: "",
|
|
96
|
+
durationMs: 0,
|
|
97
|
+
error: message,
|
|
98
|
+
};
|
|
99
|
+
outputs.push(errorOutput);
|
|
100
|
+
onUpdate?.({
|
|
101
|
+
agentId: inst.agentId,
|
|
102
|
+
agentName: inst.agentName,
|
|
103
|
+
phase: "error",
|
|
104
|
+
output: errorOutput,
|
|
105
|
+
});
|
|
106
|
+
return errorOutput;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
await Promise.all(batchPromises);
|
|
110
|
+
}
|
|
111
|
+
return outputs;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/intelligence/swarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentOutput, DAOAgent, Proposal, TallyResult } from "../types/index.js";
|
|
2
|
+
export declare function synthesize(proposal: Proposal, _agents: DAOAgent[], outputs: AgentOutput[], tally?: TallyResult): string;
|
|
3
|
+
export declare function formatSynthesis(synthesis: string): string;
|
|
4
|
+
//# sourceMappingURL=synthesis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/intelligence/synthesis.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,QAAQ,EAAE,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAiER;AAyBD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Swarm DAO Core — Deliberation Synthesis
|
|
3
|
+
// ============================================================
|
|
4
|
+
export function synthesize(proposal, _agents, outputs, tally) {
|
|
5
|
+
const approved = tally?.approved ?? false;
|
|
6
|
+
const forVotes = outputs.filter((o) => o.vote?.position === "for");
|
|
7
|
+
const againstVotes = outputs.filter((o) => o.vote?.position === "against");
|
|
8
|
+
const abstentions = outputs.filter((o) => o.vote?.position === "abstain" || !o.vote);
|
|
9
|
+
const errors = outputs.filter((o) => o.error);
|
|
10
|
+
let synthesis = `## Synthesis — Proposal #${proposal.id}\n\n`;
|
|
11
|
+
synthesis += `**Result:** ${approved ? "✅ APPROVED" : "❌ REJECTED"}\n`;
|
|
12
|
+
synthesis += `**Agents Participated:** ${outputs.length}\n`;
|
|
13
|
+
synthesis += `**For:** ${forVotes.length} | **Against:** ${againstVotes.length} | **Abstain:** ${abstentions.length}`;
|
|
14
|
+
if (errors.length > 0) {
|
|
15
|
+
synthesis += ` | **Errors:** ${errors.length}`;
|
|
16
|
+
}
|
|
17
|
+
synthesis += "\n\n";
|
|
18
|
+
if (forVotes.length > 0) {
|
|
19
|
+
synthesis += "### Supporting Arguments\n";
|
|
20
|
+
for (const vote of forVotes) {
|
|
21
|
+
synthesis += `- **${vote.agentName}:** ${vote.vote?.reasoning?.slice(0, 200) ?? "No reasoning"}${(vote.vote?.reasoning?.length ?? 0) > 200 ? "..." : ""}\n`;
|
|
22
|
+
}
|
|
23
|
+
synthesis += "\n";
|
|
24
|
+
}
|
|
25
|
+
if (againstVotes.length > 0) {
|
|
26
|
+
synthesis += "### Opposing Arguments\n";
|
|
27
|
+
for (const vote of againstVotes) {
|
|
28
|
+
synthesis += `- **${vote.agentName}:** ${vote.vote?.reasoning?.slice(0, 200) ?? "No reasoning"}${(vote.vote?.reasoning?.length ?? 0) > 200 ? "..." : ""}\n`;
|
|
29
|
+
}
|
|
30
|
+
synthesis += "\n";
|
|
31
|
+
}
|
|
32
|
+
if (errors.length > 0) {
|
|
33
|
+
synthesis += "### Agent Errors\n";
|
|
34
|
+
for (const err of errors) {
|
|
35
|
+
synthesis += `- **${err.agentName}:** ${err.error}\n`;
|
|
36
|
+
}
|
|
37
|
+
synthesis += "\n";
|
|
38
|
+
}
|
|
39
|
+
// Key themes
|
|
40
|
+
const allReasoning = outputs
|
|
41
|
+
.filter((o) => o.vote?.reasoning)
|
|
42
|
+
.map((o) => o.vote?.reasoning)
|
|
43
|
+
.join(" ");
|
|
44
|
+
const themes = extractThemes(allReasoning);
|
|
45
|
+
if (themes.length > 0) {
|
|
46
|
+
synthesis += "### Key Themes\n";
|
|
47
|
+
for (const theme of themes) {
|
|
48
|
+
synthesis += `- ${theme}\n`;
|
|
49
|
+
}
|
|
50
|
+
synthesis += "\n";
|
|
51
|
+
}
|
|
52
|
+
synthesis += "### Recommendation\n";
|
|
53
|
+
if (approved) {
|
|
54
|
+
synthesis += "The swarm recommends approving this proposal. Proceed to quality control gates.\n";
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
synthesis += "The swarm recommends rejecting this proposal. Review the opposing arguments and consider revising.\n";
|
|
58
|
+
}
|
|
59
|
+
return synthesis;
|
|
60
|
+
}
|
|
61
|
+
function extractThemes(text) {
|
|
62
|
+
// Simple keyword-based theme extraction
|
|
63
|
+
const themes = [];
|
|
64
|
+
const themeKeywords = {
|
|
65
|
+
"Security concerns": ["security", "vulnerability", "exploit", "attack"],
|
|
66
|
+
"Performance impact": ["performance", "latency", "slow", "bottleneck"],
|
|
67
|
+
"User experience": ["ux", "user", "experience", "usability"],
|
|
68
|
+
"Technical debt": ["debt", "legacy", "refactor", "cleanup"],
|
|
69
|
+
Scalability: ["scale", "scaling", "concurrent", "load"],
|
|
70
|
+
"Maintenance burden": ["maintain", "support", "operational"],
|
|
71
|
+
Alignment: ["vision", "strategy", "roadmap", "goal"],
|
|
72
|
+
};
|
|
73
|
+
const lowerText = text.toLowerCase();
|
|
74
|
+
for (const [theme, keywords] of Object.entries(themeKeywords)) {
|
|
75
|
+
if (keywords.some((k) => lowerText.includes(k))) {
|
|
76
|
+
themes.push(theme);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return themes.slice(0, 5); // Max 5 themes
|
|
80
|
+
}
|
|
81
|
+
export function formatSynthesis(synthesis) {
|
|
82
|
+
return synthesis;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/intelligence/synthesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type AlertSeverity = "info" | "warning" | "critical";
|
|
2
|
+
export type AlertCondition = "gt" | "lt" | "eq" | "gte" | "lte";
|
|
3
|
+
export interface AlertRule {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
metric: string;
|
|
8
|
+
condition: AlertCondition;
|
|
9
|
+
threshold: number;
|
|
10
|
+
severity: AlertSeverity;
|
|
11
|
+
duration?: number;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface Alert {
|
|
15
|
+
id: string;
|
|
16
|
+
ruleId: string;
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
severity: AlertSeverity;
|
|
20
|
+
metric: string;
|
|
21
|
+
value: number;
|
|
22
|
+
threshold: number;
|
|
23
|
+
condition: AlertCondition;
|
|
24
|
+
triggeredAt: string;
|
|
25
|
+
resolvedAt?: string;
|
|
26
|
+
status: "firing" | "resolved";
|
|
27
|
+
}
|
|
28
|
+
export declare function createAlertRule(rule: Omit<AlertRule, "id">): AlertRule;
|
|
29
|
+
export declare function removeAlertRule(ruleId: string): boolean;
|
|
30
|
+
export declare function getAlertRules(): AlertRule[];
|
|
31
|
+
export declare function getActiveAlerts(): Alert[];
|
|
32
|
+
export declare function getAllAlerts(): Alert[];
|
|
33
|
+
export declare function resolveAlert(alertId: string): boolean;
|
|
34
|
+
export declare function evaluateRules(): Alert[];
|
|
35
|
+
export declare function formatAlert(alert: Alert): string;
|
|
36
|
+
export declare function formatAlerts(): string;
|
|
37
|
+
export declare const DEFAULT_ALERT_RULES: Omit<AlertRule, "id">[];
|
|
38
|
+
export declare function resetAlerts(): void;
|
|
39
|
+
export declare function initializeDefaultAlertRules(): void;
|
|
40
|
+
//# sourceMappingURL=alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.d.ts","sourceRoot":"","sources":["../../src/observability/alerts.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC/B;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,SAAS,CAItE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED,wBAAgB,aAAa,IAAI,SAAS,EAAE,CAE3C;AAED,wBAAgB,eAAe,IAAI,KAAK,EAAE,CAEzC;AAED,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMrD;AAgCD,wBAAgB,aAAa,IAAI,KAAK,EAAE,CAiCvC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAShD;AAED,wBAAgB,YAAY,IAAI,MAAM,CASrC;AAID,eAAO,MAAM,mBAAmB,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAqCtD,CAAC;AAEF,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Swarm DAO Core — Alerting System
|
|
3
|
+
// ============================================================
|
|
4
|
+
import { getCounter, getGauge, getHistogram } from "./metrics.js";
|
|
5
|
+
const rules = [];
|
|
6
|
+
const alerts = [];
|
|
7
|
+
let alertIdCounter = 1;
|
|
8
|
+
export function createAlertRule(rule) {
|
|
9
|
+
const newRule = { ...rule, id: `rule-${alertIdCounter++}` };
|
|
10
|
+
rules.push(newRule);
|
|
11
|
+
return newRule;
|
|
12
|
+
}
|
|
13
|
+
export function removeAlertRule(ruleId) {
|
|
14
|
+
const index = rules.findIndex((r) => r.id === ruleId);
|
|
15
|
+
if (index === -1)
|
|
16
|
+
return false;
|
|
17
|
+
rules.splice(index, 1);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
export function getAlertRules() {
|
|
21
|
+
return [...rules];
|
|
22
|
+
}
|
|
23
|
+
export function getActiveAlerts() {
|
|
24
|
+
return alerts.filter((a) => a.status === "firing");
|
|
25
|
+
}
|
|
26
|
+
export function getAllAlerts() {
|
|
27
|
+
return [...alerts];
|
|
28
|
+
}
|
|
29
|
+
export function resolveAlert(alertId) {
|
|
30
|
+
const alert = alerts.find((a) => a.id === alertId);
|
|
31
|
+
if (!alert || alert.status === "resolved")
|
|
32
|
+
return false;
|
|
33
|
+
alert.status = "resolved";
|
|
34
|
+
alert.resolvedAt = new Date().toISOString();
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
function evaluateCondition(value, condition, threshold) {
|
|
38
|
+
switch (condition) {
|
|
39
|
+
case "gt":
|
|
40
|
+
return value > threshold;
|
|
41
|
+
case "lt":
|
|
42
|
+
return value < threshold;
|
|
43
|
+
case "eq":
|
|
44
|
+
return value === threshold;
|
|
45
|
+
case "gte":
|
|
46
|
+
return value >= threshold;
|
|
47
|
+
case "lte":
|
|
48
|
+
return value <= threshold;
|
|
49
|
+
default:
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function getMetricValue(metricName) {
|
|
54
|
+
const counter = getCounter(metricName);
|
|
55
|
+
if (counter)
|
|
56
|
+
return counter.getCount();
|
|
57
|
+
const gauge = getGauge(metricName);
|
|
58
|
+
if (gauge)
|
|
59
|
+
return gauge.getValue();
|
|
60
|
+
const histogram = getHistogram(metricName);
|
|
61
|
+
if (histogram)
|
|
62
|
+
return histogram.getCount();
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
export function evaluateRules() {
|
|
66
|
+
const newAlerts = [];
|
|
67
|
+
for (const rule of rules) {
|
|
68
|
+
if (!rule.enabled)
|
|
69
|
+
continue;
|
|
70
|
+
const value = getMetricValue(rule.metric);
|
|
71
|
+
const triggered = evaluateCondition(value, rule.condition, rule.threshold);
|
|
72
|
+
const existing = alerts.find((a) => a.ruleId === rule.id && a.status === "firing");
|
|
73
|
+
if (triggered && !existing) {
|
|
74
|
+
const alert = {
|
|
75
|
+
id: `alert-${alertIdCounter++}`,
|
|
76
|
+
ruleId: rule.id,
|
|
77
|
+
name: rule.name,
|
|
78
|
+
description: rule.description,
|
|
79
|
+
severity: rule.severity,
|
|
80
|
+
metric: rule.metric,
|
|
81
|
+
value,
|
|
82
|
+
threshold: rule.threshold,
|
|
83
|
+
condition: rule.condition,
|
|
84
|
+
triggeredAt: new Date().toISOString(),
|
|
85
|
+
status: "firing",
|
|
86
|
+
};
|
|
87
|
+
alerts.push(alert);
|
|
88
|
+
newAlerts.push(alert);
|
|
89
|
+
}
|
|
90
|
+
else if (!triggered && existing) {
|
|
91
|
+
resolveAlert(existing.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return newAlerts;
|
|
95
|
+
}
|
|
96
|
+
export function formatAlert(alert) {
|
|
97
|
+
const emoji = { info: "ℹ️", warning: "⚠️", critical: "🚨" }[alert.severity];
|
|
98
|
+
const status = alert.status === "firing" ? "🔥 FIRING" : "✅ RESOLVED";
|
|
99
|
+
return (`${emoji} **${alert.name}** — ${status}\n` +
|
|
100
|
+
`Metric: \`${alert.metric}\` = ${alert.value} (threshold: ${alert.condition} ${alert.threshold})\n` +
|
|
101
|
+
`Triggered: ${alert.triggeredAt}${alert.resolvedAt ? ` | Resolved: ${alert.resolvedAt}` : ""}`);
|
|
102
|
+
}
|
|
103
|
+
export function formatAlerts() {
|
|
104
|
+
const active = getActiveAlerts();
|
|
105
|
+
if (active.length === 0)
|
|
106
|
+
return "# 🟢 No Active Alerts\n\nAll systems nominal.";
|
|
107
|
+
let output = "# 🚨 Active Alerts\n\n";
|
|
108
|
+
for (const alert of active) {
|
|
109
|
+
output += `${formatAlert(alert)}\n\n`;
|
|
110
|
+
}
|
|
111
|
+
return output;
|
|
112
|
+
}
|
|
113
|
+
// ── Default Rules ────────────────────────────────────────────
|
|
114
|
+
export const DEFAULT_ALERT_RULES = [
|
|
115
|
+
{
|
|
116
|
+
name: "Low Approval Rate",
|
|
117
|
+
description: "Approval rate has dropped below 40%",
|
|
118
|
+
metric: "dao_approval_rate_percent",
|
|
119
|
+
condition: "lt",
|
|
120
|
+
threshold: 40,
|
|
121
|
+
severity: "warning",
|
|
122
|
+
enabled: true,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: "High Deliberation Time",
|
|
126
|
+
description: "P95 deliberation time exceeds 30 seconds",
|
|
127
|
+
metric: "dao_deliberation_duration_ms",
|
|
128
|
+
condition: "gt",
|
|
129
|
+
threshold: 30000,
|
|
130
|
+
severity: "warning",
|
|
131
|
+
enabled: true,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "No Active Agents",
|
|
135
|
+
description: "Number of active agents has dropped to 0",
|
|
136
|
+
metric: "dao_agent_count",
|
|
137
|
+
condition: "lte",
|
|
138
|
+
threshold: 0,
|
|
139
|
+
severity: "critical",
|
|
140
|
+
enabled: true,
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "Too Many Open Proposals",
|
|
144
|
+
description: "More than 20 proposals are open simultaneously",
|
|
145
|
+
metric: "dao_active_proposals",
|
|
146
|
+
condition: "gt",
|
|
147
|
+
threshold: 20,
|
|
148
|
+
severity: "info",
|
|
149
|
+
enabled: true,
|
|
150
|
+
},
|
|
151
|
+
];
|
|
152
|
+
export function resetAlerts() {
|
|
153
|
+
rules.length = 0;
|
|
154
|
+
alerts.length = 0;
|
|
155
|
+
alertIdCounter = 1;
|
|
156
|
+
}
|
|
157
|
+
export function initializeDefaultAlertRules() {
|
|
158
|
+
for (const rule of DEFAULT_ALERT_RULES) {
|
|
159
|
+
createAlertRule(rule);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/observability/alerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export interface MetricValue {
|
|
2
|
+
name: string;
|
|
3
|
+
value: number;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
labels?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface Counter {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
values: MetricValue[];
|
|
11
|
+
increment(labels?: Record<string, string>): void;
|
|
12
|
+
getCount(labels?: Record<string, string>): number;
|
|
13
|
+
}
|
|
14
|
+
export interface Gauge {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
values: MetricValue[];
|
|
18
|
+
set(value: number, labels?: Record<string, string>): void;
|
|
19
|
+
getValue(labels?: Record<string, string>): number;
|
|
20
|
+
}
|
|
21
|
+
export interface Histogram {
|
|
22
|
+
name: string;
|
|
23
|
+
description: string;
|
|
24
|
+
buckets: number[];
|
|
25
|
+
values: MetricValue[];
|
|
26
|
+
observe(value: number, labels?: Record<string, string>): void;
|
|
27
|
+
getPercentile(p: number, labels?: Record<string, string>): number;
|
|
28
|
+
getCount(labels?: Record<string, string>): number;
|
|
29
|
+
getBucketCounts(labels?: Record<string, string>): Record<string, number>;
|
|
30
|
+
}
|
|
31
|
+
export declare function createCounter(name: string, description: string): Counter;
|
|
32
|
+
export declare function createGauge(name: string, description: string): Gauge;
|
|
33
|
+
export declare function createHistogram(name: string, description: string, buckets?: number[]): Histogram;
|
|
34
|
+
export declare function getCounter(name: string): Counter | undefined;
|
|
35
|
+
export declare function getGauge(name: string): Gauge | undefined;
|
|
36
|
+
export declare function getHistogram(name: string): Histogram | undefined;
|
|
37
|
+
export declare function getAllMetrics(): {
|
|
38
|
+
counters: Counter[];
|
|
39
|
+
gauges: Gauge[];
|
|
40
|
+
histograms: Histogram[];
|
|
41
|
+
};
|
|
42
|
+
export declare function resetMetrics(): void;
|
|
43
|
+
export declare const DAO_METRICS: {
|
|
44
|
+
proposalsCreated: Counter;
|
|
45
|
+
proposalsApproved: Counter;
|
|
46
|
+
proposalsRejected: Counter;
|
|
47
|
+
proposalsExecuted: Counter;
|
|
48
|
+
votesCast: Counter;
|
|
49
|
+
deliberationDuration: Histogram;
|
|
50
|
+
agentResponseTime: Histogram;
|
|
51
|
+
activeProposals: Gauge;
|
|
52
|
+
agentCount: Gauge;
|
|
53
|
+
approvalRate: Gauge;
|
|
54
|
+
};
|
|
55
|
+
export declare function recordProposalCreated(type: string): void;
|
|
56
|
+
export declare function recordProposalApproved(_id: number, type: string): void;
|
|
57
|
+
export declare function recordProposalRejected(_id: number, type: string): void;
|
|
58
|
+
export declare function recordProposalExecuted(_id: number, type: string): void;
|
|
59
|
+
export declare function recordVoteCast(agentId: string, position: string, weight: number): void;
|
|
60
|
+
export declare function recordDeliberationDuration(durationMs: number, proposalId: number): void;
|
|
61
|
+
export declare function recordAgentResponseTime(durationMs: number, agentId: string): void;
|
|
62
|
+
export declare function formatMetrics(): string;
|
|
63
|
+
export declare function formatMetricsPrometheus(): string;
|
|
64
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"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"}
|