rust-kgdb 0.6.5 → 0.6.7
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/hypermind-agent.js +502 -0
- package/index.js +20 -0
- package/package.json +1 -1
package/hypermind-agent.js
CHANGED
|
@@ -62,6 +62,250 @@ const TypeId = {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// TOOL REGISTRY - All available tools as typed morphisms (Category Theory)
|
|
67
|
+
// ============================================================================
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* TOOL_REGISTRY - All available tools as typed morphisms
|
|
71
|
+
* Each tool is an arrow: Input Type → Output Type
|
|
72
|
+
*/
|
|
73
|
+
const TOOL_REGISTRY = {
|
|
74
|
+
'kg.sparql.query': {
|
|
75
|
+
name: 'kg.sparql.query',
|
|
76
|
+
input: 'Query',
|
|
77
|
+
output: 'BindingSet',
|
|
78
|
+
description: 'Execute SPARQL query on knowledge graph',
|
|
79
|
+
domain: 'kg',
|
|
80
|
+
patterns: {
|
|
81
|
+
select: 'SELECT ?var WHERE { ... }',
|
|
82
|
+
construct: 'CONSTRUCT { ... } WHERE { ... }',
|
|
83
|
+
ask: 'ASK WHERE { ... }'
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
'kg.sparql.update': {
|
|
87
|
+
name: 'kg.sparql.update',
|
|
88
|
+
input: 'UpdateQuery',
|
|
89
|
+
output: 'Unit',
|
|
90
|
+
description: 'Execute SPARQL update (INSERT/DELETE)',
|
|
91
|
+
domain: 'kg'
|
|
92
|
+
},
|
|
93
|
+
'kg.motif.find': {
|
|
94
|
+
name: 'kg.motif.find',
|
|
95
|
+
input: 'MotifPattern',
|
|
96
|
+
output: 'PatternSet',
|
|
97
|
+
description: 'Find graph motif patterns',
|
|
98
|
+
domain: 'kg',
|
|
99
|
+
patterns: {
|
|
100
|
+
triangle: '(a)-[]->(b); (b)-[]->(c); (c)-[]->(a)',
|
|
101
|
+
star: '(center)-[]->(n1); (center)-[]->(n2); (center)-[]->(n3)',
|
|
102
|
+
path: '(a)-[]->(b); (b)-[]->(c)'
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
'kg.datalog.apply': {
|
|
106
|
+
name: 'kg.datalog.apply',
|
|
107
|
+
input: 'DatalogRules',
|
|
108
|
+
output: 'InferredFacts',
|
|
109
|
+
description: 'Apply Datalog rules for logical inference',
|
|
110
|
+
domain: 'kg',
|
|
111
|
+
prebuiltRules: {
|
|
112
|
+
transitivity: 'reachable(X,Z) :- edge(X,Y), reachable(Y,Z)',
|
|
113
|
+
circular_payment: 'circular(A,B,C) :- transfers(A,B), transfers(B,C), transfers(C,A)'
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
'kg.datalog.infer': {
|
|
117
|
+
name: 'kg.datalog.infer',
|
|
118
|
+
input: 'InferenceRequest',
|
|
119
|
+
output: 'InferredFacts',
|
|
120
|
+
description: 'Run semi-naive Datalog inference',
|
|
121
|
+
domain: 'kg'
|
|
122
|
+
},
|
|
123
|
+
'kg.embeddings.search': {
|
|
124
|
+
name: 'kg.embeddings.search',
|
|
125
|
+
input: 'Entity',
|
|
126
|
+
output: 'SimilarEntities',
|
|
127
|
+
description: 'Find semantically similar entities via HNSW',
|
|
128
|
+
domain: 'kg',
|
|
129
|
+
constraints: { k: 'Int64', threshold: 'Float64' }
|
|
130
|
+
},
|
|
131
|
+
'kg.graphframes.pagerank': {
|
|
132
|
+
name: 'kg.graphframes.pagerank',
|
|
133
|
+
input: 'Graph',
|
|
134
|
+
output: 'Rankings',
|
|
135
|
+
description: 'Compute PageRank on graph',
|
|
136
|
+
domain: 'kg',
|
|
137
|
+
constraints: { dampingFactor: 0.85, maxIterations: 20 }
|
|
138
|
+
},
|
|
139
|
+
'kg.graphframes.connected_components': {
|
|
140
|
+
name: 'kg.graphframes.connected_components',
|
|
141
|
+
input: 'Graph',
|
|
142
|
+
output: 'Components',
|
|
143
|
+
description: 'Find connected components in graph',
|
|
144
|
+
domain: 'kg'
|
|
145
|
+
},
|
|
146
|
+
'kg.graphframes.shortest_paths': {
|
|
147
|
+
name: 'kg.graphframes.shortest_paths',
|
|
148
|
+
input: 'Graph',
|
|
149
|
+
output: 'Distances',
|
|
150
|
+
description: 'Compute shortest paths from landmarks',
|
|
151
|
+
domain: 'kg'
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// LLM PLANNER - Natural language to typed tool pipelines
|
|
157
|
+
// ============================================================================
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* LLMPlanner - Converts natural language prompts into validated execution plans
|
|
161
|
+
* Uses type checking (Curry-Howard correspondence) to ensure correctness
|
|
162
|
+
*/
|
|
163
|
+
class LLMPlanner {
|
|
164
|
+
constructor(model, tools = TOOL_REGISTRY) {
|
|
165
|
+
this.model = model
|
|
166
|
+
this.tools = tools
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Generate execution plan from natural language
|
|
171
|
+
* @param {string} prompt - Natural language query
|
|
172
|
+
* @param {Object} context - Optional context for planning
|
|
173
|
+
* @returns {Promise<Object>} - Execution plan with typed steps
|
|
174
|
+
*/
|
|
175
|
+
async plan(prompt, context = {}) {
|
|
176
|
+
const planId = `plan-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
|
|
177
|
+
|
|
178
|
+
// Analyze prompt to determine intent and required tools
|
|
179
|
+
const intent = this._analyzeIntent(prompt)
|
|
180
|
+
|
|
181
|
+
// Generate typed steps based on intent
|
|
182
|
+
const steps = this._generateSteps(intent, context)
|
|
183
|
+
|
|
184
|
+
// Build type chain for composition validation
|
|
185
|
+
const typeChain = this._buildTypeChain(steps)
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
id: planId,
|
|
189
|
+
prompt,
|
|
190
|
+
intent,
|
|
191
|
+
steps,
|
|
192
|
+
type_chain: typeChain,
|
|
193
|
+
confidence: this._calculateConfidence(steps, intent),
|
|
194
|
+
explanation: this._generateExplanation(steps, intent)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
_analyzeIntent(prompt) {
|
|
199
|
+
const lowerPrompt = prompt.toLowerCase()
|
|
200
|
+
|
|
201
|
+
// Intent detection based on keywords
|
|
202
|
+
const intents = {
|
|
203
|
+
query: ['find', 'search', 'list', 'show', 'get', 'select'],
|
|
204
|
+
infer: ['infer', 'deduce', 'derive', 'reason', 'conclude'],
|
|
205
|
+
similar: ['similar', 'like', 'related', 'nearest', 'closest'],
|
|
206
|
+
pattern: ['pattern', 'motif', 'circular', 'cycle', 'ring'],
|
|
207
|
+
rank: ['rank', 'important', 'pagerank', 'score'],
|
|
208
|
+
compliance: ['compliance', 'check', 'validate', 'verify']
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const detected = {}
|
|
212
|
+
for (const [intentType, keywords] of Object.entries(intents)) {
|
|
213
|
+
detected[intentType] = keywords.some(k => lowerPrompt.includes(k))
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return detected
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
_generateSteps(intent, context) {
|
|
220
|
+
const steps = []
|
|
221
|
+
let stepId = 1
|
|
222
|
+
|
|
223
|
+
// Add SPARQL query step if query intent detected
|
|
224
|
+
if (intent.query || intent.compliance) {
|
|
225
|
+
steps.push({
|
|
226
|
+
id: stepId++,
|
|
227
|
+
tool: 'kg.sparql.query',
|
|
228
|
+
input_type: 'Query',
|
|
229
|
+
output_type: 'BindingSet',
|
|
230
|
+
args: { sparql: context.sparql || 'SELECT * WHERE { ?s ?p ?o } LIMIT 100' }
|
|
231
|
+
})
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Add pattern finding if pattern intent detected
|
|
235
|
+
if (intent.pattern) {
|
|
236
|
+
steps.push({
|
|
237
|
+
id: stepId++,
|
|
238
|
+
tool: 'kg.motif.find',
|
|
239
|
+
input_type: 'MotifPattern',
|
|
240
|
+
output_type: 'PatternSet',
|
|
241
|
+
args: { pattern: context.pattern || '(a)-[]->(b); (b)-[]->(c); (c)-[]->(a)' }
|
|
242
|
+
})
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Add inference if infer intent detected
|
|
246
|
+
if (intent.infer) {
|
|
247
|
+
steps.push({
|
|
248
|
+
id: stepId++,
|
|
249
|
+
tool: 'kg.datalog.apply',
|
|
250
|
+
input_type: 'DatalogRules',
|
|
251
|
+
output_type: 'InferredFacts',
|
|
252
|
+
args: { rules: context.rules || [] }
|
|
253
|
+
})
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Add similarity search if similar intent detected
|
|
257
|
+
if (intent.similar) {
|
|
258
|
+
steps.push({
|
|
259
|
+
id: stepId++,
|
|
260
|
+
tool: 'kg.embeddings.search',
|
|
261
|
+
input_type: 'Entity',
|
|
262
|
+
output_type: 'SimilarEntities',
|
|
263
|
+
args: { k: 10, threshold: 0.7 }
|
|
264
|
+
})
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Add ranking if rank intent detected
|
|
268
|
+
if (intent.rank) {
|
|
269
|
+
steps.push({
|
|
270
|
+
id: stepId++,
|
|
271
|
+
tool: 'kg.graphframes.pagerank',
|
|
272
|
+
input_type: 'Graph',
|
|
273
|
+
output_type: 'Rankings',
|
|
274
|
+
args: { dampingFactor: 0.85, maxIterations: 20 }
|
|
275
|
+
})
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Default to SPARQL query if no specific intent detected
|
|
279
|
+
if (steps.length === 0) {
|
|
280
|
+
steps.push({
|
|
281
|
+
id: stepId++,
|
|
282
|
+
tool: 'kg.sparql.query',
|
|
283
|
+
input_type: 'Query',
|
|
284
|
+
output_type: 'BindingSet',
|
|
285
|
+
args: { sparql: 'SELECT * WHERE { ?s ?p ?o } LIMIT 100' }
|
|
286
|
+
})
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return steps
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
_buildTypeChain(steps) {
|
|
293
|
+
return steps.map(s => `${s.input_type} → ${s.output_type}`).join(' ; ')
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
_calculateConfidence(steps, intent) {
|
|
297
|
+
// Higher confidence if intent matches tool selection
|
|
298
|
+
const matchedIntents = Object.values(intent).filter(v => v).length
|
|
299
|
+
return Math.min(0.95, 0.7 + (matchedIntents * 0.05))
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
_generateExplanation(steps, intent) {
|
|
303
|
+
const toolNames = steps.map(s => s.tool).join(', ')
|
|
304
|
+
return `Plan uses ${steps.length} tool(s): ${toolNames}. ` +
|
|
305
|
+
`Detected intents: ${Object.entries(intent).filter(([_, v]) => v).map(([k]) => k).join(', ') || 'general query'}.`
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
65
309
|
// ============================================================================
|
|
66
310
|
// PROOF NODE (Explainable AI - No Hallucination)
|
|
67
311
|
// ============================================================================
|
|
@@ -1369,6 +1613,256 @@ class AgentScope {
|
|
|
1369
1613
|
}
|
|
1370
1614
|
}
|
|
1371
1615
|
|
|
1616
|
+
// ============================================================================
|
|
1617
|
+
// ComposedAgent - Agent with sandbox execution and witness generation
|
|
1618
|
+
// ============================================================================
|
|
1619
|
+
|
|
1620
|
+
/**
|
|
1621
|
+
* ComposedAgent - Agent with sandbox execution and witness generation
|
|
1622
|
+
* Built using AgentBuilder fluent API
|
|
1623
|
+
*/
|
|
1624
|
+
class ComposedAgent {
|
|
1625
|
+
constructor(config) {
|
|
1626
|
+
this.name = config.name
|
|
1627
|
+
this.tools = config.tools || []
|
|
1628
|
+
this.planner = config.planner || 'claude-sonnet-4'
|
|
1629
|
+
this.sandboxConfig = config.sandbox || { capabilities: ['ReadKG'], fuelLimit: 1000000 }
|
|
1630
|
+
this.hooks = config.hooks || {}
|
|
1631
|
+
this.sandbox = new WasmSandbox(this.sandboxConfig)
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
/**
|
|
1635
|
+
* Execute with natural language prompt
|
|
1636
|
+
* @param {string} prompt - Natural language query
|
|
1637
|
+
* @returns {Promise<Object>} - Execution result with witness
|
|
1638
|
+
*/
|
|
1639
|
+
async call(prompt) {
|
|
1640
|
+
const startTime = Date.now()
|
|
1641
|
+
const planId = `plan-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`
|
|
1642
|
+
|
|
1643
|
+
// Fire beforePlan hook
|
|
1644
|
+
if (this.hooks.beforePlan) {
|
|
1645
|
+
this.hooks.beforePlan({ prompt, agent: this.name })
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
// Create plan (in production, this would call LLM)
|
|
1649
|
+
const plan = {
|
|
1650
|
+
id: planId,
|
|
1651
|
+
steps: this.tools.map((tool, i) => ({
|
|
1652
|
+
step: i + 1,
|
|
1653
|
+
tool: tool.name || tool,
|
|
1654
|
+
input: prompt
|
|
1655
|
+
})),
|
|
1656
|
+
confidence: 0.95
|
|
1657
|
+
}
|
|
1658
|
+
|
|
1659
|
+
// Fire afterPlan hook
|
|
1660
|
+
if (this.hooks.afterPlan) {
|
|
1661
|
+
this.hooks.afterPlan({ plan, agent: this.name })
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
// Fire beforeExecute hook
|
|
1665
|
+
if (this.hooks.beforeExecute) {
|
|
1666
|
+
this.hooks.beforeExecute({ plan, agent: this.name })
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
// Execute plan steps
|
|
1670
|
+
const results = []
|
|
1671
|
+
for (const step of plan.steps) {
|
|
1672
|
+
try {
|
|
1673
|
+
// Execute in sandbox
|
|
1674
|
+
const result = await this.sandbox.execute(step.tool, step.input)
|
|
1675
|
+
results.push({
|
|
1676
|
+
step: step,
|
|
1677
|
+
result: result,
|
|
1678
|
+
status: 'completed'
|
|
1679
|
+
})
|
|
1680
|
+
} catch (error) {
|
|
1681
|
+
results.push({
|
|
1682
|
+
step: step,
|
|
1683
|
+
error: error.message,
|
|
1684
|
+
status: 'failed'
|
|
1685
|
+
})
|
|
1686
|
+
if (this.hooks.onError) {
|
|
1687
|
+
this.hooks.onError({ step, error, agent: this.name })
|
|
1688
|
+
}
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
const endTime = Date.now()
|
|
1693
|
+
|
|
1694
|
+
// Generate execution witness
|
|
1695
|
+
const witness = {
|
|
1696
|
+
witness_version: '1.0.0',
|
|
1697
|
+
timestamp: new Date().toISOString(),
|
|
1698
|
+
agent: this.name,
|
|
1699
|
+
model: this.planner,
|
|
1700
|
+
plan: {
|
|
1701
|
+
id: plan.id,
|
|
1702
|
+
steps: plan.steps.length,
|
|
1703
|
+
confidence: plan.confidence
|
|
1704
|
+
},
|
|
1705
|
+
execution: {
|
|
1706
|
+
tool_calls: results.map(r => ({
|
|
1707
|
+
tool: r.step.tool,
|
|
1708
|
+
status: r.status
|
|
1709
|
+
}))
|
|
1710
|
+
},
|
|
1711
|
+
sandbox_metrics: this.sandbox.getMetrics ? this.sandbox.getMetrics() : {},
|
|
1712
|
+
audit_log: this.sandbox.getAuditLog ? this.sandbox.getAuditLog() : [],
|
|
1713
|
+
proof_hash: this._generateProofHash(plan, results)
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
const response = {
|
|
1717
|
+
response: `Executed ${results.filter(r => r.status === 'completed').length}/${results.length} steps successfully`,
|
|
1718
|
+
plan,
|
|
1719
|
+
results,
|
|
1720
|
+
witness,
|
|
1721
|
+
metrics: {
|
|
1722
|
+
total_time_ms: endTime - startTime,
|
|
1723
|
+
tool_calls: results.length
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1727
|
+
// Fire afterExecute hook
|
|
1728
|
+
if (this.hooks.afterExecute) {
|
|
1729
|
+
this.hooks.afterExecute(response)
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
return response
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
_generateProofHash(plan, results) {
|
|
1736
|
+
// Simple hash generation - in production use crypto
|
|
1737
|
+
const data = JSON.stringify({ plan: plan.id, results: results.length, timestamp: Date.now() })
|
|
1738
|
+
let hash = 0
|
|
1739
|
+
for (let i = 0; i < data.length; i++) {
|
|
1740
|
+
const char = data.charCodeAt(i)
|
|
1741
|
+
hash = ((hash << 5) - hash) + char
|
|
1742
|
+
hash = hash & hash
|
|
1743
|
+
}
|
|
1744
|
+
return `sha256:${Math.abs(hash).toString(16).padStart(16, '0')}`
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
// ============================================================================
|
|
1749
|
+
// AgentBuilder - Fluent builder for agent composition
|
|
1750
|
+
// ============================================================================
|
|
1751
|
+
|
|
1752
|
+
/**
|
|
1753
|
+
* AgentBuilder - Fluent builder pattern for composing agents
|
|
1754
|
+
*
|
|
1755
|
+
* @example
|
|
1756
|
+
* const agent = new AgentBuilder('compliance-checker')
|
|
1757
|
+
* .withTool('kg.sparql.query')
|
|
1758
|
+
* .withTool('kg.datalog.infer')
|
|
1759
|
+
* .withPlanner('claude-sonnet-4')
|
|
1760
|
+
* .withPolicy({
|
|
1761
|
+
* maxExecutionTime: 30000,
|
|
1762
|
+
* allowedTools: ['kg.sparql.query'],
|
|
1763
|
+
* auditLevel: 'full'
|
|
1764
|
+
* })
|
|
1765
|
+
* .withSandbox({ capabilities: ['ReadKG'], fuelLimit: 1000000 })
|
|
1766
|
+
* .withHook('afterExecute', (data) => console.log(data))
|
|
1767
|
+
* .build()
|
|
1768
|
+
*/
|
|
1769
|
+
class AgentBuilder {
|
|
1770
|
+
constructor(name) {
|
|
1771
|
+
this._name = name
|
|
1772
|
+
this._tools = []
|
|
1773
|
+
this._planner = 'claude-sonnet-4'
|
|
1774
|
+
this._sandbox = { capabilities: ['ReadKG'], fuelLimit: 1000000 }
|
|
1775
|
+
this._hooks = {}
|
|
1776
|
+
this._policy = null
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
/**
|
|
1780
|
+
* Add tool to agent (from TOOL_REGISTRY)
|
|
1781
|
+
* @param {string} toolName - Tool name (e.g., 'kg.sparql.query')
|
|
1782
|
+
* @param {Function} [toolImpl] - Optional custom implementation
|
|
1783
|
+
* @returns {this} - Builder for chaining
|
|
1784
|
+
*/
|
|
1785
|
+
withTool(toolName, toolImpl) {
|
|
1786
|
+
this._tools.push({ name: toolName, impl: toolImpl })
|
|
1787
|
+
return this
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
/**
|
|
1791
|
+
* Set LLM planner model
|
|
1792
|
+
* @param {string} model - Model name (e.g., 'claude-sonnet-4', 'gpt-4o')
|
|
1793
|
+
* @returns {this} - Builder for chaining
|
|
1794
|
+
*/
|
|
1795
|
+
withPlanner(model) {
|
|
1796
|
+
this._planner = model
|
|
1797
|
+
return this
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1800
|
+
/**
|
|
1801
|
+
* Configure WASM sandbox
|
|
1802
|
+
* @param {Object} config - Sandbox configuration
|
|
1803
|
+
* @param {number} [config.maxMemory] - Maximum memory in bytes
|
|
1804
|
+
* @param {number} [config.maxExecTime] - Maximum execution time in ms
|
|
1805
|
+
* @param {string[]} [config.capabilities] - Capabilities: 'ReadKG', 'WriteKG', 'ExecuteTool'
|
|
1806
|
+
* @param {number} [config.fuelLimit] - Fuel limit for operations
|
|
1807
|
+
* @returns {this} - Builder for chaining
|
|
1808
|
+
*/
|
|
1809
|
+
withSandbox(config) {
|
|
1810
|
+
this._sandbox = { ...this._sandbox, ...config }
|
|
1811
|
+
return this
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
/**
|
|
1815
|
+
* Set governance policy
|
|
1816
|
+
* @param {Object} policy - Policy configuration
|
|
1817
|
+
* @param {number} [policy.maxExecutionTime] - Maximum execution time in ms
|
|
1818
|
+
* @param {string[]} [policy.allowedTools] - List of allowed tools
|
|
1819
|
+
* @param {string[]} [policy.deniedTools] - List of denied tools
|
|
1820
|
+
* @param {string} [policy.auditLevel] - Audit level: 'none', 'basic', 'full'
|
|
1821
|
+
* @returns {this} - Builder for chaining
|
|
1822
|
+
*/
|
|
1823
|
+
withPolicy(policy) {
|
|
1824
|
+
this._policy = policy
|
|
1825
|
+
return this
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
/**
|
|
1829
|
+
* Add execution hook
|
|
1830
|
+
* @param {string} event - Event name: 'beforePlan', 'afterPlan', 'beforeExecute', 'afterExecute', 'onError'
|
|
1831
|
+
* @param {Function} handler - Event handler function
|
|
1832
|
+
* @returns {this} - Builder for chaining
|
|
1833
|
+
*/
|
|
1834
|
+
withHook(event, handler) {
|
|
1835
|
+
this._hooks[event] = handler
|
|
1836
|
+
return this
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
/**
|
|
1840
|
+
* Build the composed agent
|
|
1841
|
+
* @returns {ComposedAgent} - Configured agent ready for execution
|
|
1842
|
+
*/
|
|
1843
|
+
build() {
|
|
1844
|
+
// Apply policy restrictions to tools if policy is set
|
|
1845
|
+
let tools = this._tools
|
|
1846
|
+
if (this._policy) {
|
|
1847
|
+
if (this._policy.allowedTools) {
|
|
1848
|
+
tools = tools.filter(t => this._policy.allowedTools.includes(t.name))
|
|
1849
|
+
}
|
|
1850
|
+
if (this._policy.deniedTools) {
|
|
1851
|
+
tools = tools.filter(t => !this._policy.deniedTools.includes(t.name))
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
return new ComposedAgent({
|
|
1856
|
+
name: this._name,
|
|
1857
|
+
tools: tools,
|
|
1858
|
+
planner: this._planner,
|
|
1859
|
+
sandbox: this._sandbox,
|
|
1860
|
+
hooks: this._hooks,
|
|
1861
|
+
policy: this._policy
|
|
1862
|
+
})
|
|
1863
|
+
}
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1372
1866
|
// ============================================================================
|
|
1373
1867
|
// EXPORTS
|
|
1374
1868
|
// ============================================================================
|
|
@@ -1377,6 +1871,14 @@ module.exports = {
|
|
|
1377
1871
|
// Main Agent
|
|
1378
1872
|
HyperMindAgent,
|
|
1379
1873
|
|
|
1874
|
+
// Builder Pattern (v0.6.5+) - Fluent Agent Composition
|
|
1875
|
+
AgentBuilder,
|
|
1876
|
+
ComposedAgent,
|
|
1877
|
+
|
|
1878
|
+
// LLM Planning (v0.6.7+) - Natural Language to Typed Tools
|
|
1879
|
+
LLMPlanner,
|
|
1880
|
+
TOOL_REGISTRY,
|
|
1881
|
+
|
|
1380
1882
|
// Supporting Classes
|
|
1381
1883
|
MemoryManager,
|
|
1382
1884
|
DatalogRuleSet,
|
package/index.js
CHANGED
|
@@ -61,6 +61,14 @@ const {
|
|
|
61
61
|
getHyperMindBenchmarkSuite,
|
|
62
62
|
validateSparqlSyntax,
|
|
63
63
|
createPlanningContext,
|
|
64
|
+
// Builder Pattern (v0.6.5+) - Fluent Agent Composition
|
|
65
|
+
AgentBuilder,
|
|
66
|
+
ComposedAgent,
|
|
67
|
+
// LLM Planning (v0.6.7+) - Natural Language to Typed Tools
|
|
68
|
+
LLMPlanner,
|
|
69
|
+
TOOL_REGISTRY,
|
|
70
|
+
// Type System (v0.6.7+)
|
|
71
|
+
TypeId,
|
|
64
72
|
// Memory Layer (v0.5.13+) - GraphDB-Powered Agent Memory
|
|
65
73
|
AgentState,
|
|
66
74
|
AgentRuntime,
|
|
@@ -73,6 +81,8 @@ const {
|
|
|
73
81
|
GovernanceEngine,
|
|
74
82
|
// Scope Layer (v0.5.13+)
|
|
75
83
|
AgentScope,
|
|
84
|
+
// Sandbox Layer (v0.6.7+)
|
|
85
|
+
WasmSandbox,
|
|
76
86
|
} = require('./hypermind-agent')
|
|
77
87
|
|
|
78
88
|
module.exports = {
|
|
@@ -103,6 +113,14 @@ module.exports = {
|
|
|
103
113
|
getHyperMindBenchmarkSuite,
|
|
104
114
|
validateSparqlSyntax,
|
|
105
115
|
createPlanningContext,
|
|
116
|
+
// Builder Pattern (v0.6.5+) - Fluent Agent Composition
|
|
117
|
+
AgentBuilder,
|
|
118
|
+
ComposedAgent,
|
|
119
|
+
// LLM Planning (v0.6.7+) - Natural Language to Typed Tools
|
|
120
|
+
LLMPlanner,
|
|
121
|
+
TOOL_REGISTRY,
|
|
122
|
+
// Type System (v0.6.7+)
|
|
123
|
+
TypeId,
|
|
106
124
|
// Memory Layer (v0.5.13+) - GraphDB-Powered Agent Memory
|
|
107
125
|
AgentState,
|
|
108
126
|
AgentRuntime,
|
|
@@ -115,4 +133,6 @@ module.exports = {
|
|
|
115
133
|
GovernanceEngine,
|
|
116
134
|
// Scope Layer (v0.5.13+)
|
|
117
135
|
AgentScope,
|
|
136
|
+
// Sandbox Layer (v0.6.7+)
|
|
137
|
+
WasmSandbox,
|
|
118
138
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rust-kgdb",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7",
|
|
4
4
|
"description": "Production-grade Neuro-Symbolic AI Framework with Memory Hypergraph: +86.4% accuracy improvement over vanilla LLMs. High-performance knowledge graph (2.78µs lookups, 35x faster than RDFox). Features Memory Hypergraph (temporal scoring, rolling context window, idempotent responses), fraud detection, underwriting agents, WASM sandbox, type/category/proof theory, and W3C SPARQL 1.1 compliance.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|