@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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain operations — 5 ops for composable multi-step workflows.
|
|
3
|
+
*
|
|
4
|
+
* Ops: chain_execute, chain_status, chain_resume, chain_list, chain_step_approve
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import type { OpDefinition } from '../facades/types.js';
|
|
9
|
+
import type { AgentRuntime } from './types.js';
|
|
10
|
+
import { chainDefSchema } from '../flows/chain-types.js';
|
|
11
|
+
|
|
12
|
+
export function createChainOps(runtime: AgentRuntime): OpDefinition[] {
|
|
13
|
+
const { chainRunner } = runtime;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Dispatch function that routes op calls to the appropriate facade handler.
|
|
17
|
+
* Looks up the op across all registered facades.
|
|
18
|
+
*/
|
|
19
|
+
const createDispatch = (allOps: OpDefinition[]) => {
|
|
20
|
+
return async (op: string, params: Record<string, unknown>): Promise<unknown> => {
|
|
21
|
+
const opDef = allOps.find((o) => o.name === op);
|
|
22
|
+
if (!opDef) throw new Error(`Unknown op: ${op}`);
|
|
23
|
+
return opDef.handler(params);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// We need access to all ops for dispatch. The plan facade passes them in.
|
|
28
|
+
// For now, store a reference that gets set after facade registration.
|
|
29
|
+
let allOps: OpDefinition[] = [];
|
|
30
|
+
|
|
31
|
+
const ops: OpDefinition[] = [
|
|
32
|
+
{
|
|
33
|
+
name: 'chain_execute',
|
|
34
|
+
description:
|
|
35
|
+
"Execute a multi-step chain workflow. Steps run sequentially, each step's output feeds the next via $variable references. " +
|
|
36
|
+
'Gates (user-approval, auto-test, vault-check) can pause execution.',
|
|
37
|
+
auth: 'write',
|
|
38
|
+
schema: z.object({
|
|
39
|
+
chain: chainDefSchema.describe('Chain definition with steps'),
|
|
40
|
+
input: z
|
|
41
|
+
.record(z.unknown())
|
|
42
|
+
.optional()
|
|
43
|
+
.default({})
|
|
44
|
+
.describe('Initial input params (accessible as $input.*)'),
|
|
45
|
+
startFromStep: z.string().optional().describe('Skip to a specific step ID'),
|
|
46
|
+
}),
|
|
47
|
+
handler: async (params) => {
|
|
48
|
+
const chainDef = params.chain as z.infer<typeof chainDefSchema>;
|
|
49
|
+
const input = (params.input as Record<string, unknown>) ?? {};
|
|
50
|
+
const dispatch = createDispatch(allOps);
|
|
51
|
+
return chainRunner.execute(
|
|
52
|
+
chainDef,
|
|
53
|
+
input,
|
|
54
|
+
dispatch,
|
|
55
|
+
undefined,
|
|
56
|
+
params.startFromStep as string | undefined,
|
|
57
|
+
);
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'chain_status',
|
|
62
|
+
description:
|
|
63
|
+
'Get the current status of a chain instance — steps completed, paused gates, outputs.',
|
|
64
|
+
auth: 'read',
|
|
65
|
+
schema: z.object({
|
|
66
|
+
instanceId: z.string().describe('Chain instance ID'),
|
|
67
|
+
}),
|
|
68
|
+
handler: async (params) => {
|
|
69
|
+
const instance = chainRunner.getInstance(params.instanceId as string);
|
|
70
|
+
if (!instance) return { error: `Chain instance not found: ${params.instanceId}` };
|
|
71
|
+
return instance;
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'chain_resume',
|
|
76
|
+
description: 'Resume a paused chain from where it stopped (after a gate approval).',
|
|
77
|
+
auth: 'write',
|
|
78
|
+
schema: z.object({
|
|
79
|
+
instanceId: z.string().describe('Chain instance ID to resume'),
|
|
80
|
+
chain: chainDefSchema.describe('Chain definition (needed to know remaining steps)'),
|
|
81
|
+
}),
|
|
82
|
+
handler: async (params) => {
|
|
83
|
+
const chainDef = params.chain as z.infer<typeof chainDefSchema>;
|
|
84
|
+
const dispatch = createDispatch(allOps);
|
|
85
|
+
return chainRunner.resume(params.instanceId as string, chainDef, dispatch);
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'chain_list',
|
|
90
|
+
description: 'List all chain instances — running, paused, completed, failed.',
|
|
91
|
+
auth: 'read',
|
|
92
|
+
schema: z.object({
|
|
93
|
+
limit: z.number().optional().default(20),
|
|
94
|
+
}),
|
|
95
|
+
handler: async (params) => {
|
|
96
|
+
return chainRunner.list(params.limit as number);
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'chain_step_approve',
|
|
101
|
+
description: 'Approve a gate-paused step and resume chain execution from the next step.',
|
|
102
|
+
auth: 'write',
|
|
103
|
+
schema: z.object({
|
|
104
|
+
instanceId: z.string().describe('Chain instance ID'),
|
|
105
|
+
chain: chainDefSchema.describe('Chain definition (needed to continue execution)'),
|
|
106
|
+
}),
|
|
107
|
+
handler: async (params) => {
|
|
108
|
+
const chainDef = params.chain as z.infer<typeof chainDefSchema>;
|
|
109
|
+
const dispatch = createDispatch(allOps);
|
|
110
|
+
return chainRunner.approve(params.instanceId as string, chainDef, dispatch);
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
// Expose a setter for wiring all ops after facade registration
|
|
116
|
+
(ops as OpDefinition[] & { _setAllOps: (o: OpDefinition[]) => void })._setAllOps = (o) => {
|
|
117
|
+
allOps = o;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
return ops;
|
|
121
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md injection helpers — marker-based, idempotent section management.
|
|
3
|
+
*
|
|
4
|
+
* Supports injecting agent sections into existing CLAUDE.md files
|
|
5
|
+
* (project-level or global ~/.claude/CLAUDE.md) using HTML comment markers.
|
|
6
|
+
*
|
|
7
|
+
* Marker format: <!-- agent:{agentId}:mode --> ... <!-- /agent:{agentId}:mode -->
|
|
8
|
+
* This allows multiple Soleri agents to coexist in the same CLAUDE.md.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { AgentRuntimeConfig } from './types.js';
|
|
12
|
+
|
|
13
|
+
// ─── Types ────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
export interface AgentSection {
|
|
16
|
+
agentId: string;
|
|
17
|
+
content: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type InjectionPosition = 'start' | 'end' | 'after-title';
|
|
21
|
+
|
|
22
|
+
interface FacadeSummary {
|
|
23
|
+
name: string;
|
|
24
|
+
ops: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ─── Marker Helpers ───────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
function startMarker(agentId: string): string {
|
|
30
|
+
return `<!-- agent:${agentId}:mode -->`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function endMarker(agentId: string): string {
|
|
34
|
+
return `<!-- /agent:${agentId}:mode -->`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if content already has sections for this agent.
|
|
39
|
+
*/
|
|
40
|
+
export function hasSections(content: string, agentId: string): boolean {
|
|
41
|
+
return content.includes(startMarker(agentId)) && content.includes(endMarker(agentId));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Remove existing agent sections from content.
|
|
46
|
+
*/
|
|
47
|
+
export function removeSections(content: string, agentId: string): string {
|
|
48
|
+
const start = startMarker(agentId);
|
|
49
|
+
const end = endMarker(agentId);
|
|
50
|
+
|
|
51
|
+
const startIdx = content.indexOf(start);
|
|
52
|
+
const endIdx = content.indexOf(end);
|
|
53
|
+
|
|
54
|
+
if (startIdx === -1 || endIdx === -1) return content;
|
|
55
|
+
|
|
56
|
+
const before = content.slice(0, startIdx).trimEnd();
|
|
57
|
+
const after = content.slice(endIdx + end.length).trimStart();
|
|
58
|
+
|
|
59
|
+
return before + (after ? '\n\n' + after : '\n');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Inject a section into content at the specified position.
|
|
64
|
+
*/
|
|
65
|
+
export function injectAtPosition(
|
|
66
|
+
content: string,
|
|
67
|
+
section: string,
|
|
68
|
+
position: InjectionPosition,
|
|
69
|
+
): string {
|
|
70
|
+
switch (position) {
|
|
71
|
+
case 'start':
|
|
72
|
+
return section + '\n\n' + content;
|
|
73
|
+
|
|
74
|
+
case 'end':
|
|
75
|
+
return content.trimEnd() + '\n\n' + section + '\n';
|
|
76
|
+
|
|
77
|
+
case 'after-title': {
|
|
78
|
+
const lines = content.split('\n');
|
|
79
|
+
// Find first # heading
|
|
80
|
+
const titleIdx = lines.findIndex((line) => /^#\s/.test(line));
|
|
81
|
+
if (titleIdx === -1) {
|
|
82
|
+
// No title found — prepend
|
|
83
|
+
return section + '\n\n' + content;
|
|
84
|
+
}
|
|
85
|
+
// Insert after title line (and any blank line following it)
|
|
86
|
+
let insertIdx = titleIdx + 1;
|
|
87
|
+
while (insertIdx < lines.length && lines[insertIdx].trim() === '') {
|
|
88
|
+
insertIdx++;
|
|
89
|
+
}
|
|
90
|
+
lines.splice(insertIdx, 0, '', section, '');
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Wrap content in agent markers.
|
|
98
|
+
*/
|
|
99
|
+
export function wrapInMarkers(agentId: string, content: string): string {
|
|
100
|
+
return `${startMarker(agentId)}\n${content}\n${endMarker(agentId)}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ─── Content Composition ──────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Compose agent mode section from runtime config.
|
|
107
|
+
*/
|
|
108
|
+
export function composeAgentModeSection(config: AgentRuntimeConfig): string {
|
|
109
|
+
const { agentId } = config;
|
|
110
|
+
const name = agentId.charAt(0).toUpperCase() + agentId.slice(1);
|
|
111
|
+
|
|
112
|
+
return [
|
|
113
|
+
`## ${name} Mode`,
|
|
114
|
+
'',
|
|
115
|
+
`**Activate:** "Hello, ${name}!" → \`${agentId}_core op:activate params:{ projectPath: "." }\``,
|
|
116
|
+
`**Deactivate:** "Goodbye, ${name}!" → \`${agentId}_core op:activate params:{ deactivate: true }\``,
|
|
117
|
+
'',
|
|
118
|
+
`On activation, adopt the returned persona. Stay in character until deactivated.`,
|
|
119
|
+
].join('\n');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Compose integration section with tools table and session protocol.
|
|
124
|
+
*/
|
|
125
|
+
export function composeIntegrationSection(
|
|
126
|
+
config: AgentRuntimeConfig,
|
|
127
|
+
facades?: FacadeSummary[],
|
|
128
|
+
): string {
|
|
129
|
+
const { agentId } = config;
|
|
130
|
+
const name = agentId.charAt(0).toUpperCase() + agentId.slice(1);
|
|
131
|
+
|
|
132
|
+
const lines: string[] = [
|
|
133
|
+
`## ${name} Integration`,
|
|
134
|
+
'',
|
|
135
|
+
`On session start: \`${agentId}_core op:register params:{ projectPath: "." }\``,
|
|
136
|
+
'',
|
|
137
|
+
'### Essential Tools',
|
|
138
|
+
'',
|
|
139
|
+
'| Facade | Key Ops |',
|
|
140
|
+
'|--------|---------|',
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
if (facades && facades.length > 0) {
|
|
144
|
+
for (const f of facades) {
|
|
145
|
+
const opsStr = f.ops
|
|
146
|
+
.slice(0, 5)
|
|
147
|
+
.map((o) => `\`${o}\``)
|
|
148
|
+
.join(', ');
|
|
149
|
+
const suffix = f.ops.length > 5 ? ', ...' : '';
|
|
150
|
+
lines.push(`| \`${f.name}\` | ${opsStr}${suffix} |`);
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
// Default facade table
|
|
154
|
+
lines.push(
|
|
155
|
+
`| \`${agentId}_vault\` | \`search_intelligent\`, \`capture_knowledge\`, \`capture_quick\` |`,
|
|
156
|
+
);
|
|
157
|
+
lines.push(
|
|
158
|
+
`| \`${agentId}_plan\` | \`create_plan\`, \`approve_plan\`, \`plan_split\`, \`plan_reconcile\` |`,
|
|
159
|
+
);
|
|
160
|
+
lines.push(`| \`${agentId}_brain\` | \`recommend\`, \`strengths\`, \`feedback\` |`);
|
|
161
|
+
lines.push(`| \`${agentId}_memory\` | \`memory_search\`, \`session_capture\` |`);
|
|
162
|
+
lines.push(
|
|
163
|
+
`| \`${agentId}_admin\` | \`admin_health\`, \`admin_tool_list\`, \`admin_setup_global\` |`,
|
|
164
|
+
);
|
|
165
|
+
lines.push(`| \`${agentId}_curator\` | \`curator_groom\`, \`curator_status\` |`);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
lines.push('');
|
|
169
|
+
lines.push(`> Full list: \`${agentId}_admin op:admin_tool_list\``);
|
|
170
|
+
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Build full injection content (mode + integration, wrapped in markers).
|
|
176
|
+
*/
|
|
177
|
+
export function buildInjectionContent(
|
|
178
|
+
config: AgentRuntimeConfig,
|
|
179
|
+
options: { includeIntegration?: boolean; facades?: FacadeSummary[] } = {},
|
|
180
|
+
): string {
|
|
181
|
+
const { includeIntegration = true, facades } = options;
|
|
182
|
+
|
|
183
|
+
const sections = [composeAgentModeSection(config)];
|
|
184
|
+
|
|
185
|
+
if (includeIntegration) {
|
|
186
|
+
sections.push(composeIntegrationSection(config, facades));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return wrapInMarkers(config.agentId, sections.join('\n\n'));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ─── Engine Rules ────────────────────────────────────────────────────
|
|
193
|
+
|
|
194
|
+
const ENGINE_RULES_START = '<!-- soleri:engine-rules -->';
|
|
195
|
+
const ENGINE_RULES_END = '<!-- /soleri:engine-rules -->';
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Check if engine rules are present in content.
|
|
199
|
+
*/
|
|
200
|
+
function hasEngineRules(content: string): boolean {
|
|
201
|
+
return content.includes(ENGINE_RULES_START) && content.includes(ENGINE_RULES_END);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Inject or update engine rules in content.
|
|
206
|
+
*/
|
|
207
|
+
export function injectEngineRulesBlock(content: string, engineRulesContent: string): string {
|
|
208
|
+
if (hasEngineRules(content)) {
|
|
209
|
+
// Replace existing
|
|
210
|
+
const startIdx = content.indexOf(ENGINE_RULES_START);
|
|
211
|
+
const endIdx = content.indexOf(ENGINE_RULES_END);
|
|
212
|
+
const before = content.slice(0, startIdx);
|
|
213
|
+
const after = content.slice(endIdx + ENGINE_RULES_END.length);
|
|
214
|
+
return before + engineRulesContent + after;
|
|
215
|
+
}
|
|
216
|
+
// Append
|
|
217
|
+
return content.trimEnd() + '\n\n' + engineRulesContent + '\n';
|
|
218
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Extra curator operations —
|
|
2
|
+
* Extra curator operations — 8 ops that extend the 8 base curator ops in core-ops.ts.
|
|
3
3
|
*
|
|
4
|
-
* Groups: entry history (2), queue stats (1), metadata enrichment (1), hybrid detection (1)
|
|
4
|
+
* Groups: entry history (2), queue stats (1), metadata enrichment (1), hybrid detection (1),
|
|
5
|
+
* pipeline status (1), schedule start (1), schedule stop (1).
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
8
|
import { z } from 'zod';
|
|
@@ -9,7 +10,8 @@ import type { OpDefinition } from '../facades/types.js';
|
|
|
9
10
|
import type { AgentRuntime } from './types.js';
|
|
10
11
|
|
|
11
12
|
export function createCuratorExtraOps(runtime: AgentRuntime): OpDefinition[] {
|
|
12
|
-
const { curator } = runtime;
|
|
13
|
+
const { curator, jobQueue, pipelineRunner } = runtime;
|
|
14
|
+
let consolidationInterval: ReturnType<typeof setInterval> | null = null;
|
|
13
15
|
|
|
14
16
|
return [
|
|
15
17
|
// ─── Entry History ──────────────────────────────────────────────
|
|
@@ -81,5 +83,86 @@ export function createCuratorExtraOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
81
83
|
return curator.detectContradictionsHybrid(params.threshold as number | undefined);
|
|
82
84
|
},
|
|
83
85
|
},
|
|
86
|
+
|
|
87
|
+
// ─── Pipeline & Scheduling (#210) ────────────────────────────────
|
|
88
|
+
{
|
|
89
|
+
name: 'curator_pipeline_status',
|
|
90
|
+
description:
|
|
91
|
+
'Get job queue and pipeline runner status — pending/running/completed/failed counts, runner state, tick count.',
|
|
92
|
+
auth: 'read',
|
|
93
|
+
handler: async () => {
|
|
94
|
+
return {
|
|
95
|
+
queue: jobQueue.getStats(),
|
|
96
|
+
runner: pipelineRunner.getStatus(),
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'curator_enqueue_pipeline',
|
|
102
|
+
description:
|
|
103
|
+
'Enqueue a processing pipeline for a vault entry — tag-normalize → dedup-check → auto-link. ' +
|
|
104
|
+
'Jobs execute in DAG order via the background pipeline runner.',
|
|
105
|
+
auth: 'write',
|
|
106
|
+
schema: z.object({
|
|
107
|
+
entryId: z.string().describe('Vault entry ID to process'),
|
|
108
|
+
}),
|
|
109
|
+
handler: async (params) => {
|
|
110
|
+
const entryId = params.entryId as string;
|
|
111
|
+
const pipelineId = `pipe-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
112
|
+
const step1 = jobQueue.enqueue('tag-normalize', { entryId, pipelineId });
|
|
113
|
+
const step2 = jobQueue.enqueue('dedup-check', { entryId, pipelineId, dependsOn: [step1] });
|
|
114
|
+
const step3 = jobQueue.enqueue('auto-link', { entryId, pipelineId, dependsOn: [step2] });
|
|
115
|
+
return { pipelineId, jobs: [step1, step2, step3] };
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'curator_schedule_start',
|
|
120
|
+
description:
|
|
121
|
+
'Start periodic consolidation — runs curator.consolidate() at the specified interval. ' +
|
|
122
|
+
'Also starts the pipeline runner for background job processing.',
|
|
123
|
+
auth: 'write',
|
|
124
|
+
schema: z.object({
|
|
125
|
+
intervalMinutes: z
|
|
126
|
+
.number()
|
|
127
|
+
.optional()
|
|
128
|
+
.default(60)
|
|
129
|
+
.describe('Consolidation interval in minutes (default: 60)'),
|
|
130
|
+
}),
|
|
131
|
+
handler: async (params) => {
|
|
132
|
+
const intervalMs = (params.intervalMinutes as number) * 60 * 1000;
|
|
133
|
+
|
|
134
|
+
// Start pipeline runner
|
|
135
|
+
pipelineRunner.start();
|
|
136
|
+
|
|
137
|
+
// Start consolidation scheduler
|
|
138
|
+
if (consolidationInterval) clearInterval(consolidationInterval);
|
|
139
|
+
consolidationInterval = setInterval(() => {
|
|
140
|
+
try {
|
|
141
|
+
curator.consolidate();
|
|
142
|
+
} catch {
|
|
143
|
+
/* best-effort */
|
|
144
|
+
}
|
|
145
|
+
}, intervalMs);
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
started: true,
|
|
149
|
+
pipelineRunner: pipelineRunner.getStatus(),
|
|
150
|
+
consolidationIntervalMs: intervalMs,
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'curator_schedule_stop',
|
|
156
|
+
description: 'Stop periodic consolidation and pipeline runner.',
|
|
157
|
+
auth: 'write',
|
|
158
|
+
handler: async () => {
|
|
159
|
+
pipelineRunner.stop();
|
|
160
|
+
if (consolidationInterval) {
|
|
161
|
+
clearInterval(consolidationInterval);
|
|
162
|
+
consolidationInterval = null;
|
|
163
|
+
}
|
|
164
|
+
return { stopped: true };
|
|
165
|
+
},
|
|
166
|
+
},
|
|
84
167
|
];
|
|
85
168
|
}
|
|
@@ -8,6 +8,8 @@ import type { OpDefinition } from '../../facades/types.js';
|
|
|
8
8
|
import type { AgentRuntime } from '../types.js';
|
|
9
9
|
import { createAdminOps } from '../admin-ops.js';
|
|
10
10
|
import { createAdminExtraOps } from '../admin-extra-ops.js';
|
|
11
|
+
import { createAdminSetupOps } from '../admin-setup-ops.js';
|
|
12
|
+
import { createSessionBriefingOps } from '../session-briefing.js';
|
|
11
13
|
import { createPluginOps } from '../plugin-ops.js';
|
|
12
14
|
import { createPackOps } from '../pack-ops.js';
|
|
13
15
|
import { createTelemetryOps } from '../telemetry-ops.js';
|
|
@@ -56,8 +58,7 @@ export function createAdminFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
56
58
|
}),
|
|
57
59
|
handler: async (params) => {
|
|
58
60
|
return llmClient.complete({
|
|
59
|
-
|
|
60
|
-
model: (params.model as string) ?? '',
|
|
61
|
+
model: (params.model as string) || undefined,
|
|
61
62
|
systemPrompt: params.systemPrompt as string,
|
|
62
63
|
userPrompt: params.userPrompt as string,
|
|
63
64
|
temperature: params.temperature as number | undefined,
|
|
@@ -100,6 +101,8 @@ export function createAdminFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
100
101
|
// ─── Satellite ops ───────────────────────────────────────────
|
|
101
102
|
...createAdminOps(runtime),
|
|
102
103
|
...createAdminExtraOps(runtime),
|
|
104
|
+
...createAdminSetupOps(runtime),
|
|
105
|
+
...createSessionBriefingOps(runtime),
|
|
103
106
|
];
|
|
104
107
|
|
|
105
108
|
// Plugin ops must mutate the same live op array that MCP dispatch reads.
|
|
@@ -107,5 +107,73 @@ export function createAgencyFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
107
107
|
return question ?? { clarificationNeeded: false };
|
|
108
108
|
},
|
|
109
109
|
},
|
|
110
|
+
|
|
111
|
+
// ─── Proactive Intelligence (#211) ─────────────────────────────
|
|
112
|
+
{
|
|
113
|
+
name: 'agency_suggestions',
|
|
114
|
+
description:
|
|
115
|
+
'Evaluate suggestion rules and return triggered proactive suggestions, sorted by priority.',
|
|
116
|
+
auth: 'read',
|
|
117
|
+
handler: async () => agencyManager.generateSuggestions(),
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'agency_rich_clarify',
|
|
121
|
+
description:
|
|
122
|
+
'Generate structured clarification questions with urgency, options, and implications.',
|
|
123
|
+
auth: 'read',
|
|
124
|
+
schema: z.object({
|
|
125
|
+
prompt: z.string().describe('The ambiguous prompt to clarify'),
|
|
126
|
+
}),
|
|
127
|
+
handler: async (params) => agencyManager.generateRichClarification(params.prompt as string),
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'agency_suppress_warning',
|
|
131
|
+
description: 'Suppress a warning by ID — prevents it from appearing in pending warnings.',
|
|
132
|
+
auth: 'write',
|
|
133
|
+
schema: z.object({
|
|
134
|
+
warningId: z.string(),
|
|
135
|
+
}),
|
|
136
|
+
handler: async (params) => {
|
|
137
|
+
agencyManager.suppressWarning(params.warningId as string);
|
|
138
|
+
return { suppressed: true, warningId: params.warningId };
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
name: 'agency_unsuppress_warning',
|
|
143
|
+
description: 'Remove suppression for a warning.',
|
|
144
|
+
auth: 'write',
|
|
145
|
+
schema: z.object({
|
|
146
|
+
warningId: z.string(),
|
|
147
|
+
}),
|
|
148
|
+
handler: async (params) => {
|
|
149
|
+
agencyManager.unsuppressWarning(params.warningId as string);
|
|
150
|
+
return { unsuppressed: true, warningId: params.warningId };
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'agency_dismiss_pattern',
|
|
155
|
+
description: 'Dismiss a surfaced pattern for 24h — prevents re-surfacing.',
|
|
156
|
+
auth: 'write',
|
|
157
|
+
schema: z.object({
|
|
158
|
+
entryId: z.string(),
|
|
159
|
+
}),
|
|
160
|
+
handler: async (params) => {
|
|
161
|
+
agencyManager.dismissPattern(params.entryId as string);
|
|
162
|
+
return { dismissed: true, entryId: params.entryId, ttlHours: 24 };
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'agency_notifications',
|
|
167
|
+
description: 'Drain pending notifications — returns and clears the notification queue.',
|
|
168
|
+
auth: 'read',
|
|
169
|
+
handler: async () => agencyManager.drainNotifications(),
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'agency_full_status',
|
|
173
|
+
description:
|
|
174
|
+
'Full agency status including suggestions, suppressions, dismissals, and notifications.',
|
|
175
|
+
auth: 'read',
|
|
176
|
+
handler: async () => agencyManager.getFullStatus(),
|
|
177
|
+
},
|
|
110
178
|
];
|
|
111
179
|
}
|