@soleri/core 7.0.0 → 8.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/agency/agency-manager.d.ts +27 -1
- package/dist/agency/agency-manager.d.ts.map +1 -1
- package/dist/agency/agency-manager.js +180 -9
- package/dist/agency/agency-manager.js.map +1 -1
- package/dist/agency/default-rules.d.ts +7 -0
- package/dist/agency/default-rules.d.ts.map +1 -0
- package/dist/agency/default-rules.js +79 -0
- package/dist/agency/default-rules.js.map +1 -0
- package/dist/agency/types.d.ts +48 -0
- package/dist/agency/types.d.ts.map +1 -1
- package/dist/brain/brain.d.ts +17 -2
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +118 -8
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/knowledge-synthesizer.d.ts +37 -0
- package/dist/brain/knowledge-synthesizer.d.ts.map +1 -0
- package/dist/brain/knowledge-synthesizer.js +159 -0
- package/dist/brain/knowledge-synthesizer.js.map +1 -0
- package/dist/brain/learning-radar.d.ts +96 -0
- package/dist/brain/learning-radar.d.ts.map +1 -0
- package/dist/brain/learning-radar.js +202 -0
- package/dist/brain/learning-radar.js.map +1 -0
- package/dist/brain/types.d.ts +15 -0
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/context/context-engine.d.ts.map +1 -1
- package/dist/context/context-engine.js +82 -17
- package/dist/context/context-engine.js.map +1 -1
- package/dist/context/types.d.ts +5 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/control/intent-router.d.ts +12 -1
- package/dist/control/intent-router.d.ts.map +1 -1
- package/dist/control/intent-router.js +68 -0
- package/dist/control/intent-router.js.map +1 -1
- package/dist/control/types.d.ts +17 -0
- package/dist/control/types.d.ts.map +1 -1
- package/dist/curator/classifier.d.ts +18 -0
- package/dist/curator/classifier.d.ts.map +1 -0
- package/dist/curator/classifier.js +59 -0
- package/dist/curator/classifier.js.map +1 -0
- package/dist/curator/quality-gate.d.ts +29 -0
- package/dist/curator/quality-gate.d.ts.map +1 -0
- package/dist/curator/quality-gate.js +86 -0
- package/dist/curator/quality-gate.js.map +1 -0
- package/dist/domain-packs/index.d.ts +0 -3
- package/dist/domain-packs/index.d.ts.map +1 -1
- package/dist/domain-packs/index.js +0 -3
- package/dist/domain-packs/index.js.map +1 -1
- package/dist/domain-packs/loader.d.ts.map +1 -1
- package/dist/domain-packs/loader.js +20 -4
- package/dist/domain-packs/loader.js.map +1 -1
- package/dist/domain-packs/pack-runtime.d.ts +5 -5
- package/dist/domain-packs/pack-runtime.d.ts.map +1 -1
- package/dist/domain-packs/pack-runtime.js +2 -2
- package/dist/domain-packs/pack-runtime.js.map +1 -1
- package/dist/domain-packs/types.d.ts +8 -2
- package/dist/domain-packs/types.d.ts.map +1 -1
- package/dist/domain-packs/types.js.map +1 -1
- package/dist/engine/bin/soleri-engine.js +13 -2
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/index.d.ts +2 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +1 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/module-manifest.d.ts +28 -0
- package/dist/engine/module-manifest.d.ts.map +1 -0
- package/dist/engine/module-manifest.js +85 -0
- package/dist/engine/module-manifest.js.map +1 -0
- package/dist/engine/register-engine.d.ts +19 -0
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +15 -2
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/events/event-bus.d.ts +30 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +51 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/flows/chain-runner.d.ts +46 -0
- package/dist/flows/chain-runner.d.ts.map +1 -0
- package/dist/flows/chain-runner.js +271 -0
- package/dist/flows/chain-runner.js.map +1 -0
- package/dist/flows/chain-types.d.ts +103 -0
- package/dist/flows/chain-types.d.ts.map +1 -0
- package/dist/flows/chain-types.js +23 -0
- package/dist/flows/chain-types.js.map +1 -0
- package/dist/health/doctor-checks.d.ts +15 -0
- package/dist/health/doctor-checks.d.ts.map +1 -0
- package/dist/health/doctor-checks.js +98 -0
- package/dist/health/doctor-checks.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/content-classifier.d.ts.map +1 -1
- package/dist/intake/content-classifier.js +0 -2
- package/dist/intake/content-classifier.js.map +1 -1
- package/dist/intake/text-ingester.d.ts +52 -0
- package/dist/intake/text-ingester.d.ts.map +1 -0
- package/dist/intake/text-ingester.js +181 -0
- package/dist/intake/text-ingester.js.map +1 -0
- package/dist/llm/llm-client.d.ts.map +1 -1
- package/dist/llm/llm-client.js +45 -5
- package/dist/llm/llm-client.js.map +1 -1
- package/dist/llm/oauth-discovery.d.ts +18 -0
- package/dist/llm/oauth-discovery.d.ts.map +1 -0
- package/dist/llm/oauth-discovery.js +130 -0
- package/dist/llm/oauth-discovery.js.map +1 -0
- package/dist/llm/types.d.ts +4 -2
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/packs/pack-installer.d.ts +2 -1
- package/dist/packs/pack-installer.d.ts.map +1 -1
- package/dist/packs/pack-installer.js +10 -1
- package/dist/packs/pack-installer.js.map +1 -1
- package/dist/persistence/index.d.ts +0 -1
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +0 -1
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/types.d.ts +2 -6
- package/dist/persistence/types.d.ts.map +1 -1
- package/dist/planning/evidence-collector.d.ts +41 -0
- package/dist/planning/evidence-collector.d.ts.map +1 -0
- package/dist/planning/evidence-collector.js +194 -0
- package/dist/planning/evidence-collector.js.map +1 -0
- package/dist/planning/planner.d.ts +4 -0
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +11 -0
- package/dist/planning/planner.js.map +1 -1
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +4 -0
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/plugin-registry.d.ts +4 -0
- package/dist/plugins/plugin-registry.d.ts.map +1 -1
- package/dist/plugins/plugin-registry.js +4 -0
- package/dist/plugins/plugin-registry.js.map +1 -1
- package/dist/plugins/types.d.ts +32 -27
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/types.js +6 -3
- package/dist/plugins/types.js.map +1 -1
- package/dist/queue/job-queue.d.ts +92 -0
- package/dist/queue/job-queue.d.ts.map +1 -0
- package/dist/queue/job-queue.js +180 -0
- package/dist/queue/job-queue.js.map +1 -0
- package/dist/queue/pipeline-runner.d.ts +62 -0
- package/dist/queue/pipeline-runner.d.ts.map +1 -0
- package/dist/queue/pipeline-runner.js +126 -0
- package/dist/queue/pipeline-runner.js.map +1 -0
- package/dist/runtime/admin-setup-ops.d.ts +20 -0
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -0
- package/dist/runtime/admin-setup-ops.js +583 -0
- package/dist/runtime/admin-setup-ops.js.map +1 -0
- package/dist/runtime/chain-ops.d.ts +9 -0
- package/dist/runtime/chain-ops.d.ts.map +1 -0
- package/dist/runtime/chain-ops.js +107 -0
- package/dist/runtime/chain-ops.js.map +1 -0
- package/dist/runtime/claude-md-helpers.d.ts +56 -0
- package/dist/runtime/claude-md-helpers.d.ts.map +1 -0
- package/dist/runtime/claude-md-helpers.js +160 -0
- package/dist/runtime/claude-md-helpers.js.map +1 -0
- package/dist/runtime/curator-extra-ops.d.ts +3 -2
- package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
- package/dist/runtime/curator-extra-ops.js +81 -3
- package/dist/runtime/curator-extra-ops.js.map +1 -1
- package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
- package/dist/runtime/facades/admin-facade.js +5 -2
- package/dist/runtime/facades/admin-facade.js.map +1 -1
- package/dist/runtime/facades/agency-facade.d.ts.map +1 -1
- package/dist/runtime/facades/agency-facade.js +64 -0
- package/dist/runtime/facades/agency-facade.js.map +1 -1
- package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
- package/dist/runtime/facades/brain-facade.js +122 -1
- package/dist/runtime/facades/brain-facade.js.map +1 -1
- package/dist/runtime/facades/control-facade.d.ts.map +1 -1
- package/dist/runtime/facades/control-facade.js +42 -0
- package/dist/runtime/facades/control-facade.js.map +1 -1
- package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
- package/dist/runtime/facades/memory-facade.js +20 -2
- package/dist/runtime/facades/memory-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +2 -0
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +25 -5
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/intake-ops.d.ts +7 -5
- package/dist/runtime/intake-ops.d.ts.map +1 -1
- package/dist/runtime/intake-ops.js +98 -5
- package/dist/runtime/intake-ops.js.map +1 -1
- package/dist/runtime/memory-extra-ops.d.ts +6 -3
- package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
- package/dist/runtime/memory-extra-ops.js +292 -4
- package/dist/runtime/memory-extra-ops.js.map +1 -1
- package/dist/runtime/pack-ops.d.ts +3 -0
- package/dist/runtime/pack-ops.d.ts.map +1 -1
- package/dist/runtime/pack-ops.js +18 -1
- package/dist/runtime/pack-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js +85 -0
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/playbook-ops.js +1 -1
- package/dist/runtime/playbook-ops.js.map +1 -1
- package/dist/runtime/plugin-ops.d.ts.map +1 -1
- package/dist/runtime/plugin-ops.js +3 -0
- package/dist/runtime/plugin-ops.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +143 -2
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts +23 -0
- package/dist/runtime/session-briefing.d.ts.map +1 -0
- package/dist/runtime/session-briefing.js +154 -0
- package/dist/runtime/session-briefing.js.map +1 -0
- package/dist/runtime/types.d.ts +23 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-linking-ops.d.ts.map +1 -1
- package/dist/runtime/vault-linking-ops.js +3 -7
- package/dist/runtime/vault-linking-ops.js.map +1 -1
- package/dist/vault/vault.d.ts +34 -0
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +89 -3
- package/dist/vault/vault.js.map +1 -1
- package/package.json +6 -4
- package/src/__tests__/admin-setup-ops.test.ts +355 -0
- package/src/__tests__/async-infrastructure.test.ts +307 -0
- package/src/__tests__/cognee-client-gaps.test.ts +6 -2
- package/src/__tests__/cognee-hybrid-search.test.ts +49 -35
- package/src/__tests__/cognee-sync-manager-deep.test.ts +89 -65
- package/src/__tests__/curator-extra-ops.test.ts +6 -2
- package/src/__tests__/curator-pipeline-e2e.test.ts +545 -0
- package/src/__tests__/memory-extra-ops.test.ts +2 -2
- package/src/__tests__/module-manifest-drift.test.ts +59 -0
- package/src/__tests__/planning-extra-ops.test.ts +2 -2
- package/src/__tests__/second-brain-features.test.ts +583 -0
- package/src/agency/agency-manager.ts +217 -9
- package/src/agency/default-rules.ts +83 -0
- package/src/agency/types.ts +61 -0
- package/src/brain/brain.ts +110 -8
- package/src/brain/knowledge-synthesizer.ts +216 -0
- package/src/brain/learning-radar.ts +340 -0
- package/src/brain/types.ts +16 -0
- package/src/context/context-engine.ts +114 -15
- package/src/context/types.ts +5 -0
- package/src/control/intent-router.ts +107 -0
- package/src/control/types.ts +10 -0
- package/src/curator/classifier.ts +86 -0
- package/src/curator/quality-gate.ts +127 -0
- package/src/domain-packs/index.ts +0 -6
- package/src/domain-packs/loader.ts +25 -5
- package/src/domain-packs/pack-runtime.ts +6 -6
- package/src/domain-packs/types.ts +8 -2
- package/src/engine/bin/soleri-engine.ts +18 -2
- package/src/engine/index.ts +2 -0
- package/src/engine/module-manifest.ts +99 -0
- package/src/engine/register-engine.ts +21 -2
- package/src/events/event-bus.ts +58 -0
- package/src/flows/chain-runner.ts +369 -0
- package/src/flows/chain-types.ts +57 -0
- package/src/index.ts +0 -1
- package/src/intake/content-classifier.ts +0 -2
- package/src/intake/text-ingester.ts +234 -0
- package/src/llm/llm-client.ts +50 -7
- package/src/llm/oauth-discovery.ts +151 -0
- package/src/llm/types.ts +4 -2
- package/src/packs/pack-installer.ts +16 -1
- package/src/persistence/index.ts +0 -1
- package/src/persistence/types.ts +2 -6
- package/src/planning/evidence-collector.ts +247 -0
- package/src/planning/planner.ts +11 -0
- package/src/plugins/index.ts +4 -0
- package/src/plugins/plugin-registry.ts +6 -1
- package/src/plugins/types.ts +10 -5
- package/src/queue/job-queue.ts +281 -0
- package/src/queue/pipeline-runner.ts +149 -0
- package/src/runtime/admin-setup-ops.ts +664 -0
- package/src/runtime/chain-ops.ts +121 -0
- package/src/runtime/claude-md-helpers.ts +218 -0
- package/src/runtime/curator-extra-ops.ts +86 -3
- package/src/runtime/facades/admin-facade.ts +5 -2
- package/src/runtime/facades/agency-facade.ts +68 -0
- package/src/runtime/facades/brain-facade.ts +142 -1
- package/src/runtime/facades/control-facade.ts +45 -0
- package/src/runtime/facades/memory-facade.ts +20 -2
- package/src/runtime/facades/plan-facade.ts +2 -0
- package/src/runtime/facades/vault-facade.ts +28 -5
- package/src/runtime/intake-ops.ts +107 -5
- package/src/runtime/memory-extra-ops.ts +312 -4
- package/src/runtime/pack-ops.ts +26 -1
- package/src/runtime/planning-extra-ops.ts +94 -0
- package/src/runtime/playbook-ops.ts +1 -1
- package/src/runtime/plugin-ops.ts +3 -0
- package/src/runtime/runtime.ts +138 -2
- package/src/runtime/session-briefing.ts +175 -0
- package/src/runtime/types.ts +23 -0
- package/src/runtime/vault-linking-ops.ts +3 -7
- package/src/vault/vault.ts +105 -4
- package/src/__tests__/postgres-provider.test.ts +0 -116
- package/src/persistence/postgres-provider.ts +0 -310
|
@@ -8,7 +8,15 @@ import type { OpDefinition } from '../../facades/types.js';
|
|
|
8
8
|
import type { AgentRuntime } from '../types.js';
|
|
9
9
|
|
|
10
10
|
export function createBrainFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
11
|
-
const {
|
|
11
|
+
const {
|
|
12
|
+
brain,
|
|
13
|
+
brainIntelligence,
|
|
14
|
+
llmClient,
|
|
15
|
+
keyPool,
|
|
16
|
+
governance,
|
|
17
|
+
learningRadar,
|
|
18
|
+
knowledgeSynthesizer,
|
|
19
|
+
} = runtime;
|
|
12
20
|
|
|
13
21
|
return [
|
|
14
22
|
// ─── Brain (inline from core-ops.ts) ────────────────────────
|
|
@@ -387,5 +395,138 @@ export function createBrainFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
387
395
|
});
|
|
388
396
|
},
|
|
389
397
|
},
|
|
398
|
+
|
|
399
|
+
// ─── Learning Radar (#208) ────────────────────────────────────
|
|
400
|
+
{
|
|
401
|
+
name: 'radar_analyze',
|
|
402
|
+
description:
|
|
403
|
+
'Analyze a learning signal (correction, search miss, workaround, etc.). ' +
|
|
404
|
+
'High confidence auto-captures silently. Medium queues for review. Low logs only.',
|
|
405
|
+
auth: 'write',
|
|
406
|
+
schema: z.object({
|
|
407
|
+
type: z.enum([
|
|
408
|
+
'correction',
|
|
409
|
+
'search_miss',
|
|
410
|
+
'explicit_capture',
|
|
411
|
+
'pattern_success',
|
|
412
|
+
'workaround',
|
|
413
|
+
'repeated_question',
|
|
414
|
+
]),
|
|
415
|
+
title: z.string().describe('Short title for the detected pattern'),
|
|
416
|
+
description: z.string().describe('What was learned and why it matters'),
|
|
417
|
+
suggestedType: z.enum(['pattern', 'anti-pattern']).optional(),
|
|
418
|
+
confidence: z
|
|
419
|
+
.number()
|
|
420
|
+
.optional()
|
|
421
|
+
.describe('Override confidence (0-1). Default inferred from signal type.'),
|
|
422
|
+
sourceQuery: z.string().optional().describe('Original query that triggered this signal'),
|
|
423
|
+
context: z.string().optional().describe('Additional context'),
|
|
424
|
+
}),
|
|
425
|
+
handler: async (params) => {
|
|
426
|
+
return learningRadar.analyze({
|
|
427
|
+
type: params.type as
|
|
428
|
+
| 'correction'
|
|
429
|
+
| 'search_miss'
|
|
430
|
+
| 'explicit_capture'
|
|
431
|
+
| 'pattern_success'
|
|
432
|
+
| 'workaround'
|
|
433
|
+
| 'repeated_question',
|
|
434
|
+
title: params.title as string,
|
|
435
|
+
description: params.description as string,
|
|
436
|
+
suggestedType: params.suggestedType as 'pattern' | 'anti-pattern' | undefined,
|
|
437
|
+
confidence: params.confidence as number | undefined,
|
|
438
|
+
sourceQuery: params.sourceQuery as string | undefined,
|
|
439
|
+
context: params.context as string | undefined,
|
|
440
|
+
});
|
|
441
|
+
},
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
name: 'radar_candidates',
|
|
445
|
+
description: 'Get pending radar candidates queued for end-of-session review.',
|
|
446
|
+
auth: 'read',
|
|
447
|
+
schema: z.object({
|
|
448
|
+
limit: z.number().optional().default(20),
|
|
449
|
+
}),
|
|
450
|
+
handler: async (params) => {
|
|
451
|
+
return learningRadar.getCandidates(params.limit as number);
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
name: 'radar_approve',
|
|
456
|
+
description: 'Approve a pending radar candidate — captures it to vault.',
|
|
457
|
+
auth: 'write',
|
|
458
|
+
schema: z.object({
|
|
459
|
+
candidateId: z.number().describe('Radar candidate ID to approve'),
|
|
460
|
+
}),
|
|
461
|
+
handler: async (params) => {
|
|
462
|
+
return learningRadar.approve(params.candidateId as number);
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
name: 'radar_dismiss',
|
|
467
|
+
description: 'Dismiss a pending radar candidate — marks it as not worth capturing.',
|
|
468
|
+
auth: 'write',
|
|
469
|
+
schema: z.object({
|
|
470
|
+
candidateId: z.number().describe('Radar candidate ID to dismiss'),
|
|
471
|
+
}),
|
|
472
|
+
handler: async (params) => {
|
|
473
|
+
return learningRadar.dismiss(params.candidateId as number);
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
name: 'radar_flush',
|
|
478
|
+
description:
|
|
479
|
+
'Auto-capture all pending candidates above a confidence threshold. ' +
|
|
480
|
+
'Use at end-of-session to batch-capture high-quality candidates.',
|
|
481
|
+
auth: 'write',
|
|
482
|
+
schema: z.object({
|
|
483
|
+
minConfidence: z
|
|
484
|
+
.number()
|
|
485
|
+
.optional()
|
|
486
|
+
.default(0.8)
|
|
487
|
+
.describe('Minimum confidence to auto-capture (default 0.8)'),
|
|
488
|
+
}),
|
|
489
|
+
handler: async (params) => {
|
|
490
|
+
return learningRadar.flush(params.minConfidence as number);
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
name: 'radar_stats',
|
|
495
|
+
description:
|
|
496
|
+
'Get learning radar statistics — analyzed, captured, queued, dismissed, knowledge gaps.',
|
|
497
|
+
auth: 'read',
|
|
498
|
+
handler: async () => {
|
|
499
|
+
return learningRadar.getStats();
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
|
|
503
|
+
// ─── Knowledge Synthesis (#207) ───────────────────────────────
|
|
504
|
+
{
|
|
505
|
+
name: 'synthesize',
|
|
506
|
+
description:
|
|
507
|
+
'Synthesize vault knowledge into structured content. Searches vault for relevant entries, ' +
|
|
508
|
+
'then uses LLM to produce a brief, outline, talking points, or post draft. ' +
|
|
509
|
+
'Includes source attribution, coverage score, and knowledge gap detection.',
|
|
510
|
+
auth: 'read',
|
|
511
|
+
schema: z.object({
|
|
512
|
+
query: z.string().describe('Topic to synthesize knowledge about'),
|
|
513
|
+
format: z
|
|
514
|
+
.enum(['brief', 'outline', 'talking-points', 'post-draft'])
|
|
515
|
+
.describe('Output format'),
|
|
516
|
+
maxEntries: z.number().optional().default(10).describe('Max vault entries to consult'),
|
|
517
|
+
audience: z
|
|
518
|
+
.enum(['technical', 'executive', 'general'])
|
|
519
|
+
.optional()
|
|
520
|
+
.default('general')
|
|
521
|
+
.describe('Target audience for tone and language'),
|
|
522
|
+
}),
|
|
523
|
+
handler: async (params) => {
|
|
524
|
+
return knowledgeSynthesizer.synthesize(params.query as string, {
|
|
525
|
+
format: params.format as 'brief' | 'outline' | 'talking-points' | 'post-draft',
|
|
526
|
+
maxEntries: params.maxEntries as number,
|
|
527
|
+
audience: params.audience as 'technical' | 'executive' | 'general',
|
|
528
|
+
});
|
|
529
|
+
},
|
|
530
|
+
},
|
|
390
531
|
];
|
|
391
532
|
}
|
|
@@ -275,5 +275,50 @@ export function createControlFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
275
275
|
return governance.getDashboard(params.projectPath as string);
|
|
276
276
|
},
|
|
277
277
|
},
|
|
278
|
+
|
|
279
|
+
// ─── Routing Feedback (#209) ──────────────────────────────────
|
|
280
|
+
{
|
|
281
|
+
name: 'routing_feedback',
|
|
282
|
+
description:
|
|
283
|
+
'Record whether intent routing was correct. Call after a session to track accuracy. ' +
|
|
284
|
+
'Set correction=true if the human had to override the detected intent.',
|
|
285
|
+
auth: 'write',
|
|
286
|
+
schema: z.object({
|
|
287
|
+
initialIntent: z.string().describe('The intent that was originally detected'),
|
|
288
|
+
actualIntent: z.string().describe('The intent that the session actually turned out to be'),
|
|
289
|
+
confidence: z.number().describe('Original confidence score from route_intent'),
|
|
290
|
+
correction: z
|
|
291
|
+
.boolean()
|
|
292
|
+
.optional()
|
|
293
|
+
.default(false)
|
|
294
|
+
.describe('True if human had to correct the routing'),
|
|
295
|
+
routingLogId: z.number().optional().describe('ID from agent_routing_log for linking'),
|
|
296
|
+
}),
|
|
297
|
+
handler: async (params) => {
|
|
298
|
+
return intentRouter.recordRoutingFeedback({
|
|
299
|
+
initialIntent: params.initialIntent as string,
|
|
300
|
+
actualIntent: params.actualIntent as string,
|
|
301
|
+
confidence: params.confidence as number,
|
|
302
|
+
correction: params.correction as boolean,
|
|
303
|
+
routingLogId: params.routingLogId as number | undefined,
|
|
304
|
+
});
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: 'routing_accuracy',
|
|
309
|
+
description:
|
|
310
|
+
'Get routing accuracy report — overall accuracy, common misroutes, confidence calibration per bucket (high/medium/low).',
|
|
311
|
+
auth: 'read',
|
|
312
|
+
schema: z.object({
|
|
313
|
+
periodDays: z
|
|
314
|
+
.number()
|
|
315
|
+
.optional()
|
|
316
|
+
.default(30)
|
|
317
|
+
.describe('Look-back period in days (default: 30)'),
|
|
318
|
+
}),
|
|
319
|
+
handler: async (params) => {
|
|
320
|
+
return intentRouter.getRoutingAccuracy(params.periodDays as number);
|
|
321
|
+
},
|
|
322
|
+
},
|
|
278
323
|
];
|
|
279
324
|
}
|
|
@@ -54,6 +54,11 @@ export function createMemoryFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
54
54
|
topics: (params.topics as string[]) ?? [],
|
|
55
55
|
filesModified: (params.filesModified as string[]) ?? [],
|
|
56
56
|
toolsUsed: (params.toolsUsed as string[]) ?? [],
|
|
57
|
+
intent: null,
|
|
58
|
+
decisions: [],
|
|
59
|
+
currentState: null,
|
|
60
|
+
nextSteps: [],
|
|
61
|
+
vaultEntriesReferenced: [],
|
|
57
62
|
});
|
|
58
63
|
return { captured: true, memory };
|
|
59
64
|
},
|
|
@@ -82,14 +87,22 @@ export function createMemoryFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
82
87
|
{
|
|
83
88
|
name: 'session_capture',
|
|
84
89
|
description:
|
|
85
|
-
'Capture a session summary
|
|
90
|
+
'Capture a session summary. Supports rich format: intent, decisions, currentState, nextSteps, vaultEntriesReferenced.',
|
|
86
91
|
auth: 'write',
|
|
87
92
|
schema: z.object({
|
|
88
93
|
projectPath: z.string().optional().default('.'),
|
|
89
|
-
summary: z.string().describe('Brief summary of what was accomplished
|
|
94
|
+
summary: z.string().describe('Brief summary of what was accomplished'),
|
|
90
95
|
topics: z.array(z.string()).optional().default([]),
|
|
91
96
|
filesModified: z.array(z.string()).optional().default([]),
|
|
92
97
|
toolsUsed: z.array(z.string()).optional().default([]),
|
|
98
|
+
intent: z.string().optional().describe('What the user was trying to accomplish'),
|
|
99
|
+
decisions: z.array(z.string()).optional().describe('Key decisions and rationale'),
|
|
100
|
+
currentState: z.string().optional().describe('Where things stand at capture time'),
|
|
101
|
+
nextSteps: z.array(z.string()).optional().describe('What should happen next session'),
|
|
102
|
+
vaultEntriesReferenced: z
|
|
103
|
+
.array(z.string())
|
|
104
|
+
.optional()
|
|
105
|
+
.describe('Vault entry IDs that informed this session'),
|
|
93
106
|
}),
|
|
94
107
|
handler: async (params) => {
|
|
95
108
|
const { resolve } = await import('node:path');
|
|
@@ -102,6 +115,11 @@ export function createMemoryFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
102
115
|
topics: (params.topics as string[]) ?? [],
|
|
103
116
|
filesModified: (params.filesModified as string[]) ?? [],
|
|
104
117
|
toolsUsed: (params.toolsUsed as string[]) ?? [],
|
|
118
|
+
intent: (params.intent as string) ?? null,
|
|
119
|
+
decisions: (params.decisions as string[]) ?? [],
|
|
120
|
+
currentState: (params.currentState as string) ?? null,
|
|
121
|
+
nextSteps: (params.nextSteps as string[]) ?? [],
|
|
122
|
+
vaultEntriesReferenced: (params.vaultEntriesReferenced as string[]) ?? [],
|
|
105
123
|
});
|
|
106
124
|
return { captured: true, memory, message: 'Session summary saved to memory.' };
|
|
107
125
|
},
|
|
@@ -8,6 +8,7 @@ import type { OpDefinition } from '../../facades/types.js';
|
|
|
8
8
|
import type { AgentRuntime } from '../types.js';
|
|
9
9
|
import { createPlanningExtraOps } from '../planning-extra-ops.js';
|
|
10
10
|
import { createGradingOps } from '../grading-ops.js';
|
|
11
|
+
import { createChainOps } from '../chain-ops.js';
|
|
11
12
|
|
|
12
13
|
export function createPlanFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
13
14
|
const { planner } = runtime;
|
|
@@ -115,5 +116,6 @@ export function createPlanFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
115
116
|
// ─── Satellite ops ───────────────────────────────────────────
|
|
116
117
|
...createPlanningExtraOps(runtime),
|
|
117
118
|
...createGradingOps(runtime),
|
|
119
|
+
...createChainOps(runtime),
|
|
118
120
|
];
|
|
119
121
|
}
|
|
@@ -16,14 +16,14 @@ import { createVaultLinkingOps } from '../vault-linking-ops.js';
|
|
|
16
16
|
import { ObsidianSync } from '../../vault/obsidian-sync.js';
|
|
17
17
|
|
|
18
18
|
export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
19
|
-
const { vault, brain, intakePipeline, vaultManager } = runtime;
|
|
19
|
+
const { vault, brain, intakePipeline, textIngester, vaultManager } = runtime;
|
|
20
20
|
|
|
21
21
|
return [
|
|
22
22
|
// ─── Search / Vault (inline from core-ops.ts) ───────────────
|
|
23
23
|
{
|
|
24
24
|
name: 'search',
|
|
25
25
|
description:
|
|
26
|
-
'Search
|
|
26
|
+
'Search knowledge. mode:"scan" returns lightweight results (titles + scores + snippets) for two-pass retrieval. mode:"full" (default) returns complete entries.',
|
|
27
27
|
auth: 'read',
|
|
28
28
|
schema: z.object({
|
|
29
29
|
query: z.string(),
|
|
@@ -32,15 +32,38 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
32
32
|
severity: z.enum(['critical', 'warning', 'suggestion']).optional(),
|
|
33
33
|
tags: z.array(z.string()).optional(),
|
|
34
34
|
limit: z.number().optional(),
|
|
35
|
+
mode: z
|
|
36
|
+
.enum(['full', 'scan'])
|
|
37
|
+
.optional()
|
|
38
|
+
.default('full')
|
|
39
|
+
.describe(
|
|
40
|
+
'full = complete entries, scan = lightweight titles + scores for two-pass retrieval',
|
|
41
|
+
),
|
|
35
42
|
}),
|
|
36
43
|
handler: async (params) => {
|
|
37
|
-
|
|
44
|
+
const opts = {
|
|
38
45
|
domain: params.domain as string | undefined,
|
|
39
46
|
type: params.type as string | undefined,
|
|
40
47
|
severity: params.severity as string | undefined,
|
|
41
48
|
tags: params.tags as string[] | undefined,
|
|
42
49
|
limit: (params.limit as number) ?? 10,
|
|
43
|
-
}
|
|
50
|
+
};
|
|
51
|
+
if (params.mode === 'scan') {
|
|
52
|
+
return brain.scanSearch(params.query as string, opts);
|
|
53
|
+
}
|
|
54
|
+
return brain.intelligentSearch(params.query as string, opts);
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'load_entries',
|
|
59
|
+
description:
|
|
60
|
+
'Two-pass retrieval — Pass 2: Load full entries by IDs (from a previous scan search).',
|
|
61
|
+
auth: 'read',
|
|
62
|
+
schema: z.object({
|
|
63
|
+
ids: z.array(z.string()).min(1).describe('Entry IDs from a previous scan search'),
|
|
64
|
+
}),
|
|
65
|
+
handler: async (params) => {
|
|
66
|
+
return brain.loadEntries(params.ids as string[]);
|
|
44
67
|
},
|
|
45
68
|
},
|
|
46
69
|
{
|
|
@@ -478,7 +501,7 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
478
501
|
// ─── Satellite ops ───────────────────────────────────────────
|
|
479
502
|
...createVaultExtraOps(runtime),
|
|
480
503
|
...createCaptureOps(runtime),
|
|
481
|
-
...createIntakeOps(intakePipeline),
|
|
504
|
+
...createIntakeOps(intakePipeline, textIngester),
|
|
482
505
|
...createVaultSharingOps(runtime),
|
|
483
506
|
...createVaultLinkingOps(runtime),
|
|
484
507
|
];
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Intake operations —
|
|
2
|
+
* Intake operations — 7 ops for book/PDF and text/URL ingestion.
|
|
3
3
|
*
|
|
4
|
-
* Ops: intake_ingest_book, intake_process, intake_status, intake_preview
|
|
4
|
+
* Ops: intake_ingest_book, intake_process, intake_status, intake_preview,
|
|
5
|
+
* ingest_url, ingest_text, ingest_batch.
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
8
|
import { z } from 'zod';
|
|
8
9
|
import type { OpDefinition } from '../facades/types.js';
|
|
9
10
|
import type { IntakePipeline } from '../intake/intake-pipeline.js';
|
|
11
|
+
import type { TextIngester, IngestSource } from '../intake/text-ingester.js';
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
|
-
* Create the
|
|
14
|
+
* Create the 7 intake operations.
|
|
13
15
|
*
|
|
14
|
-
* The pipeline
|
|
16
|
+
* The pipeline and textIngester are optional — when null, affected ops return a graceful error.
|
|
15
17
|
*/
|
|
16
|
-
export function createIntakeOps(
|
|
18
|
+
export function createIntakeOps(
|
|
19
|
+
pipeline: IntakePipeline | null,
|
|
20
|
+
textIngester?: TextIngester | null,
|
|
21
|
+
): OpDefinition[] {
|
|
17
22
|
return [
|
|
18
23
|
// ─── Ingest Book ──────────────────────────────────────────────
|
|
19
24
|
{
|
|
@@ -122,5 +127,102 @@ export function createIntakeOps(pipeline: IntakePipeline | null): OpDefinition[]
|
|
|
122
127
|
return pipeline.preview({ pdfPath, title, domain }, pageStart, pageEnd);
|
|
123
128
|
},
|
|
124
129
|
},
|
|
130
|
+
|
|
131
|
+
// ─── URL Ingestion (#203) ──────────────────────────────────────
|
|
132
|
+
{
|
|
133
|
+
name: 'ingest_url',
|
|
134
|
+
description:
|
|
135
|
+
'Fetch a URL, extract text, classify into knowledge items via LLM, dedup against vault, and store. ' +
|
|
136
|
+
'Returns count of ingested entries and duplicates skipped.',
|
|
137
|
+
auth: 'write',
|
|
138
|
+
schema: z.object({
|
|
139
|
+
url: z.string().describe('URL to fetch and ingest'),
|
|
140
|
+
domain: z.string().optional().describe('Knowledge domain (default: general)'),
|
|
141
|
+
tags: z.array(z.string()).optional().describe('Additional tags for all extracted entries'),
|
|
142
|
+
}),
|
|
143
|
+
handler: async (params) => {
|
|
144
|
+
if (!textIngester) return { error: 'Text ingester not configured (LLM client required)' };
|
|
145
|
+
return textIngester.ingestUrl(params.url as string, {
|
|
146
|
+
domain: params.domain as string | undefined,
|
|
147
|
+
tags: params.tags as string[] | undefined,
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// ─── Text/Transcript Ingestion (#203) ──────────────────────────
|
|
153
|
+
{
|
|
154
|
+
name: 'ingest_text',
|
|
155
|
+
description:
|
|
156
|
+
'Ingest raw text (article, transcript, notes) — classify via LLM, dedup, and store. ' +
|
|
157
|
+
'Use for transcripts, copied articles, meeting notes, etc.',
|
|
158
|
+
auth: 'write',
|
|
159
|
+
schema: z.object({
|
|
160
|
+
text: z.string().describe('The text content to ingest'),
|
|
161
|
+
title: z.string().describe('Title for the source material'),
|
|
162
|
+
sourceType: z
|
|
163
|
+
.enum(['article', 'transcript', 'notes', 'documentation'])
|
|
164
|
+
.optional()
|
|
165
|
+
.default('notes')
|
|
166
|
+
.describe('Type of source material'),
|
|
167
|
+
url: z.string().optional().describe('Source URL if available'),
|
|
168
|
+
author: z.string().optional().describe('Author of the source material'),
|
|
169
|
+
domain: z.string().optional().describe('Knowledge domain (default: general)'),
|
|
170
|
+
tags: z.array(z.string()).optional().describe('Additional tags'),
|
|
171
|
+
}),
|
|
172
|
+
handler: async (params) => {
|
|
173
|
+
if (!textIngester) return { error: 'Text ingester not configured (LLM client required)' };
|
|
174
|
+
const source: IngestSource = {
|
|
175
|
+
type: params.sourceType as 'article' | 'transcript' | 'notes' | 'documentation',
|
|
176
|
+
title: params.title as string,
|
|
177
|
+
url: params.url as string | undefined,
|
|
178
|
+
author: params.author as string | undefined,
|
|
179
|
+
};
|
|
180
|
+
return textIngester.ingestText(params.text as string, source, {
|
|
181
|
+
domain: params.domain as string | undefined,
|
|
182
|
+
tags: params.tags as string[] | undefined,
|
|
183
|
+
});
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
// ─── Batch Ingestion (#203) ────────────────────────────────────
|
|
188
|
+
{
|
|
189
|
+
name: 'ingest_batch',
|
|
190
|
+
description:
|
|
191
|
+
'Ingest multiple text items in one call. Each item has its own source metadata. Processed sequentially.',
|
|
192
|
+
auth: 'write',
|
|
193
|
+
schema: z.object({
|
|
194
|
+
items: z
|
|
195
|
+
.array(
|
|
196
|
+
z.object({
|
|
197
|
+
text: z.string(),
|
|
198
|
+
title: z.string(),
|
|
199
|
+
sourceType: z.enum(['article', 'transcript', 'notes', 'documentation']).optional(),
|
|
200
|
+
url: z.string().optional(),
|
|
201
|
+
author: z.string().optional(),
|
|
202
|
+
domain: z.string().optional(),
|
|
203
|
+
tags: z.array(z.string()).optional(),
|
|
204
|
+
}),
|
|
205
|
+
)
|
|
206
|
+
.min(1)
|
|
207
|
+
.describe('Array of items to ingest'),
|
|
208
|
+
}),
|
|
209
|
+
handler: async (params) => {
|
|
210
|
+
if (!textIngester) return { error: 'Text ingester not configured (LLM client required)' };
|
|
211
|
+
const items = (params.items as Array<Record<string, unknown>>).map((item) => ({
|
|
212
|
+
text: item.text as string,
|
|
213
|
+
source: {
|
|
214
|
+
type: (item.sourceType as string | undefined) ?? 'notes',
|
|
215
|
+
title: item.title as string,
|
|
216
|
+
url: item.url as string | undefined,
|
|
217
|
+
author: item.author as string | undefined,
|
|
218
|
+
} as IngestSource,
|
|
219
|
+
opts: {
|
|
220
|
+
domain: item.domain as string | undefined,
|
|
221
|
+
tags: item.tags as string[] | undefined,
|
|
222
|
+
},
|
|
223
|
+
}));
|
|
224
|
+
return textIngester.ingestBatch(items);
|
|
225
|
+
},
|
|
226
|
+
},
|
|
125
227
|
];
|
|
126
228
|
}
|