@mandible-ai/mandible 0.2.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/LICENSE +21 -0
- package/README.md +391 -0
- package/dist/examples/code-pipeline/index.d.ts +3 -0
- package/dist/examples/code-pipeline/index.d.ts.map +1 -0
- package/dist/examples/code-pipeline/index.js +239 -0
- package/dist/examples/code-pipeline/index.js.map +1 -0
- package/dist/examples/code-pipeline/with-providers.d.ts +3 -0
- package/dist/examples/code-pipeline/with-providers.d.ts.map +1 -0
- package/dist/examples/code-pipeline/with-providers.js +246 -0
- package/dist/examples/code-pipeline/with-providers.js.map +1 -0
- package/dist/examples/docker-pipeline/index.d.ts +3 -0
- package/dist/examples/docker-pipeline/index.d.ts.map +1 -0
- package/dist/examples/docker-pipeline/index.js +235 -0
- package/dist/examples/docker-pipeline/index.js.map +1 -0
- package/dist/examples/github-colony/mandible.config.d.ts +11 -0
- package/dist/examples/github-colony/mandible.config.d.ts.map +1 -0
- package/dist/examples/github-colony/mandible.config.js +63 -0
- package/dist/examples/github-colony/mandible.config.js.map +1 -0
- package/dist/examples/remote-pipeline/index.d.ts +3 -0
- package/dist/examples/remote-pipeline/index.d.ts.map +1 -0
- package/dist/examples/remote-pipeline/index.js +154 -0
- package/dist/examples/remote-pipeline/index.js.map +1 -0
- package/dist/examples/repo-maintenance/fixer.d.ts +80 -0
- package/dist/examples/repo-maintenance/fixer.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/fixer.js +217 -0
- package/dist/examples/repo-maintenance/fixer.js.map +1 -0
- package/dist/examples/repo-maintenance/mandible.config.d.ts +11 -0
- package/dist/examples/repo-maintenance/mandible.config.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/mandible.config.js +34 -0
- package/dist/examples/repo-maintenance/mandible.config.js.map +1 -0
- package/dist/examples/repo-maintenance/scout.d.ts +39 -0
- package/dist/examples/repo-maintenance/scout.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/scout.js +163 -0
- package/dist/examples/repo-maintenance/scout.js.map +1 -0
- package/dist/examples/repo-maintenance/seed.d.ts +3 -0
- package/dist/examples/repo-maintenance/seed.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/seed.js +169 -0
- package/dist/examples/repo-maintenance/seed.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +116 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/server.d.ts +15 -0
- package/dist/src/cli/server.d.ts.map +1 -0
- package/dist/src/cli/server.js +204 -0
- package/dist/src/cli/server.js.map +1 -0
- package/dist/src/cloud/client.d.ts +30 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js +124 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/index.d.ts +5 -0
- package/dist/src/cloud/index.d.ts.map +1 -0
- package/dist/src/cloud/index.js +3 -0
- package/dist/src/cloud/index.js.map +1 -0
- package/dist/src/cloud/types.d.ts +104 -0
- package/dist/src/cloud/types.d.ts.map +1 -0
- package/dist/src/cloud/types.js +9 -0
- package/dist/src/cloud/types.js.map +1 -0
- package/dist/src/core/attestation.d.ts +63 -0
- package/dist/src/core/attestation.d.ts.map +1 -0
- package/dist/src/core/attestation.js +331 -0
- package/dist/src/core/attestation.js.map +1 -0
- package/dist/src/core/events.d.ts +22 -0
- package/dist/src/core/events.d.ts.map +1 -0
- package/dist/src/core/events.js +45 -0
- package/dist/src/core/events.js.map +1 -0
- package/dist/src/core/index.d.ts +8 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +7 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/runtime.d.ts +57 -0
- package/dist/src/core/runtime.d.ts.map +1 -0
- package/dist/src/core/runtime.js +564 -0
- package/dist/src/core/runtime.js.map +1 -0
- package/dist/src/core/signal.d.ts +33 -0
- package/dist/src/core/signal.d.ts.map +1 -0
- package/dist/src/core/signal.js +127 -0
- package/dist/src/core/signal.js.map +1 -0
- package/dist/src/core/types.d.ts +395 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +19 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/validation.d.ts +10 -0
- package/dist/src/core/validation.d.ts.map +1 -0
- package/dist/src/core/validation.js +40 -0
- package/dist/src/core/validation.js.map +1 -0
- package/dist/src/dsl/builder.d.ts +63 -0
- package/dist/src/dsl/builder.d.ts.map +1 -0
- package/dist/src/dsl/builder.js +159 -0
- package/dist/src/dsl/builder.js.map +1 -0
- package/dist/src/dsl/index.d.ts +2 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js +2 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/environments/dolt/adapter.d.ts +45 -0
- package/dist/src/environments/dolt/adapter.d.ts.map +1 -0
- package/dist/src/environments/dolt/adapter.js +128 -0
- package/dist/src/environments/dolt/adapter.js.map +1 -0
- package/dist/src/environments/dolt/index.d.ts +2 -0
- package/dist/src/environments/dolt/index.d.ts.map +1 -0
- package/dist/src/environments/dolt/index.js +2 -0
- package/dist/src/environments/dolt/index.js.map +1 -0
- package/dist/src/environments/filesystem/adapter.d.ts +33 -0
- package/dist/src/environments/filesystem/adapter.d.ts.map +1 -0
- package/dist/src/environments/filesystem/adapter.js +296 -0
- package/dist/src/environments/filesystem/adapter.js.map +1 -0
- package/dist/src/environments/filesystem/index.d.ts +2 -0
- package/dist/src/environments/filesystem/index.d.ts.map +1 -0
- package/dist/src/environments/filesystem/index.js +2 -0
- package/dist/src/environments/filesystem/index.js.map +1 -0
- package/dist/src/environments/github/adapter.d.ts +47 -0
- package/dist/src/environments/github/adapter.d.ts.map +1 -0
- package/dist/src/environments/github/adapter.js +324 -0
- package/dist/src/environments/github/adapter.js.map +1 -0
- package/dist/src/environments/github/client.d.ts +48 -0
- package/dist/src/environments/github/client.d.ts.map +1 -0
- package/dist/src/environments/github/client.js +151 -0
- package/dist/src/environments/github/client.js.map +1 -0
- package/dist/src/environments/github/index.d.ts +5 -0
- package/dist/src/environments/github/index.d.ts.map +1 -0
- package/dist/src/environments/github/index.js +5 -0
- package/dist/src/environments/github/index.js.map +1 -0
- package/dist/src/environments/github/mapper.d.ts +66 -0
- package/dist/src/environments/github/mapper.d.ts.map +1 -0
- package/dist/src/environments/github/mapper.js +240 -0
- package/dist/src/environments/github/mapper.js.map +1 -0
- package/dist/src/environments/github/types.d.ts +71 -0
- package/dist/src/environments/github/types.d.ts.map +1 -0
- package/dist/src/environments/github/types.js +4 -0
- package/dist/src/environments/github/types.js.map +1 -0
- package/dist/src/environments/remote/adapter.d.ts +61 -0
- package/dist/src/environments/remote/adapter.d.ts.map +1 -0
- package/dist/src/environments/remote/adapter.js +392 -0
- package/dist/src/environments/remote/adapter.js.map +1 -0
- package/dist/src/environments/remote/index.d.ts +5 -0
- package/dist/src/environments/remote/index.d.ts.map +1 -0
- package/dist/src/environments/remote/index.js +3 -0
- package/dist/src/environments/remote/index.js.map +1 -0
- package/dist/src/environments/remote/protocol.d.ts +124 -0
- package/dist/src/environments/remote/protocol.d.ts.map +1 -0
- package/dist/src/environments/remote/protocol.js +24 -0
- package/dist/src/environments/remote/protocol.js.map +1 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +31 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/patterns/bridge.d.ts +32 -0
- package/dist/src/patterns/bridge.d.ts.map +1 -0
- package/dist/src/patterns/bridge.js +163 -0
- package/dist/src/patterns/bridge.js.map +1 -0
- package/dist/src/patterns/index.d.ts +5 -0
- package/dist/src/patterns/index.d.ts.map +1 -0
- package/dist/src/patterns/index.js +3 -0
- package/dist/src/patterns/index.js.map +1 -0
- package/dist/src/patterns/sentinel.d.ts +69 -0
- package/dist/src/patterns/sentinel.d.ts.map +1 -0
- package/dist/src/patterns/sentinel.js +184 -0
- package/dist/src/patterns/sentinel.js.map +1 -0
- package/dist/src/providers/agent.d.ts +23 -0
- package/dist/src/providers/agent.d.ts.map +1 -0
- package/dist/src/providers/agent.js +184 -0
- package/dist/src/providers/agent.js.map +1 -0
- package/dist/src/providers/bash.d.ts +13 -0
- package/dist/src/providers/bash.d.ts.map +1 -0
- package/dist/src/providers/bash.js +91 -0
- package/dist/src/providers/bash.js.map +1 -0
- package/dist/src/providers/claude-code.d.ts +23 -0
- package/dist/src/providers/claude-code.d.ts.map +1 -0
- package/dist/src/providers/claude-code.js +184 -0
- package/dist/src/providers/claude-code.js.map +1 -0
- package/dist/src/providers/context.d.ts +12 -0
- package/dist/src/providers/context.d.ts.map +1 -0
- package/dist/src/providers/context.js +160 -0
- package/dist/src/providers/context.js.map +1 -0
- package/dist/src/providers/index.d.ts +6 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +7 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/structured-output.d.ts +7 -0
- package/dist/src/providers/structured-output.d.ts.map +1 -0
- package/dist/src/providers/structured-output.js +316 -0
- package/dist/src/providers/structured-output.js.map +1 -0
- package/dist/src/providers/types.d.ts +239 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +19 -0
- package/dist/src/providers/types.js.map +1 -0
- package/package.json +129 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Context Assembly — Building rich prompts from signal lineage
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Agents work better with context. Instead of just passing the
|
|
5
|
+
// raw signal payload to an LLM, context assembly walks the
|
|
6
|
+
// causal chain and pulls in related signals to build a richer
|
|
7
|
+
// prompt.
|
|
8
|
+
//
|
|
9
|
+
// For a Critic reviewing an artifact, this means automatically
|
|
10
|
+
// including:
|
|
11
|
+
// - The original task description (caused_by lineage)
|
|
12
|
+
// - Previous review feedback (sibling signals)
|
|
13
|
+
// - Related artifacts (signals with matching tags)
|
|
14
|
+
//
|
|
15
|
+
// This is what makes stigmergy-based agents smarter than
|
|
16
|
+
// simple reactive systems — they can see the full history
|
|
17
|
+
// of how a signal came to be, even though no agent explicitly
|
|
18
|
+
// passed that context.
|
|
19
|
+
//
|
|
20
|
+
// Usage:
|
|
21
|
+
// const prompt = await assembleContext(signal, env, {
|
|
22
|
+
// includeLineage: true,
|
|
23
|
+
// lineageDepth: 3,
|
|
24
|
+
// includeSiblings: true,
|
|
25
|
+
// includeRelated: ['review:*'],
|
|
26
|
+
// });
|
|
27
|
+
// ============================================================
|
|
28
|
+
/**
|
|
29
|
+
* Assemble rich context from the signal environment.
|
|
30
|
+
* Returns a formatted string suitable for appending to an LLM prompt.
|
|
31
|
+
*/
|
|
32
|
+
export async function assembleContext(signal, env, config = {}) {
|
|
33
|
+
const sections = [];
|
|
34
|
+
// Current signal
|
|
35
|
+
sections.push(formatSignalSection('Current Signal', signal));
|
|
36
|
+
// Causal lineage — walk up the caused_by chain
|
|
37
|
+
if (config.includeLineage && signal.meta.caused_by?.length) {
|
|
38
|
+
const lineage = await walkLineage(signal, env, config.lineageDepth ?? 3);
|
|
39
|
+
if (lineage.length > 0) {
|
|
40
|
+
sections.push('## Causal Lineage\n' +
|
|
41
|
+
'These signals led to the current one:\n\n' +
|
|
42
|
+
lineage.map((s, i) => `${' '.repeat(i)}→ [${s.type}] ${summarizePayload(s.payload)} ` +
|
|
43
|
+
`(by: ${s.meta.deposited_by}, age: ${formatAge(s.meta.deposited_at)})`).join('\n'));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Sibling signals — other signals caused by the same parent
|
|
47
|
+
if (config.includeSiblings && signal.meta.caused_by?.length) {
|
|
48
|
+
const siblings = await findSiblings(signal, env);
|
|
49
|
+
if (siblings.length > 0) {
|
|
50
|
+
sections.push('## Related Signals (Same Origin)\n' +
|
|
51
|
+
siblings.map(s => `- [${s.type}] ${summarizePayload(s.payload)} ` +
|
|
52
|
+
`(by: ${s.meta.deposited_by}, conc: ${s.meta.concentration.toFixed(2)})`).join('\n'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Related signals by type pattern
|
|
56
|
+
if (config.includeRelated?.length) {
|
|
57
|
+
for (const pattern of config.includeRelated) {
|
|
58
|
+
const related = await env.observe({ type: pattern, limit: 10 });
|
|
59
|
+
if (related.length > 0) {
|
|
60
|
+
sections.push(`## Related: ${pattern}\n` +
|
|
61
|
+
related.map(s => `- [${s.type}] ${summarizePayload(s.payload)} ` +
|
|
62
|
+
`(by: ${s.meta.deposited_by})`).join('\n'));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Custom context builder
|
|
67
|
+
if (config.custom) {
|
|
68
|
+
const custom = await config.custom(signal, env);
|
|
69
|
+
if (custom) {
|
|
70
|
+
sections.push(`## Additional Context\n${custom}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return sections.join('\n\n---\n\n');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Build a complete prompt by combining a base prompt with assembled context.
|
|
77
|
+
*/
|
|
78
|
+
export function withContext(config) {
|
|
79
|
+
return async (basePrompt, signal, env) => {
|
|
80
|
+
const context = await assembleContext(signal, env, config);
|
|
81
|
+
return `${basePrompt}\n\n---\n\n# Context from Environment\n\n${context}`;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// ----------------------------------------------------------
|
|
85
|
+
// Lineage walking
|
|
86
|
+
// ----------------------------------------------------------
|
|
87
|
+
async function walkLineage(signal, env, maxDepth, depth = 0) {
|
|
88
|
+
if (depth >= maxDepth)
|
|
89
|
+
return [];
|
|
90
|
+
if (!signal.meta.caused_by?.length)
|
|
91
|
+
return [];
|
|
92
|
+
const lineage = [];
|
|
93
|
+
for (const parentId of signal.meta.caused_by) {
|
|
94
|
+
// Look in active signals first, then history
|
|
95
|
+
let parent = (await env.observe({ filter: s => s.id === parentId, limit: 1 }))[0];
|
|
96
|
+
if (!parent) {
|
|
97
|
+
parent = (await env.history({ filter: s => s.id === parentId, includeWithdrawn: true, limit: 1 }))[0];
|
|
98
|
+
}
|
|
99
|
+
if (parent) {
|
|
100
|
+
lineage.push(parent);
|
|
101
|
+
// Recurse up the chain
|
|
102
|
+
const ancestors = await walkLineage(parent, env, maxDepth, depth + 1);
|
|
103
|
+
lineage.push(...ancestors);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return lineage;
|
|
107
|
+
}
|
|
108
|
+
// ----------------------------------------------------------
|
|
109
|
+
// Sibling discovery
|
|
110
|
+
// ----------------------------------------------------------
|
|
111
|
+
async function findSiblings(signal, env) {
|
|
112
|
+
if (!signal.meta.caused_by?.length)
|
|
113
|
+
return [];
|
|
114
|
+
// Find all signals that share the same parent(s)
|
|
115
|
+
const allSignals = await env.observe({});
|
|
116
|
+
const allHistory = await env.history({ includeWithdrawn: true });
|
|
117
|
+
const all = [...allSignals, ...allHistory];
|
|
118
|
+
const parentIds = new Set(signal.meta.caused_by);
|
|
119
|
+
return all.filter(s => s.id !== signal.id &&
|
|
120
|
+
s.meta.caused_by?.some(id => parentIds.has(id)));
|
|
121
|
+
}
|
|
122
|
+
// ----------------------------------------------------------
|
|
123
|
+
// Formatting helpers
|
|
124
|
+
// ----------------------------------------------------------
|
|
125
|
+
function formatSignalSection(title, signal) {
|
|
126
|
+
return [
|
|
127
|
+
`## ${title}`,
|
|
128
|
+
`- **Type:** ${signal.type}`,
|
|
129
|
+
`- **ID:** ${signal.id}`,
|
|
130
|
+
`- **Deposited by:** ${signal.meta.deposited_by}`,
|
|
131
|
+
`- **Age:** ${formatAge(signal.meta.deposited_at)}`,
|
|
132
|
+
`- **Concentration:** ${signal.meta.concentration.toFixed(2)}`,
|
|
133
|
+
signal.meta.tags?.length ? `- **Tags:** ${signal.meta.tags.join(', ')}` : '',
|
|
134
|
+
`- **Payload:**\n\`\`\`json\n${JSON.stringify(signal.payload, null, 2)}\n\`\`\``,
|
|
135
|
+
].filter(Boolean).join('\n');
|
|
136
|
+
}
|
|
137
|
+
function summarizePayload(payload) {
|
|
138
|
+
const keys = Object.keys(payload);
|
|
139
|
+
if (keys.length === 0)
|
|
140
|
+
return '{}';
|
|
141
|
+
// Show first meaningful value
|
|
142
|
+
for (const key of ['name', 'task', 'description', 'text', 'message', 'code']) {
|
|
143
|
+
if (payload[key] && typeof payload[key] === 'string') {
|
|
144
|
+
const val = payload[key];
|
|
145
|
+
return val.length > 60 ? val.slice(0, 60) + '...' : val;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return `{${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', ...' : ''}}`;
|
|
149
|
+
}
|
|
150
|
+
function formatAge(depositedAt) {
|
|
151
|
+
const seconds = Math.floor((Date.now() - depositedAt) / 1000);
|
|
152
|
+
if (seconds < 60)
|
|
153
|
+
return `${seconds}s ago`;
|
|
154
|
+
if (seconds < 3600)
|
|
155
|
+
return `${Math.floor(seconds / 60)}m ago`;
|
|
156
|
+
if (seconds < 86400)
|
|
157
|
+
return `${Math.floor(seconds / 3600)}h ago`;
|
|
158
|
+
return `${Math.floor(seconds / 86400)}d ago`;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/providers/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { withClaudeCode, buildDefaultSystemPrompt } from './claude-code.js';
|
|
2
|
+
export { withStructuredOutput } from './structured-output.js';
|
|
3
|
+
export { withBash } from './bash.js';
|
|
4
|
+
export { assembleContext, withContext } from './context.js';
|
|
5
|
+
export type { ActionHandler, ClaudeCodeConfig, AgentResult, StructuredOutputConfig, BashProviderConfig, LLMCallFunction, SignalDeposit, OutputMapping, ContextAssemblyConfig, } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG5D,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,aAAa,EACb,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Action providers
|
|
2
|
+
export { withClaudeCode, buildDefaultSystemPrompt } from './claude-code.js';
|
|
3
|
+
export { withStructuredOutput } from './structured-output.js';
|
|
4
|
+
export { withBash } from './bash.js';
|
|
5
|
+
// Context assembly
|
|
6
|
+
export { assembleContext, withContext } from './context.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StructuredOutputConfig, ActionHandler } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an action handler that calls an LLM for structured output
|
|
4
|
+
* and routes the result to appropriate signal types.
|
|
5
|
+
*/
|
|
6
|
+
export declare function withStructuredOutput<T = Record<string, unknown>, R = Record<string, unknown>>(config: StructuredOutputConfig<T, R>): ActionHandler<T>;
|
|
7
|
+
//# sourceMappingURL=structured-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../../src/providers/structured-output.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EACV,sBAAsB,EACtB,aAAa,EAId,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE3B,MAAM,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,GACnC,aAAa,CAAC,CAAC,CAAC,CAwElB"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// withStructuredOutput — Multi-provider structured output
|
|
3
|
+
// ============================================================
|
|
4
|
+
// Calls an LLM, validates the response against a schema, and
|
|
5
|
+
// routes the result to different signal types based on content.
|
|
6
|
+
//
|
|
7
|
+
// This is the medium-weight provider — use it for colonies that
|
|
8
|
+
// need LLM judgment but not full tool-use loops (Critics,
|
|
9
|
+
// Classifiers, Routers).
|
|
10
|
+
//
|
|
11
|
+
// Provider-agnostic: works with Anthropic, OpenAI, or any custom
|
|
12
|
+
// LLM function. Pass `provider` to select, or pass a function
|
|
13
|
+
// directly for custom providers.
|
|
14
|
+
//
|
|
15
|
+
// Usage:
|
|
16
|
+
// colony('critic')
|
|
17
|
+
// .do('review', withStructuredOutput({
|
|
18
|
+
// model: 'claude-sonnet-4-5-20250929',
|
|
19
|
+
// provider: 'anthropic',
|
|
20
|
+
// schema: z.object({
|
|
21
|
+
// approved: z.boolean(),
|
|
22
|
+
// feedback: z.string(),
|
|
23
|
+
// severity: z.enum(['minor', 'major', 'blocking']),
|
|
24
|
+
// }),
|
|
25
|
+
// prompt: (signal) => `Review this code:\n${signal.payload.code}`,
|
|
26
|
+
// route: (result) => result.approved
|
|
27
|
+
// ? { type: 'review:approved', payload: result }
|
|
28
|
+
// : { type: 'review:changes-needed', payload: result },
|
|
29
|
+
// }))
|
|
30
|
+
// .build();
|
|
31
|
+
// ============================================================
|
|
32
|
+
/**
|
|
33
|
+
* Creates an action handler that calls an LLM for structured output
|
|
34
|
+
* and routes the result to appropriate signal types.
|
|
35
|
+
*/
|
|
36
|
+
export function withStructuredOutput(config) {
|
|
37
|
+
const { model, provider = 'anthropic', prompt, systemPrompt, schema, maxTokens = 4096, temperature = 0, route, autoWithdraw = true, bedrockConfig, } = config;
|
|
38
|
+
return async (signal, ctx) => {
|
|
39
|
+
// 1. Resolve the prompt
|
|
40
|
+
const resolvedPrompt = typeof prompt === 'function'
|
|
41
|
+
? await prompt(signal)
|
|
42
|
+
: prompt;
|
|
43
|
+
// 2. Build the full prompt with schema instructions
|
|
44
|
+
const fullPrompt = schema
|
|
45
|
+
? `${resolvedPrompt}\n\nRespond with valid JSON matching this schema:\n${schemaToString(schema)}`
|
|
46
|
+
: resolvedPrompt;
|
|
47
|
+
// 3. Call the LLM
|
|
48
|
+
let result;
|
|
49
|
+
if (typeof provider === 'function') {
|
|
50
|
+
// Custom provider function
|
|
51
|
+
result = await provider(fullPrompt, {
|
|
52
|
+
systemPrompt,
|
|
53
|
+
maxTokens,
|
|
54
|
+
temperature,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
result = await callProvider(provider, model, fullPrompt, {
|
|
59
|
+
systemPrompt,
|
|
60
|
+
maxTokens,
|
|
61
|
+
temperature,
|
|
62
|
+
schema,
|
|
63
|
+
bedrockConfig,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// 4. Validate against schema if provided
|
|
67
|
+
if (schema && typeof schema.parse === 'function') {
|
|
68
|
+
try {
|
|
69
|
+
result = schema.parse(result);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
ctx.log(`Schema validation failed: ${err.message}`, 'error');
|
|
73
|
+
throw new Error(`Structured output validation failed: ${err.message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 5. Route to signal deposits
|
|
77
|
+
const deposits = resolveRoute(route, result, signal);
|
|
78
|
+
for (const deposit of deposits) {
|
|
79
|
+
await ctx.deposit(deposit.type, deposit.payload ?? result, {
|
|
80
|
+
causedBy: [signal.id],
|
|
81
|
+
tags: deposit.tags,
|
|
82
|
+
ttl: deposit.ttl,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// 6. Withdraw
|
|
86
|
+
if (autoWithdraw) {
|
|
87
|
+
await ctx.withdraw(signal.id);
|
|
88
|
+
}
|
|
89
|
+
ctx.log(`Structured output completed. Deposited ${deposits.length} signal(s).`);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ----------------------------------------------------------
|
|
93
|
+
// Provider implementations
|
|
94
|
+
// ----------------------------------------------------------
|
|
95
|
+
async function callProvider(provider, model, prompt, options) {
|
|
96
|
+
switch (provider) {
|
|
97
|
+
case 'anthropic':
|
|
98
|
+
return callAnthropic(model, prompt, options);
|
|
99
|
+
case 'bedrock':
|
|
100
|
+
return callBedrock(model, prompt, options);
|
|
101
|
+
case 'openai':
|
|
102
|
+
return callOpenAI(model, prompt, options);
|
|
103
|
+
case 'vercel-ai':
|
|
104
|
+
return callVercelAI(model, prompt, options);
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Unknown provider: ${provider}. Use 'anthropic', 'bedrock', 'openai', 'vercel-ai', or pass a custom function.`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function callAnthropic(model, prompt, options) {
|
|
110
|
+
try {
|
|
111
|
+
const { default: Anthropic } = await import('@anthropic-ai/sdk');
|
|
112
|
+
const client = new Anthropic();
|
|
113
|
+
const response = await client.messages.create({
|
|
114
|
+
model,
|
|
115
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
116
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
117
|
+
...(options.systemPrompt ? { system: options.systemPrompt } : {}),
|
|
118
|
+
messages: [{ role: 'user', content: prompt }],
|
|
119
|
+
});
|
|
120
|
+
// Extract text and parse as JSON
|
|
121
|
+
const text = response.content
|
|
122
|
+
.filter((block) => block.type === 'text')
|
|
123
|
+
.map((block) => block.text)
|
|
124
|
+
.join('');
|
|
125
|
+
return parseJsonResponse(text);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
129
|
+
throw new Error('Anthropic provider requires @anthropic-ai/sdk. Install it:\n' +
|
|
130
|
+
' npm install @anthropic-ai/sdk');
|
|
131
|
+
}
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function callBedrock(model, prompt, options) {
|
|
136
|
+
if (!options.bedrockConfig) {
|
|
137
|
+
throw new Error("Bedrock provider requires bedrockConfig. Pass { provider: 'bedrock', bedrockConfig: { region: '...' } }.");
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
// @ts-expect-error — optional peer dependency, may not be installed
|
|
141
|
+
const { default: AnthropicBedrock } = await import('@anthropic-ai/bedrock-sdk');
|
|
142
|
+
const clientOptions = {
|
|
143
|
+
awsRegion: options.bedrockConfig.region,
|
|
144
|
+
};
|
|
145
|
+
if (options.bedrockConfig.accessKeyId)
|
|
146
|
+
clientOptions.awsAccessKey = options.bedrockConfig.accessKeyId;
|
|
147
|
+
if (options.bedrockConfig.secretAccessKey)
|
|
148
|
+
clientOptions.awsSecretKey = options.bedrockConfig.secretAccessKey;
|
|
149
|
+
if (options.bedrockConfig.sessionToken)
|
|
150
|
+
clientOptions.awsSessionToken = options.bedrockConfig.sessionToken;
|
|
151
|
+
if (options.bedrockConfig.profile)
|
|
152
|
+
clientOptions.awsProfile = options.bedrockConfig.profile;
|
|
153
|
+
const client = new AnthropicBedrock(clientOptions);
|
|
154
|
+
const requestOptions = {
|
|
155
|
+
model: options.bedrockConfig.model ?? model,
|
|
156
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
157
|
+
messages: [{ role: 'user', content: prompt }],
|
|
158
|
+
};
|
|
159
|
+
if (options.temperature !== undefined)
|
|
160
|
+
requestOptions.temperature = options.temperature;
|
|
161
|
+
if (options.systemPrompt)
|
|
162
|
+
requestOptions.system = options.systemPrompt;
|
|
163
|
+
const response = await client.messages.create(requestOptions);
|
|
164
|
+
const text = response.content
|
|
165
|
+
.filter((block) => block.type === 'text')
|
|
166
|
+
.map((block) => block.text)
|
|
167
|
+
.join('');
|
|
168
|
+
return parseJsonResponse(text);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
172
|
+
throw new Error('Bedrock provider requires @anthropic-ai/bedrock-sdk. Install it:\n' +
|
|
173
|
+
' npm install @anthropic-ai/bedrock-sdk');
|
|
174
|
+
}
|
|
175
|
+
throw err;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function callOpenAI(model, prompt, options) {
|
|
179
|
+
try {
|
|
180
|
+
const { default: OpenAI } = await import('openai');
|
|
181
|
+
const client = new OpenAI();
|
|
182
|
+
const messages = [];
|
|
183
|
+
if (options.systemPrompt) {
|
|
184
|
+
messages.push({ role: 'system', content: options.systemPrompt });
|
|
185
|
+
}
|
|
186
|
+
messages.push({ role: 'user', content: prompt });
|
|
187
|
+
// Use structured output if schema is available and model supports it
|
|
188
|
+
const response = await client.chat.completions.create({
|
|
189
|
+
model,
|
|
190
|
+
messages,
|
|
191
|
+
max_tokens: options.maxTokens ?? 4096,
|
|
192
|
+
temperature: options.temperature ?? 0,
|
|
193
|
+
response_format: { type: 'json_object' },
|
|
194
|
+
});
|
|
195
|
+
const text = response.choices[0]?.message?.content ?? '{}';
|
|
196
|
+
return parseJsonResponse(text);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
200
|
+
throw new Error('OpenAI provider requires openai. Install it:\n' +
|
|
201
|
+
' npm install openai');
|
|
202
|
+
}
|
|
203
|
+
throw err;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function callVercelAI(model, prompt, options) {
|
|
207
|
+
try {
|
|
208
|
+
const { generateObject, generateText } = await import('ai');
|
|
209
|
+
// If we have a Zod schema, use generateObject for validated structured output
|
|
210
|
+
if (options.schema) {
|
|
211
|
+
// Vercel AI SDK needs a model instance, not a string.
|
|
212
|
+
// The caller should configure the model provider externally.
|
|
213
|
+
// For now, try to auto-detect based on model name.
|
|
214
|
+
const modelInstance = await resolveVercelModel(model);
|
|
215
|
+
const { object } = await generateObject({
|
|
216
|
+
model: modelInstance,
|
|
217
|
+
schema: options.schema,
|
|
218
|
+
prompt,
|
|
219
|
+
...(options.systemPrompt ? { system: options.systemPrompt } : {}),
|
|
220
|
+
...(options.maxTokens ? { maxTokens: options.maxTokens } : {}),
|
|
221
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
222
|
+
});
|
|
223
|
+
return object;
|
|
224
|
+
}
|
|
225
|
+
// Fallback to text generation + JSON parse
|
|
226
|
+
const modelInstance = await resolveVercelModel(model);
|
|
227
|
+
const { text } = await generateText({
|
|
228
|
+
model: modelInstance,
|
|
229
|
+
prompt,
|
|
230
|
+
...(options.systemPrompt ? { system: options.systemPrompt } : {}),
|
|
231
|
+
...(options.maxTokens ? { maxTokens: options.maxTokens } : {}),
|
|
232
|
+
...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
|
|
233
|
+
});
|
|
234
|
+
return parseJsonResponse(text);
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
238
|
+
throw new Error('Vercel AI provider requires ai and a model provider. Install them:\n' +
|
|
239
|
+
' npm install ai @ai-sdk/anthropic\n' +
|
|
240
|
+
' # or: npm install ai @ai-sdk/openai');
|
|
241
|
+
}
|
|
242
|
+
throw err;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Resolve a model string to a Vercel AI SDK model instance.
|
|
247
|
+
* Auto-detects provider based on model name prefix.
|
|
248
|
+
*/
|
|
249
|
+
async function resolveVercelModel(model) {
|
|
250
|
+
if (model.startsWith('claude') || model.startsWith('anthropic/')) {
|
|
251
|
+
const { anthropic } = await import('@ai-sdk/anthropic');
|
|
252
|
+
return anthropic(model.replace('anthropic/', ''));
|
|
253
|
+
}
|
|
254
|
+
if (model.startsWith('gpt') || model.startsWith('openai/')) {
|
|
255
|
+
const { openai } = await import('@ai-sdk/openai');
|
|
256
|
+
return openai(model.replace('openai/', ''));
|
|
257
|
+
}
|
|
258
|
+
if (model.startsWith('gemini') || model.startsWith('google/')) {
|
|
259
|
+
const { google } = await import('@ai-sdk/google');
|
|
260
|
+
return google(model.replace('google/', ''));
|
|
261
|
+
}
|
|
262
|
+
// Default to Anthropic
|
|
263
|
+
const { anthropic } = await import('@ai-sdk/anthropic');
|
|
264
|
+
return anthropic(model);
|
|
265
|
+
}
|
|
266
|
+
// ----------------------------------------------------------
|
|
267
|
+
// Helpers
|
|
268
|
+
// ----------------------------------------------------------
|
|
269
|
+
function parseJsonResponse(text) {
|
|
270
|
+
// Try to extract JSON from the response (handles markdown code blocks)
|
|
271
|
+
const jsonMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/) ?? [null, text];
|
|
272
|
+
const jsonStr = (jsonMatch[1] ?? text).trim();
|
|
273
|
+
try {
|
|
274
|
+
return JSON.parse(jsonStr);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
throw new Error(`Failed to parse LLM response as JSON.\nResponse:\n${text.slice(0, 500)}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function schemaToString(schema) {
|
|
281
|
+
// If it's a Zod schema, try to get its description
|
|
282
|
+
if (typeof schema.describe === 'function') {
|
|
283
|
+
return JSON.stringify(schema.describe(), null, 2);
|
|
284
|
+
}
|
|
285
|
+
// If it has a shape (Zod object), describe the shape
|
|
286
|
+
if (schema._def?.shape) {
|
|
287
|
+
const shape = {};
|
|
288
|
+
for (const [key, val] of Object.entries(schema._def.shape())) {
|
|
289
|
+
shape[key] = describeZodType(val);
|
|
290
|
+
}
|
|
291
|
+
return JSON.stringify(shape, null, 2);
|
|
292
|
+
}
|
|
293
|
+
return String(schema);
|
|
294
|
+
}
|
|
295
|
+
function describeZodType(zodType) {
|
|
296
|
+
const def = zodType?._def;
|
|
297
|
+
if (!def)
|
|
298
|
+
return 'unknown';
|
|
299
|
+
switch (def.typeName) {
|
|
300
|
+
case 'ZodString': return 'string';
|
|
301
|
+
case 'ZodNumber': return 'number';
|
|
302
|
+
case 'ZodBoolean': return 'boolean';
|
|
303
|
+
case 'ZodEnum': return `enum(${def.values.join(' | ')})`;
|
|
304
|
+
case 'ZodArray': return `array<${describeZodType(def.type)}>`;
|
|
305
|
+
case 'ZodOptional': return `${describeZodType(def.innerType)}?`;
|
|
306
|
+
default: return def.typeName ?? 'unknown';
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
function resolveRoute(route, result, signal) {
|
|
310
|
+
if (typeof route === 'string') {
|
|
311
|
+
return [{ type: route, payload: result }];
|
|
312
|
+
}
|
|
313
|
+
const mapped = route(result, signal);
|
|
314
|
+
return Array.isArray(mapped) ? mapped : [mapped];
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../../src/providers/structured-output.ts"],"names":[],"mappings":"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"}
|